@cannbot-ai/install-helper 0.0.2-beta.14 → 0.0.2-beta.15

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.
package/dist/index.js CHANGED
@@ -282,7 +282,38 @@ var zh_CN = {
282
282
  wizard_step_4_skill_title: "[4/4] \u9009\u62E9\u8981\u5B89\u88C5\u7684 Skills \u2014 {category}",
283
283
  install_level_project: "\u5B89\u88C5\u5230\u5F53\u524D\u76EE\u5F55\uFF08\u63A8\u8350\uFF0C\u4EC5\u5F53\u524D\u9879\u76EE\u53EF\u7528\uFF09",
284
284
  install_level_global: "\u5B89\u88C5\u5230\u5168\u5C40\uFF08\u6240\u6709\u9879\u76EE\u5171\u4EAB\uFF09",
285
- wizard_select_mode_title: "\u9009\u62E9\u5B89\u88C5\u7C7B\u578B"
285
+ wizard_select_mode_title: "\u9009\u62E9\u5B89\u88C5\u7C7B\u578B",
286
+ skill_count_format: "{count} \u4E2A Skills",
287
+ result_success_format: "{count} \u6210\u529F",
288
+ result_failed_format: "{count} \u5931\u8D25",
289
+ uninstall_remove_label: "\u79FB\u9664",
290
+ uninstall_remove_file_format: "\u79FB\u9664 {count} \u4E2A\u6587\u4EF6",
291
+ uninstall_remove_dir_format: "{count} \u4E2A\u76EE\u5F55",
292
+ uninstall_clean_empty_dir: "\u6E05\u7406\u7A7A\u76EE\u5F55",
293
+ uninstall_skill_not_installed: "\u672A\u5B89\u88C5",
294
+ available_plugins: "\u53EF\u7528\u63D2\u4EF6",
295
+ available_skills: "\u53EF\u7528 Skills",
296
+ skill_total_count: "\u5171 {count} \u4E2A Skills",
297
+ wizard_confirm_install_format: "\u5373\u5C06\u5B89\u88C5 {count} \u4E2A\u63D2\u4EF6\u5230 {tool}\uFF08{level} \u7EA7\u522B\uFF09\uFF1A",
298
+ wizard_install_path: "\u5B89\u88C5\u8DEF\u5F84",
299
+ update_install_hint: "\u4F7F\u7528 {cmd} \u5B89\u88C5\u63D2\u4EF6",
300
+ hint_select_move: "\u79FB\u52A8",
301
+ hint_select_space: "\u7A7A\u683C",
302
+ hint_select_check: "\u52FE\u9009",
303
+ hint_select_confirm: "\u786E\u8BA4",
304
+ hint_checkbox_suffix: "\u4E0D\u9009\u6309\u56DE\u8F66\u53EF\u8FD4\u56DE",
305
+ doctor_not_installed: "\u672A\u5B89\u88C5",
306
+ doctor_links_valid: "{count} \u4E2A\u8F6F\u94FE\u63A5\u5747\u6709\u6548",
307
+ doctor_broken_links: "{count} \u4E2A\u5931\u6548\u94FE\u63A5",
308
+ doctor_fixed: "\u5DF2\u6E05\u7406 {count} \u4E2A\u5931\u6548\u94FE\u63A5",
309
+ doctor_not_exist: "\u4E0D\u5B58\u5728",
310
+ doctor_created: "\u5DF2\u521B\u5EFA {path}",
311
+ doctor_config_exists: "\u5B58\u5728",
312
+ doctor_config_not_exist: "\u4E0D\u5B58\u5728",
313
+ doctor_result_with_fix: "{warnings} \u4E2A\u8B66\u544A, {errors} \u4E2A\u9519\u8BEF, {fixes} \u9879\u5DF2\u4FEE\u590D",
314
+ doctor_result_without_fix: "{warnings} \u4E2A\u8B66\u544A, {errors} \u4E2A\u9519\u8BEF",
315
+ count_suffix: "\u4E2A",
316
+ try_prompt: "\u5E2E\u6211\u5F00\u53D1\u4E00\u4E2A Abs \u7B97\u5B50"
286
317
  };
