openyida 2026.4.14-beta.1 → 2026.4.14

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 (61) hide show
  1. package/bin/yida.js +49 -46
  2. package/lib/app/app-list.js +3 -2
  3. package/lib/app/create-app.js +25 -31
  4. package/lib/app/create-form.js +131 -167
  5. package/lib/app/create-page.js +17 -22
  6. package/lib/app/export-app.js +26 -28
  7. package/lib/app/get-schema.js +23 -34
  8. package/lib/app/import-app.js +42 -52
  9. package/lib/app/publish.js +60 -77
  10. package/lib/app/update-app.js +20 -25
  11. package/lib/app/update-form-config.js +38 -44
  12. package/lib/auth/auth.js +29 -27
  13. package/lib/auth/login.js +33 -31
  14. package/lib/auth/org.js +36 -36
  15. package/lib/auth/qr-login.js +38 -37
  16. package/lib/cdn/cdn-config.js +2 -1
  17. package/lib/cdn/cdn-refresh.js +14 -13
  18. package/lib/cdn/cdn-upload.js +12 -11
  19. package/lib/connector/connector-add-action.js +4 -3
  20. package/lib/connector/connector-create-connection.js +3 -2
  21. package/lib/connector/connector-create.js +9 -8
  22. package/lib/connector/connector-delete-action.js +3 -2
  23. package/lib/connector/connector-delete.js +2 -1
  24. package/lib/connector/connector-detail.js +2 -1
  25. package/lib/connector/connector-gen-template.js +2 -1
  26. package/lib/connector/connector-list-actions.js +2 -1
  27. package/lib/connector/connector-list-connections.js +2 -1
  28. package/lib/connector/connector-parse-api.js +3 -2
  29. package/lib/connector/connector-test.js +5 -4
  30. package/lib/conversation/collector.js +9 -8
  31. package/lib/conversation/export-conversation.js +17 -20
  32. package/lib/core/chalk.js +344 -0
  33. package/lib/core/check-data.js +9 -7
  34. package/lib/core/check-update.js +2 -1
  35. package/lib/core/copy.js +22 -25
  36. package/lib/core/doctor.js +20 -15
  37. package/lib/core/env-cmd.js +19 -18
  38. package/lib/core/env.js +34 -36
  39. package/lib/core/query-data.js +3 -1
  40. package/lib/core/sample.js +13 -18
  41. package/lib/core/task-center.js +4 -3
  42. package/lib/core/update.js +2 -1
  43. package/lib/core/utils.js +9 -8
  44. package/lib/db/db-seq-fix.js +11 -10
  45. package/lib/dws/dws-wrapper.js +6 -5
  46. package/lib/flash-note/flash-to-prd.js +45 -44
  47. package/lib/integration/integration-create.js +71 -70
  48. package/lib/page-config/get-page-config.js +17 -21
  49. package/lib/page-config/save-share-config.js +30 -35
  50. package/lib/page-config/verify-short-url.js +29 -34
  51. package/lib/permission/get-permission.js +20 -19
  52. package/lib/permission/save-permission.js +50 -49
  53. package/lib/process/configure-process.js +46 -45
  54. package/lib/process/create-process.js +48 -47
  55. package/lib/process/preview-process.js +12 -11
  56. package/lib/report/append.js +42 -41
  57. package/lib/report/chart-builder.js +9 -8
  58. package/lib/report/create-report.js +2 -1
  59. package/lib/report/index.js +45 -43
  60. package/package.json +1 -1
  61. package/yida-skills/SKILL.md +1 -1
package/bin/yida.js CHANGED
@@ -60,6 +60,7 @@
60
60
  const { checkUpdate } = require('../lib/core/check-update');
61
61
  const { version: currentVersion } = require('../package.json');
62
62
  const { t } = require('../lib/core/i18n');
63
+ const { warn, fail } = require('../lib/core/chalk');
63
64
 
64
65
  // 异步检查更新,fire-and-forget,不阻塞主流程