287
318
  var en_US = {
288
319
  wizard_title: "CANNBot Install Helper",
@@ -419,7 +450,38 @@ var en_US = {
419
450
  wizard_step_4_skill_title: "[4/4] Select Skills to install \u2014 {category}",
420
451
  install_level_project: "Install to current directory (recommended, current project only)",
421
452
  install_level_global: "Install globally (all projects)",
422
- wizard_select_mode_title: "Select installation type"
453
+ wizard_select_mode_title: "Select installation type",
454
+ skill_count_format: "{count} Skills",
455
+ result_success_format: "{count} succeeded",
456
+ result_failed_format: "{count} failed",
457
+ uninstall_remove_label: "Removed",
458
+ uninstall_remove_file_format: "Removed {count} files",
459
+ uninstall_remove_dir_format: "{count} directories",
460
+ uninstall_clean_empty_dir: "Cleaned empty directory",
461
+ uninstall_skill_not_installed: "Not installed",
462
+ available_plugins: "Available plugins",
463
+ available_skills: "Available Skills",
464
+ skill_total_count: "Total {count} Skills",
465
+ wizard_confirm_install_format: "About to install {count} plugins to {tool} ({level} level):",
466
+ wizard_install_path: "Install path",
467
+ update_install_hint: "Use {cmd} to install plugins",
468
+ hint_select_move: "Navigate",
469
+ hint_select_space: "Space",
470
+ hint_select_check: "Toggle",
471
+ hint_select_confirm: "Confirm",
472
+ hint_checkbox_suffix: "Press enter without selection to go back",
473
+ doctor_not_installed: "Not installed",
474
+ doctor_links_valid: "{count} symlinks all valid",
475
+ doctor_broken_links: "{count} broken links",
476
+ doctor_fixed: "Cleaned {count} broken links",
477
+ doctor_not_exist: "Does not exist",
478
+ doctor_created: "Created {path}",
479
+ doctor_config_exists: "Exists",
480
+ doctor_config_not_exist: "Does not exist",
481
+ doctor_result_with_fix: "{warnings} warnings, {errors} errors, {fixes} fixed",
482
+ doctor_result_without_fix: "{warnings} warnings, {errors} errors",
483
+ count_suffix: "",
484
+ try_prompt: "help me develop an Abs operator"
423
485
  };
424
486
  var currentLang = "zh_CN";
425
487
  function setLanguage(lang) {
@@ -785,10 +847,10 @@ function printBoxTitle(title, width = 65) {
785
847
  }
786
848
  function showOperationHints(isCheckbox = false) {
787
849
  if (isCheckbox) {
788
- console.log(` \u{1F4A1} \x1B[36m\u2191\u2193\x1B[0m \u79FB\u52A8 | \x1B[36m\u7A7A\u683C\x1B[0m \u52FE\u9009 | \x1B[36m\u23CE\x1B[0m \u786E\u8BA4\uFF08\u4E0D\u9009\u6309\u56DE\u8F66\u53EF\u8FD4\u56DE\uFF09
850
+ console.log(` \u{1F4A1} \x1B[36m\u2191\u2193\x1B[0m ${t("hint_select_move")} | \x1B[36m${t("hint_select_space")}\x1B[0m ${t("hint_select_check")} | \x1B[36m\u23CE\x1B[0m ${t("hint_select_confirm")}\uFF08${t("hint_checkbox_suffix")}\uFF09
789
851
  `);
790
852
  } else {
791
- console.log(` \u{1F4A1} \x1B[36m\u2191\u2193\x1B[0m \u79FB\u52A8 | \x1B[36m\u23CE\x1B[0m \u786E\u8BA4
853
+ console.log(` \u{1F4A1} \x1B[36m\u2191\u2193\x1B[0m ${t("hint_select_move")} | \x1B[36m\u23CE\x1B[0m ${t("hint_select_confirm")}
792
854
  `);
793
855
  }
794
856
  }
@@ -1097,8 +1159,8 @@ async function stepConfirm(tool, level, plugins) {
1097
1159
  const displayPath = getConfigRoot(tool, level);
1098
1160
  const toolName = getToolDisplayName(tool);
1099
1161
  const levelText = level === "project" ? "project" : "global";
1100
- logger.info(`\u5373\u5C06\u5B89\u88C5 ${chalk2.bold(plugins.length)} \u4E2A\u63D2\u4EF6\u5230 ${chalk2.green(toolName)}\uFF08${chalk2.cyan(levelText)} \u7EA7\u522B\uFF09\uFF1A`);
1101
- logger.info(`\u5B89\u88C5\u8DEF\u5F84: ${chalk2.cyan(displayPath)}`);
1162
+ logger.info(t("wizard_confirm_install_format").replace("{count}", chalk2.bold(String(plugins.length))).replace("{tool}", chalk2.green(toolName)).replace("{level}", chalk2.cyan(levelText)));
1163
+ logger.info(`${t("wizard_install_path")}: ${chalk2.cyan(displayPath)}`);
1102
1164
  for (const plugin of selectedPlugins) {
1103
1165
  if (plugin) {
1104
1166
  logger.step(` \u2022 ${chalk2.bold(plugin.displayName)}`);
@@ -2170,10 +2232,10 @@ async function uninstallSkills(skillIds, tool, level) {
2170
2232
  unlinkSync3(targetPath);
2171
2233
  results.push({ skillId, success: true });
2172
2234
  removedIds.push(skillId);
2173
- logger.step(` \u79FB\u9664: ${skillId}`);
2235
+ logger.step(` ${t("uninstall_remove_label")}: ${skillId}`);
2174
2236
  } else {
2175
2237
  results.push({ skillId, success: false, error: "Not installed" });
2176
- logger.warn(`${skillId} \u672A\u5B89\u88C5`);
2238
+ logger.warn(`${skillId} ${t("uninstall_skill_not_installed")}`);
2177
2239
  }
2178
2240
  } catch (error) {
2179
2241
  results.push({ skillId, success: false, error: error instanceof Error ? error.message : "Unknown error" });
@@ -2187,7 +2249,7 @@ async function uninstallSkills(skillIds, tool, level) {
2187
2249
  const entries = readdirSync3(skillsDir);
2188
2250
  if (entries.length === 0) {
2189
2251
  rmdirSync(skillsDir);
2190
- logger.step(` \u6E05\u7406\u7A7A\u76EE\u5F55: skills/`);
2252
+ logger.step(` ${t("uninstall_clean_empty_dir")}: skills/`);
2191
2253
  }
2192
2254
  } catch {
2193
2255
  }
@@ -2296,7 +2358,7 @@ function listAllSkills() {
2296
2358
  console.log(table.toString());
2297
2359
  }
2298
2360
  console.log();
2299
- console.log(chalk4.dim(` \u5171 ${getAllSkills().length} \u4E2A Skills`));
2361
+ console.log(chalk4.dim(` ${t("skill_total_count").replace("{count}", String(getAllSkills().length))}`));
2300
2362
  console.log();
2301
2363
  }
2302
2364
  function isSymlink2(path) {
@@ -2333,7 +2395,8 @@ function printPluginList(plugins, installed) {
2333
2395
  ]);
2334
2396
  });
2335
2397
  console.log();
2336
- console.log(chalk5.bold(` ${t("list_title")} (${plugins.length} \u4E2A)`));
2398
+ const countSuffix = t("count_suffix");
2399
+ console.log(chalk5.bold(` ${t("list_title")} (${plugins.length}${countSuffix ? " " + countSuffix : ""})`));
2337
2400
  console.log(table.toString());
2338
2401
  console.log();
2339
2402
  }
@@ -2366,15 +2429,16 @@ function printEnhancedSummary(results, tool, configRoot) {
2366
2429
  return;
2367
2430
  }
2368
2431
  const toolName = getToolDisplayName(tool);
2432
+ const countSuffix = t("count_suffix");
2369
2433
  const lines = [
2370
2434
  chalk5.bold(` ${t("install_done")}!`),
2371
2435
  "",
2372
2436
  ` ${chalk5.dim(t("install_installed_to") + ":")} ${configRoot}`,
2373
- ` ${chalk5.dim(t("install_skills_count") + ":")} ${totalSkills} \u4E2A ${chalk5.dim("|")} ${chalk5.dim(t("install_agents_count") + ":")} ${totalAgents} \u4E2A`,
2437
+ ` ${chalk5.dim(t("install_skills_count") + ":")} ${totalSkills}${countSuffix ? " " + countSuffix : ""} ${chalk5.dim("|")} ${chalk5.dim(t("install_agents_count") + ":")} ${totalAgents}${countSuffix ? " " + countSuffix : ""}`,
2374
2438
  "",
2375
2439
  chalk5.bold(` ${t("install_enhanced_next_steps")}:`),
2376
2440
  ` ${chalk5.cyan("1.")} ${t("install_enhanced_launch")}: ${chalk5.green(toolName.toLowerCase())}`,
2377
- ` ${chalk5.cyan("2.")} ${t("install_enhanced_try")}: ${chalk5.green("\u5E2E\u6211\u5F00\u53D1\u4E00\u4E2A Abs \u7B97\u5B50")}`,
2441
+ ` ${chalk5.cyan("2.")} ${t("install_enhanced_try")}: ${chalk5.green(t("try_prompt"))}`,
2378
2442
  ` ${chalk5.cyan("3.")} ${t("install_enhanced_more")}: ${chalk5.green("install-helper list")}`,
2379
2443
  ` ${chalk5.cyan("4.")} ${t("install_enhanced_check")}: ${chalk5.green("install-helper doctor")}`,
2380
2444
  ""
@@ -2582,7 +2646,7 @@ async function skillInstallFlow() {
2582
2646
  spinner.start();
2583
2647
  const repoPath = await repoManager.ensureRepo();
2584
2648
  spinner.succeed(t("loading_plugin_data_complete"));
2585
- logger.info(`${t("skill_install_progress")} ${chalk6.bold(selectedSkills.length)} \u4E2A Skills...`);
2649
+ logger.info(`${t("skill_install_progress")} ${t("skill_count_format").replace("{count}", chalk6.bold(String(selectedSkills.length)))}...`);
2586
2650
  const results = await installSkills(selectedSkills, tool, level, repoPath);
2587
2651
  let successCount = 0;
2588
2652
  let failCount = 0;
@@ -2600,7 +2664,7 @@ async function skillInstallFlow() {
2600
2664
  }
2601
2665
  const configRoot = getConfigRoot(tool, level);
2602
2666
  logger.blank();
2603
- logger.success(`${t("skill_install_done")}: ${chalk6.green(successCount + " \u6210\u529F")}, ${failCount > 0 ? chalk6.red(failCount + " \u5931\u8D25") : chalk6.dim(failCount + " \u5931\u8D25")}`);
2667
+ logger.success(`${t("skill_install_done")}: ${chalk6.green(t("result_success_format").replace("{count}", String(successCount)))}, ${failCount > 0 ? chalk6.red(t("result_failed_format").replace("{count}", String(failCount))) : chalk6.dim(t("result_failed_format").replace("{count}", String(failCount)))}`);
2604
2668
  logger.blank();
2605
2669
  logger.info(`${t("install_to")}: ${chalk6.cyan(configRoot + "/skills/")}`);
2606
2670
  logger.info(`${t("start_to_use").replace("{tool}", chalk6.green(tool))}`);
@@ -2646,7 +2710,7 @@ async function doctorCommand(options = {}) {
2646
2710
  chalk7.green(" \u2713") + ` ${getToolDisplayName(tool)}${detected.version ? ` v${detected.version}` : ""}`
2647
2711
  );
2648
2712
  } else {
2649
- console.log(chalk7.dim(" \u2014") + ` ${getToolDisplayName(tool)} \u2014 \u672A\u5B89\u88C5`);
2713
+ console.log(chalk7.dim(" \u2014") + ` ${getToolDisplayName(tool)} \u2014 ${t("doctor_not_installed")}`);
2650
2714
  }
2651
2715
  }
2652
2716
  console.log();
@@ -2661,7 +2725,7 @@ async function doctorCommand(options = {}) {
2661
2725
  chalk7.green(" \u2713") + ` ${plugin.id.padEnd(30)} ${inst.skillsCount} skills, ${inst.agentsCount} agents`
2662
2726
  );
2663
2727
  } else {
2664
- console.log(chalk7.dim(" \u2014") + ` ${plugin.id.padEnd(30)} \u2014 \u672A\u5B89\u88C5`);
2728
+ console.log(chalk7.dim(" \u2014") + ` ${plugin.id.padEnd(30)} \u2014 ${t("doctor_not_installed")}`);
2665
2729
  }
2666
2730
  }
2667
2731
  console.log();
@@ -2674,44 +2738,44 @@ async function doctorCommand(options = {}) {
2674
2738
  const brokenLinks = checkBrokenLinks(skillsDir);
2675
2739
  if (brokenLinks === 0) {
2676
2740
  const count = readdirSync4(skillsDir).length;
2677
- console.log(chalk7.green(" \u2713") + ` ${skillsDir} \u2014 ${count} \u4E2A\u8F6F\u94FE\u63A5\u5747\u6709\u6548`);
2741
+ console.log(chalk7.green(" \u2713") + ` ${skillsDir} \u2014 ${t("doctor_links_valid").replace("{count}", String(count))}`);
2678
2742
  } else {
2679
- console.log(chalk7.yellow(" \u26A0") + ` ${skillsDir} \u2014 ${brokenLinks} \u4E2A\u5931\u6548\u94FE\u63A5`);
2743
+ console.log(chalk7.yellow(" \u26A0") + ` ${skillsDir} \u2014 ${t("doctor_broken_links").replace("{count}", String(brokenLinks))}`);
2680
2744
  warnings++;
2681
2745
  if (options.fix) {
2682
2746
  const fixed = fixBrokenLinks(skillsDir);
2683
2747
  fixes += fixed;
2684
- console.log(chalk7.green(" \u2713") + ` ${t("doctor_fix_cleaning")}: \u5DF2\u6E05\u7406 ${fixed} \u4E2A\u5931\u6548\u94FE\u63A5`);
2748
+ console.log(chalk7.green(" \u2713") + ` ${t("doctor_fix_cleaning")}: ${t("doctor_fixed").replace("{count}", String(fixed))}`);
2685
2749
  }
2686
2750
  }
2687
2751
  } else {
2688
- console.log(chalk7.dim(" \u2014") + ` ${skillsDir} \u2014 \u4E0D\u5B58\u5728`);
2752
+ console.log(chalk7.dim(" \u2014") + ` ${skillsDir} \u2014 ${t("doctor_not_exist")}`);
2689
2753
  if (options.fix) {
2690
2754
  mkdirSync6(skillsDir, { recursive: true });
2691
2755
  fixes++;
2692
- console.log(chalk7.green(" \u2713") + ` ${t("doctor_fix_rebuilding")}: \u5DF2\u521B\u5EFA ${skillsDir}`);
2756
+ console.log(chalk7.green(" \u2713") + ` ${t("doctor_fix_rebuilding")}: ${t("doctor_created").replace("{path}", skillsDir)}`);
2693
2757
  }
2694
2758
  }
2695
2759
  if (existsSync12(agentsDir)) {
2696
2760
  const brokenLinks = checkBrokenLinks(agentsDir);
2697
2761
  if (brokenLinks === 0) {
2698
2762
  const count = readdirSync4(agentsDir).length;
2699
- console.log(chalk7.green(" \u2713") + ` ${agentsDir} \u2014 ${count} \u4E2A\u8F6F\u94FE\u63A5\u5747\u6709\u6548`);
2763
+ console.log(chalk7.green(" \u2713") + ` ${agentsDir} \u2014 ${t("doctor_links_valid").replace("{count}", String(count))}`);
2700
2764
  } else {
2701
- console.log(chalk7.yellow(" \u26A0") + ` ${agentsDir} \u2014 ${brokenLinks} \u4E2A\u5931\u6548\u94FE\u63A5`);
2765
+ console.log(chalk7.yellow(" \u26A0") + ` ${agentsDir} \u2014 ${t("doctor_broken_links").replace("{count}", String(brokenLinks))}`);
2702
2766
  warnings++;
2703
2767
  if (options.fix) {
2704
2768
  const fixed = fixBrokenLinks(agentsDir);
2705
2769
  fixes += fixed;
2706
- console.log(chalk7.green(" \u2713") + ` ${t("doctor_fix_cleaning")}: \u5DF2\u6E05\u7406 ${fixed} \u4E2A\u5931\u6548\u94FE\u63A5`);
2770
+ console.log(chalk7.green(" \u2713") + ` ${t("doctor_fix_cleaning")}: ${t("doctor_fixed").replace("{count}", String(fixed))}`);
2707
2771
  }
2708
2772
  }
2709
2773
  } else {
2710
- console.log(chalk7.dim(" \u2014") + ` ${agentsDir} \u2014 \u4E0D\u5B58\u5728`);
2774
+ console.log(chalk7.dim(" \u2014") + ` ${agentsDir} \u2014 ${t("doctor_not_exist")}`);
2711
2775
  if (options.fix) {
2712
2776
  mkdirSync6(agentsDir, { recursive: true });
2713
2777
  fixes++;
2714
- console.log(chalk7.green(" \u2713") + ` ${t("doctor_fix_rebuilding")}: \u5DF2\u521B\u5EFA ${agentsDir}`);
2778
+ console.log(chalk7.green(" \u2713") + ` ${t("doctor_fix_rebuilding")}: ${t("doctor_created").replace("{path}", agentsDir)}`);
2715
2779
  }
2716
2780
  }
2717
2781
  console.log();
@@ -2719,19 +2783,19 @@ async function doctorCommand(options = {}) {
2719
2783
  const configFile = getConfigFileName(primaryTool);
2720
2784
  const configPath = join12(process.cwd(), configFile);
2721
2785
  if (existsSync12(configPath)) {
2722
- console.log(chalk7.green(" \u2713") + ` ${configFile} \u5B58\u5728`);
2786
+ console.log(chalk7.green(" \u2713") + ` ${configFile} ${t("doctor_config_exists")}`);
2723
2787
  } else {
2724
- console.log(chalk7.dim(" \u2014") + ` ${configFile} \u4E0D\u5B58\u5728`);
2788
+ console.log(chalk7.dim(" \u2014") + ` ${configFile} ${t("doctor_config_not_exist")}`);
2725
2789
  }
2726
2790
  console.log();
2727
2791
  console.log(chalk7.dim(" " + "\u2500".repeat(46)));
2728
2792
  if (options.fix && fixes > 0) {
2729
2793
  console.log(
2730
- ` ${t("doctor_result")}: ${warnings} \u4E2A\u8B66\u544A, ${errors} \u4E2A\u9519\u8BEF, ${fixes} \u9879\u5DF2\u4FEE\u590D`
2794
+ ` ${t("doctor_result")}: ${t("doctor_result_with_fix").replace("{warnings}", String(warnings)).replace("{errors}", String(errors)).replace("{fixes}", String(fixes))}`
2731
2795
  );
2732
2796
  } else {
2733
2797
  console.log(
2734
- ` ${t("doctor_result")}: ${warnings} \u4E2A\u8B66\u544A, ${errors} \u4E2A\u9519\u8BEF`
2798
+ ` ${t("doctor_result")}: ${t("doctor_result_without_fix").replace("{warnings}", String(warnings)).replace("{errors}", String(errors))}`
2735
2799
  );
2736
2800
  }
2737
2801
  console.log();
@@ -2826,9 +2890,9 @@ async function installCommand(names, options) {
2826
2890
  try {
2827
2891
  const scanRepoManager = createRepositoryManager();
2828
2892
  await scanRepoManager.ensureRepoAndScan();
2829
- scanSpinner2.succeed("Skills \u5217\u8868\u52A0\u8F7D\u5B8C\u6210");
2893
+ scanSpinner2.succeed(t("loading_skills_list_complete"));
2830
2894
  } catch {
2831
- scanSpinner2.warn("Skills \u5217\u8868\u52A0\u8F7D\u5931\u8D25\uFF0C\u5C06\u4F7F\u7528\u5185\u7F6E\u6570\u636E");
2895
+ scanSpinner2.warn(t("loading_skills_list_failed"));
2832
2896
  }
2833
2897
  let tool2;
2834
2898
  if (options.tool) {
@@ -2860,8 +2924,8 @@ async function installCommand(names, options) {
2860
2924
  const spinner = createSpinner(t("loading_plugin_data"));
2861
2925
  spinner.start();
2862
2926
  const repoPath = await repoManager.ensureRepo();
2863
- spinner.succeed("\u63D2\u4EF6\u6570\u636E\u52A0\u8F7D\u5B8C\u6210");
2864
- logger.info(`${t("skill_install_progress")} ${chalk9.bold(names.length)} \u4E2A Skills...`);
2927
+ spinner.succeed(t("loading_plugin_data_complete"));
2928
+ logger.info(`${t("skill_install_progress")} ${t("skill_count_format").replace("{count}", chalk9.bold(String(names.length)))}...`);
2865
2929
  const results = await installSkills(names, tool2, level2, repoPath);
2866
2930
  let successCount = 0;
2867
2931
  let failCount = 0;
@@ -2879,7 +2943,7 @@ async function installCommand(names, options) {
2879
2943
  }
2880
2944
  const configRoot = getConfigRoot(tool2, level2);
2881
2945
  logger.blank();
2882
- logger.success(`${t("skill_install_done")}: ${chalk9.green(successCount + " \u6210\u529F")}, ${failCount > 0 ? chalk9.red(failCount + " \u5931\u8D25") : chalk9.dim(failCount + " \u5931\u8D25")}`);
2946
+ logger.success(`${t("skill_install_done")}: ${chalk9.green(t("result_success_format").replace("{count}", String(successCount)))}, ${failCount > 0 ? chalk9.red(t("result_failed_format").replace("{count}", String(failCount))) : chalk9.dim(t("result_failed_format").replace("{count}", String(failCount)))}`);
2883
2947
  logger.blank();
2884
2948
  logger.info(`${t("install_to")}: ${chalk9.cyan(configRoot + "/skills/")}`);
2885
2949
  logger.info(`${t("start_to_use").replace("{tool}", chalk9.green(tool2))}`);
@@ -2894,9 +2958,9 @@ async function installCommand(names, options) {
2894
2958
  try {
2895
2959
  const scanRepoManager = createRepositoryManager();
2896
2960
  await scanRepoManager.ensureRepoAndScan();
2897
- scanSpinner.succeed("Skills \u5217\u8868\u52A0\u8F7D\u5B8C\u6210");
2961
+ scanSpinner.succeed(t("loading_skills_list_complete"));
2898
2962
  } catch {
2899
- scanSpinner.warn("Skills \u5217\u8868\u52A0\u8F7D\u5931\u8D25\uFF0C\u5C06\u4F7F\u7528\u5185\u7F6E\u6570\u636E");
2963
+ scanSpinner.warn(t("loading_skills_list_failed"));
2900
2964
  }
2901
2965
  const plugins = [];
2902
2966
  const skills = [];
@@ -2913,11 +2977,11 @@ async function installCommand(names, options) {
2913
2977
  }
2914
2978
  logger.error(`${t("error_plugin_not_found")}: ${name}`);
2915
2979
  const allPlugins = getAllPlugins();
2916
- logger.info("\u53EF\u7528\u63D2\u4EF6:");
2980
+ logger.info(t("available_plugins") + ":");
2917
2981
  for (const p of allPlugins) {
2918
2982
  logger.step(` ${p.id} (${p.aliases.join(", ")})`);
2919
2983
  }
2920
- logger.info(`\u53EF\u7528 Skills: ${chalk9.cyan("install-helper install --list")}`);
2984
+ logger.info(`${t("available_skills")}: ${chalk9.cyan("install-helper install --list")}`);
2921
2985
  return;
2922
2986
  }
2923
2987
  let tool;
@@ -2989,7 +3053,7 @@ async function installCommand(names, options) {
2989
3053
  spinner.start();
2990
3054
  const repoPath = await repoManager.ensureRepo();
2991
3055
  spinner.succeed(t("loading_plugin_data_complete"));
2992
- logger.info(`${t("skill_install_progress")} ${chalk9.bold(skills.length)} \u4E2A Skills...`);
3056
+ logger.info(`${t("skill_install_progress")} ${t("skill_count_format").replace("{count}", chalk9.bold(String(skills.length)))}...`);
2993
3057
  const results = await installSkills(skills, tool, level, repoPath);
2994
3058
  let successCount = 0;
2995
3059
  let failCount = 0;
@@ -3006,7 +3070,7 @@ async function installCommand(names, options) {
3006
3070
  }
3007
3071
  }
3008
3072
  logger.blank();
3009
- logger.success(`${t("skill_install_done")}: ${chalk9.green(successCount + " \u6210\u529F")}, ${failCount > 0 ? chalk9.red(failCount + " \u5931\u8D25") : chalk9.dim(failCount + " \u5931\u8D25")}`);
3073
+ logger.success(`${t("skill_install_done")}: ${chalk9.green(t("result_success_format").replace("{count}", String(successCount)))}, ${failCount > 0 ? chalk9.red(t("result_failed_format").replace("{count}", String(failCount))) : chalk9.dim(t("result_failed_format").replace("{count}", String(failCount)))}`);
3010
3074
  logger.blank();
3011
3075
  logger.info(`${t("install_to")}: ${chalk9.cyan(getConfigRoot(tool, level) + "/skills/")}`);
3012
3076
  logger.info(`${t("start_to_use").replace("{tool}", chalk9.green(tool))}`);
@@ -3078,7 +3142,7 @@ async function uninstallCommand(names, options) {
3078
3142
  if (existsSync13(filePath) || isSymlink3(filePath)) {
3079
3143
  unlinkSync5(filePath);
3080
3144
  const name = filePath.split("/").pop() || filePath;
3081
- logger.step(` \u79FB\u9664: ${name}`);
3145
+ logger.step(` ${t("uninstall_remove_label")}: ${name}`);
3082
3146
  removedFiles++;
3083
3147
  }
3084
3148
  } catch {
@@ -3096,7 +3160,7 @@ async function uninstallCommand(names, options) {
3096
3160
  if (entries.length === 0) {
3097
3161
  rmdirSync2(dirPath);
3098
3162
  const name = dirPath.split("/").pop() || dirPath;
3099
- logger.step(` \u6E05\u7406\u7A7A\u76EE\u5F55: ${name}/`);
3163
+ logger.step(` ${t("uninstall_clean_empty_dir")}: ${name}/`);
3100
3164
  removedDirs++;
3101
3165
  }
3102
3166
  }
@@ -3124,13 +3188,13 @@ async function uninstallCommand(names, options) {
3124
3188
  }
3125
3189
  const totalRemoved = removedFiles + removedDirs;
3126
3190
  if (totalRemoved > 0) {
3127
- logger.success(`${t("uninstall_removed")} ${plugin.displayName}\uFF08\u79FB\u9664 ${removedFiles} \u4E2A\u6587\u4EF6\uFF0C${removedDirs} \u4E2A\u76EE\u5F55\uFF09`);
3191
+ logger.success(`${t("uninstall_removed")} ${plugin.displayName}\uFF08${t("uninstall_remove_file_format").replace("{count}", String(removedFiles))}\uFF0C${t("uninstall_remove_dir_format").replace("{count}", String(removedDirs))}\uFF09`);
3128
3192
  } else {
3129
3193
  logger.warn(`${plugin.displayName}${t("uninstall_files_gone")}`);
3130
3194
  }
3131
3195
  }
3132
3196
  if (skills.length > 0) {
3133
- logger.info(`${t("uninstall_skills_in_progress")} ${skills.length} \u4E2A Skills...`);
3197
+ logger.info(`${t("uninstall_skills_in_progress")} ${t("skill_count_format").replace("{count}", String(skills.length))}...`);
3134
3198
  const results = await uninstallSkills(skills, tool, level);
3135
3199
  let successCount = 0;
3136
3200
  let failCount = 0;
@@ -3142,7 +3206,7 @@ async function uninstallCommand(names, options) {
3142
3206
  }
3143
3207
  }
3144
3208
  logger.blank();
3145
- logger.success(`${t("skill_uninstall_done")}: ${chalk10.green(successCount + " \u6210\u529F")}, ${failCount > 0 ? chalk10.red(failCount + " \u5931\u8D25") : chalk10.dim(failCount + " \u5931\u8D25")}`);
3209
+ logger.success(`${t("skill_uninstall_done")}: ${chalk10.green(t("result_success_format").replace("{count}", String(successCount)))}, ${failCount > 0 ? chalk10.red(t("result_failed_format").replace("{count}", String(failCount))) : chalk10.dim(t("result_failed_format").replace("{count}", String(failCount)))}`);
3146
3210
  logger.blank();
3147
3211
  }
3148
3212
  }
@@ -3173,7 +3237,7 @@ async function updateCommand(pluginNames, options) {
3173
3237
  pluginsToUpdate = manifests.map((m) => m.team);
3174
3238
  if (pluginsToUpdate.length === 0) {
3175
3239
  logger.info(t("update_no_plugins"));
3176
- logger.info(`\u4F7F\u7528 ${chalk11.cyan("install-helper install <plugin>")} \u5B89\u88C5\u63D2\u4EF6`);
3240
+ logger.info(t("update_install_hint").replace("{cmd}", chalk11.cyan("install-helper install <plugin>")));
3177
3241
  return;
3178
3242
  }
3179
3243
  } else {
@@ -3324,7 +3388,7 @@ function createCLI() {
3324
3388
  setLanguage(config.language);
3325
3389
  }
3326
3390
  const program2 = new Command();
3327
- program2.name("install-helper").description("CANNBot Install Helper - Interactive installer for CANN operator development skills").version("0.0.2-beta.14");
3391
+ program2.name("install-helper").description("CANNBot Install Helper - Interactive installer for CANN operator development skills").version("0.0.2-beta.15");
3328
3392
  program2.command("init", { isDefault: false }).description("Run interactive installation wizard").action(async () => {
3329
3393
  await initCommand();
3330
3394
  });
@@ -3361,7 +3425,7 @@ function createCLI() {
3361
3425
  // src/index.ts
3362
3426
  process.on("uncaughtException", (error) => {
3363
3427
  if (error.name === "ExitPromptError") {
3364
- console.log("\n\u5DF2\u53D6\u6D88\u5B89\u88C5");
3428
+ console.log("\n" + t("init_cancelled"));
3365
3429
  process.exit(0);
3366
3430
  }
3367
3431
  throw error;