65
66
  const updateCheckPromise = checkUpdate(currentVersion);
@@ -95,6 +96,7 @@ function printHelp() {
95
96
  console.log('');
96
97
  console.log(` ${BOLD}${CYAN}OpenYida${RESET} ${DIM}v${currentVersion}${RESET}`);
97
98
  console.log(` ${DIM}${t('help.subtitle')}${RESET}`);
99
+ console.log(` ${DIM}"We are on the verge of the Singularity"${RESET}`);
98
100
  console.log('');
99
101
  console.log(` ${YELLOW}${t('help.usage')}${RESET} openyida <command> [args...]`);
100
102
  console.log(` ${DIM}${t('help.alias')}${RESET} yida`);
@@ -186,8 +188,9 @@ function printHelp() {
186
188
  console.log(` ${DIM}${RESET} openyida login`);
187
189
  console.log(` ${DIM}${RESET} openyida create-app "${t('help.quickstart_app_name')}"`);
188
190
  console.log(` ${DIM}${RESET} openyida create-form create APP_XXX "${t('help.quickstart_form_name')}" fields.json`);
191
+ console.log(` ${DIM}${RESET} openyida dws contact user search --keyword "张三"`);
189
192
  console.log('');
190
- console.log(` ${DIM}${t('help.docs')} https://github.com/openyida/openyida${RESET}`);
193
+ console.log(` ${DIM}${t('help.docs')} https://openyida.ai · https://github.com/openyida/openyida${RESET}`);
191
194
  console.log('');
192
195
  }
193
196
 
@@ -323,8 +326,8 @@ async function main() {
323
326
  } else if (subCommand === 'logout') {
324
327
  authLogout();
325
328
  } else {
326
- console.error(t('cli.auth_usage'));
327
- console.error(t('cli.auth_example'));
329
+ warn(t('cli.auth_usage'));
330
+ warn(t('cli.auth_example'));
328
331
  process.exit(1);
329
332
  }
330
333
  break;
@@ -338,14 +341,14 @@ async function main() {
338
341
  if (subCommand === 'list') {
339
342
  const cookieData = loadCookieData();
340
343
  if (!cookieData || !cookieData.cookies) {
341
- console.error(t('org.no_login'));
344
+ warn(t('org.no_login'));
342
345
  process.exit(1);
343
346
  }
344
347
  await listOrganizations(cookieData);
345
348
  } else if (subCommand === 'switch') {
346
349
  const cookieData = loadCookieData();
347
350
  if (!cookieData || !cookieData.cookies) {
348
- console.error(t('org.no_login'));
351
+ warn(t('org.no_login'));
349
352
  process.exit(1);
350
353
  }
351
354
 
@@ -359,8 +362,8 @@ async function main() {
359
362
  await interactiveSwitch(cookieData);
360
363
  }
361
364
  } else {
362
- console.error(t('cli.org_usage'));
363
- console.error(t('cli.org_example'));
365
+ warn(t('cli.org_usage'));
366
+ warn(t('cli.org_example'));
364
367
  process.exit(1);
365
368
  }
366
369
  break;
@@ -397,8 +400,8 @@ async function main() {
397
400
  const skipLint = args.includes('--skip-lint');
398
401
  const filteredArgs = args.filter(arg => arg !== '--skip-lint');
399
402
  if (filteredArgs.length < 3) {
400
- console.error(t('cli.publish_usage'));
401
- console.error(t('cli.publish_example'));
403
+ warn(t('cli.publish_usage'));
404
+ warn(t('cli.publish_example'));
402
405
  process.exit(1);
403
406
  }
404
407
  const [sourceFile, appType, formUuid] = filteredArgs;
@@ -414,8 +417,8 @@ async function main() {
414
417
 
415
418
  case 'verify-short-url': {
416
419
  if (args.length < 3) {
417
- console.error(t('cli.verify_usage'));
418
- console.error(t('cli.verify_example'));
420
+ warn(t('cli.verify_usage'));
421
+ warn(t('cli.verify_example'));
419
422
  process.exit(1);
420
423
  }
421
424
  process.argv = [process.argv[0], process.argv[1], ...args];
@@ -425,8 +428,8 @@ async function main() {
425
428
 
426
429
  case 'save-share-config': {
427
430
  if (args.length < 4) {
428
- console.error(t('cli.share_usage'));
429
- console.error(t('cli.share_example'));
431
+ warn(t('cli.share_usage'));
432
+ warn(t('cli.share_example'));
430
433
  process.exit(1);
431
434
  }
432
435
  process.argv = [process.argv[0], process.argv[1], ...args];
@@ -436,8 +439,8 @@ async function main() {
436
439
 
437
440
  case 'get-page-config': {
438
441
  if (args.length < 2) {
439
- console.error(t('cli.page_config_usage'));
440
- console.error(t('cli.page_config_example'));
442
+ warn(t('cli.page_config_usage'));
443
+ warn(t('cli.page_config_example'));
441
444
  process.exit(1);
442
445
  }
443
446
  process.argv = [process.argv[0], process.argv[1], ...args];
@@ -447,8 +450,8 @@ async function main() {
447
450
 
448
451
  case 'update-form-config': {
449
452
  if (args.length < 4) {
450
- console.error(t('cli.form_config_usage'));
451
- console.error(t('cli.form_config_example'));
453
+ warn(t('cli.form_config_usage'));
454
+ warn(t('cli.form_config_example'));
452
455
  process.exit(1);
453
456
  }
454
457
  process.argv = [process.argv[0], process.argv[1], ...args];
@@ -458,8 +461,8 @@ async function main() {
458
461
 
459
462
  case 'update-app': {
460
463
  if (args.length < 2) {
461
- console.error(t('cli.update_app_usage'));
462
- console.error(t('cli.update_app_example'));
464
+ warn(t('cli.update_app_usage'));
465
+ warn(t('cli.update_app_example'));
463
466
  process.exit(1);
464
467
  }
465
468
  const { run: runUpdateApp } = require('../lib/app/update-app');
@@ -469,8 +472,8 @@ async function main() {
469
472
 
470
473
  case 'data': {
471
474
  if (args.length < 2) {
472
- console.error('用法: openyida data <action> <resource> [args] [options]');
473
- console.error('示例: openyida data query form APP_XXX FORM_XXX --page 1 --size 20');
475
+ warn('用法: openyida data <action> <resource> [args] [options]');
476
+ warn('示例: openyida data query form APP_XXX FORM_XXX --page 1 --size 20');
474
477
  process.exit(1);
475
478
  }
476
479
  const { run: runDataManagement } = require('../lib/core/query-data');
@@ -486,9 +489,9 @@ async function main() {
486
489
 
487
490
  case 'export': {
488
491
  if (args.length < 1) {
489
- console.error(t('cli.export_usage'));
490
- console.error(t('cli.export_example1'));
491
- console.error(t('cli.export_example2'));
492
+ warn(t('cli.export_usage'));
493
+ warn(t('cli.export_example1'));
494
+ warn(t('cli.export_example2'));
492
495
  process.exit(1);
493
496
  }
494
497
  const { run: runExport } = require('../lib/app/export-app');
@@ -498,9 +501,9 @@ async function main() {
498
501
 
499
502
  case 'import': {
500
503
  if (args.length < 1) {
501
- console.error(t('cli.import_usage'));
502
- console.error(t('cli.import_example1'));
503
- console.error(t('cli.import_example2'));
504
+ warn(t('cli.import_usage'));
505
+ warn(t('cli.import_example1'));
506
+ warn(t('cli.import_example2'));
504
507
  process.exit(1);
505
508
  }
506
509
  const { run: runImport } = require('../lib/app/import-app');
@@ -510,8 +513,8 @@ async function main() {
510
513
 
511
514
  case 'get-permission': {
512
515
  if (args.length < 2) {
513
- console.error(t('cli.get_permission_usage'));
514
- console.error(t('cli.get_permission_example'));
516
+ warn(t('cli.get_permission_usage'));
517
+ warn(t('cli.get_permission_example'));
515
518
  process.exit(1);
516
519
  }
517
520
  const { run: runGetPermission } = require('../lib/permission/get-permission');
@@ -521,8 +524,8 @@ async function main() {
521
524
 
522
525
  case 'save-permission': {
523
526
  if (args.length < 2) {
524
- console.error(t('cli.save_permission_usage'));
525
- console.error(t('cli.save_permission_example'));
527
+ warn(t('cli.save_permission_usage'));
528
+ warn(t('cli.save_permission_example'));
526
529
  process.exit(1);
527
530
  }
528
531
  const { run: runSavePermission } = require('../lib/permission/save-permission');
@@ -532,8 +535,8 @@ async function main() {
532
535
 
533
536
  case 'configure-process': {
534
537
  if (args.length < 3) {
535
- console.error(t('cli.configure_process_usage'));
536
- console.error(t('cli.configure_process_example'));
538
+ warn(t('cli.configure_process_usage'));
539
+ warn(t('cli.configure_process_example'));
537
540
  process.exit(1);
538
541
  }
539
542
  const { run: runConfigureProcess } = require('../lib/process/configure-process');
@@ -543,8 +546,8 @@ async function main() {
543
546
 
544
547
  case 'create-process': {
545
548
  if (args.length < 2) {
546
- console.error(t('cli.create_process_usage'));
547
- console.error(t('cli.create_process_example'));
549
+ warn(t('cli.create_process_usage'));
550
+ warn(t('cli.create_process_example'));
548
551
  process.exit(1);
549
552
  }
550
553
  const { run: runCreateProcess } = require('../lib/process/create-process');
@@ -558,14 +561,14 @@ async function main() {
558
561
 
559
562
  if (subCommand === 'preview') {
560
563
  if (subArgs.length < 2) {
561
- console.error(t('cli.process_preview_usage'));
562
- console.error(t('cli.process_preview_example'));
564
+ warn(t('cli.process_preview_usage'));
565
+ warn(t('cli.process_preview_example'));
563
566
  process.exit(1);
564
567
  }
565
568
  const { run: runPreviewProcess } = require('../lib/process/preview-process');
566
569
  await runPreviewProcess(subArgs);
567
570
  } else {
568
- console.error(t('cli.process_usage'));
571
+ warn(t('cli.process_usage'));
569
572
  process.exit(1);
570
573
  }
571
574
  break;
@@ -647,8 +650,8 @@ async function main() {
647
650
 
648
651
  const modulePath = connectorSubCommands[subCommand];
649
652
  if (!modulePath) {
650
- console.error(`未知的 connector 子命令: ${subCommand}`);
651
- console.error('使用 openyida connector --help 查看可用子命令');
653
+ warn(`未知的 connector 子命令: ${subCommand}`);
654
+ warn('使用 openyida connector --help 查看可用子命令');
652
655
  process.exit(1);
653
656
  }
654
657
 
@@ -668,7 +671,7 @@ async function main() {
668
671
  const subArgs = args.slice(1); // 路由层消费 subCommand,传递剩余参数
669
672
 
670
673
  if (!subCommand || subCommand === '--help' || subCommand === '-h') {
671
- console.error(t('cli.integration_help'));
674
+ warn(t('cli.integration_help'));
672
675
  break;
673
676
  }
674
677
 
@@ -676,8 +679,8 @@ async function main() {
676
679
  const { run: runIntegration } = require('../lib/integration/integration-create');
677
680
  await runIntegration(subArgs);
678
681
  } else {
679
- console.error(t('cli.integration_unknown', subCommand));
680
- console.error(t('cli.integration_help_hint'));
682
+ warn(t('cli.integration_unknown', subCommand));
683
+ warn(t('cli.integration_help_hint'));
681
684
  process.exit(1);
682
685
  }
683
686
  break;
@@ -720,8 +723,8 @@ async function main() {
720
723
  }
721
724
 
722
725
  default: {
723
- console.error(t('cli.unknown_command', command));
724
- console.error(t('cli.run_help'));
726
+ warn(t('cli.unknown_command', command));
727
+ warn(t('cli.run_help'));
725
728
  process.exit(1);
726
729
  }
727
730
  }
@@ -730,6 +733,6 @@ async function main() {
730
733
  main()
731
734
  .then(() => updateCheckPromise)
732
735
  .catch((err) => {
733
- console.error(t('cli.exec_failed', err.message));
736
+ warn(t('cli.exec_failed', err.message));
734
737
  process.exit(1);
735
738
  });
@@ -124,9 +124,10 @@ async function run(args) {
124
124
  console.log(JSON.stringify(formattedApps, null, 2));
125
125
 
126
126
  // stderr 输出人类可读摘要
127
- console.error(`\n共找到 ${formattedApps.length} 个应用:`);
127
+ const { c, success: chalkSuccess, listItem } = require('../core/chalk');
128
+ chalkSuccess(`共找到 ${c.cyan}${formattedApps.length}${c.reset} 个应用`);
128
129
  for (const app of formattedApps) {
129
- console.error(` • ${app.appName} [${app.appType}] ${app.systemLink}`);
130
+ listItem(`${c.bold}${app.appName}${c.reset} ${c.dim}[${app.appType}]${c.reset} ${c.cyan}${app.systemLink}${c.reset}`);
130
131
  }
131
132
  }
132
133
 
@@ -38,7 +38,8 @@ function findPrdFile() {
38
38
 
39
39
  function updatePrdCorpId(prdFilePath, corpId, appType, baseUrl) {
40
40
  if (!prdFilePath || !fs.existsSync(prdFilePath)) {
41
- console.error(t('create_app.prd_not_found'));
41
+ const { warn: chalkWarn } = require('../core/chalk');
42
+ chalkWarn(t('create_app.prd_not_found'));
42
43
  return false;
43
44
  }
44
45
 
@@ -68,10 +69,12 @@ function updatePrdCorpId(prdFilePath, corpId, appType, baseUrl) {
68
69
  }
69
70
 
70
71
  fs.writeFileSync(prdFilePath, content, 'utf-8');
71
- console.error(t('create_app.prd_updated', path.basename(prdFilePath)));
72
+ const { success: prdSuccess } = require('../core/chalk');
73
+ prdSuccess(t('create_app.prd_updated', path.basename(prdFilePath)));
72
74
  return true;
73
75
  } catch (err) {
74
- console.error(t('create_app.prd_update_failed', err.message));
76
+ const { warn: prdWarn } = require('../core/chalk');
77
+ prdWarn(t('create_app.prd_update_failed', err.message));
75
78
  return false;
76
79
  }
77
80
  }
@@ -80,13 +83,8 @@ function updatePrdCorpId(prdFilePath, corpId, appType, baseUrl) {
80
83
 
81
84
  async function run(args) {
82
85
  if (args.length < 1) {
83
- console.error(t('create_app.usage'));
84
- console.error(t('create_app.example'));
85
- console.error(t('create_app.available_icons'));
86
- console.error(t('create_app.icons_list'));
87
- console.error(t('create_app.available_colors'));
88
- console.error(t('create_app.colors_list'));
89
- process.exit(1);
86
+ const { error: chalkError } = require('../core/chalk');
87
+ chalkError(t('create_app.usage'), { hint: `${t('create_app.example')}\n ${t('create_app.available_icons')}\n ${t('create_app.icons_list')}\n ${t('create_app.available_colors')}\n ${t('create_app.colors_list')}` });
90
88
  }
91
89
 
92
90
  const appName = args[0];
@@ -97,20 +95,19 @@ async function run(args) {
97
95
  const navTheme = args[5] || 'dark';
98
96
  const layoutDirection = args[6] || 'slide';
99
97
 
100
- const SEP = '='.repeat(50);
101
- console.error(SEP);
102
- console.error(t('create_app.title'));
103
- console.error(SEP);
104
- console.error(t('create_app.app_name', appName));
105
- console.error(t('create_app.app_desc', description));
106
- console.error(t('create_app.app_icon', icon, iconColor));
107
- console.error(t('create_app.app_theme', colour, navTheme, layoutDirection));
98
+ const { c, banner, step, label, info, success: chalkSuccess, fail: chalkFail, result: chalkResult, sep } = require('../core/chalk');
99
+
100
+ banner(t('create_app.title'));
101
+ label('Name', appName);
102
+ label('Desc', description);
103
+ label('Icon', `${icon} ${c.dim}(${iconColor})${c.reset}`);
104
+ label('Theme', `${colour} / ${navTheme} / ${layoutDirection}`);
108
105
 
109
106
  // Step 1: 读取登录态
110
- console.error(t('common.step_login', 1));
107
+ step(1, t('common.step_login', 1));
111
108
  let cookieData = loadCookieData();
112
109
  if (!cookieData) {
113
- console.error(t('common.login_no_cache'));
110
+ info(t('common.login_no_cache'));
114
111
  cookieData = triggerLogin();
115
112
  }
116
113
 
@@ -120,10 +117,10 @@ async function run(args) {
120
117
  baseUrl: resolveBaseUrl(cookieData),
121
118
  cookieData,
122
119
  };
123
- console.error(t('common.login_ready', authRef.baseUrl));
120
+ chalkSuccess(t('common.login_ready', authRef.baseUrl));
124
121
 
125
122
  // Step 2: 创建应用
126
- console.error(t('create_app.step_create'));
123
+ step(2, t('create_app.step_create'));
127
124
 
128
125
  // 查询企业专属域名配置,动态决定 openExclusive / openPhysicColumn 参数
129
126
  // 避免在开启了专属数据库策略的企业中硬编码 "n" 导致创建失败
@@ -166,18 +163,16 @@ async function run(args) {
166
163
  }, authRef);
167
164
 
168
165
  // 输出结果
169
- const SEP2 = '='.repeat(50);
170
- console.error('\n' + SEP2);
171
166
  if (response && response.success && response.content) {
172
167
  const appType = response.content;
173
168
  const appUrl = `${authRef.baseUrl}/${appType}/admin`;
174
169
  const corpId = authRef.cookieData.corp_id || '';
175
170
 
176
- console.error(t('create_app.success'));
177
- console.error(t('create_app.app_type_label', appType));
178
- console.error(t('create_app.corp_id_label', corpId || t('common.unknown_error')));
179
- console.error(t('create_app.url_label', appUrl));
180
- console.error(SEP2);
171
+ chalkResult(true, t('create_app.success'), [
172
+ ['appType', appType],
173
+ ['Corp ID', corpId || t('common.unknown_error')],
174
+ ['URL', `${c.cyan}${appUrl}${c.reset}`],
175
+ ]);
181
176
 
182
177
  const prdFile = findPrdFile();
183
178
  if (prdFile) {updatePrdCorpId(prdFile, corpId, appType, authRef.baseUrl);}
@@ -185,8 +180,7 @@ async function run(args) {
185
180
  console.log(JSON.stringify({ success: true, appType, appName, corpId, url: appUrl }));
186
181
  } else {
187
182
  const errorMsg = response ? response.errorMsg || t('common.unknown_error') : t('common.request_failed');
188
- console.error(t('create_app.failed', errorMsg));
189
- console.error(SEP2);
183
+ chalkResult(false, t('create_app.failed', errorMsg));
190
184
  console.log(JSON.stringify({ success: false, error: errorMsg }));
191
185
  process.exit(1);
192
186
  }