@cannbot-ai/install-helper 0.0.2-beta.5 → 1.0.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.
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ import { select as select3, Separator as Separator3 } from "@inquirer/prompts";
8
8
  import chalk5 from "chalk";
9
9
 
10
10
  // src/ui/wizard.ts
11
- import { select, checkbox, Separator } from "@inquirer/prompts";
11
+ import { select, Separator } from "@inquirer/prompts";
12
12
  import chalk2 from "chalk";
13
13
 
14
14
  // src/core/registry.ts
@@ -478,10 +478,27 @@ var zh_CN = {
478
478
  status_install_time: "\u5B89\u88C5\u65F6\u95F4",
479
479
  install_installed_to: "\u5B89\u88C5\u5230",
480
480
  install_skills_count: "Skills",
481
- install_agents_count: "Agents"
481
+ install_agents_count: "Agents",
482
+ lang_supported: "\u652F\u6301\u7684\u8BED\u8A00: zh_CN, en_US",
483
+ lang_usage: "\u7528\u6CD5: install-helper lang set <language>",
484
+ lang_specify: "\u8BF7\u6307\u5B9A\u8BED\u8A00: install-helper lang set zh_CN",
485
+ lang_unknown_action: "\u672A\u77E5\u64CD\u4F5C",
486
+ lang_supported_actions: "\u652F\u6301\u7684\u64CD\u4F5C: show, set",
487
+ info_aliases: "\u522B\u540D",
488
+ uninstall_not_found: "\u672A\u627E\u5230",
489
+ uninstall_no_record: "\u672A\u627E\u5230\u5B89\u88C5\u8BB0\u5F55\uFF0C\u53EF\u80FD\u672A\u5B89\u88C5\u6216\u5B89\u88C5\u8BB0\u5F55\u5DF2\u635F\u574F",
490
+ uninstall_no_record_hint: "\u5982\u9700\u5F3A\u5236\u6E05\u7406\uFF0C\u8BF7\u624B\u52A8\u5220\u9664 .opencode/ \u6216 .claude/ \u76EE\u5F55\u4E2D\u7684\u76F8\u5173\u6587\u4EF6",
491
+ uninstall_in_progress: "\u6B63\u5728\u5378\u8F7D",
492
+ uninstall_removed: "\u5DF2\u5378\u8F7D",
493
+ uninstall_files_gone: "\u7684\u6587\u4EF6\u5DF2\u4E0D\u5B58\u5728\uFF0C\u5DF2\u6E05\u7406\u5B89\u88C5\u8BB0\u5F55",
494
+ uninstall_skills_in_progress: "\u6B63\u5728\u5378\u8F7D",
495
+ init_pkg_dir_warn: "\u5F53\u524D\u76EE\u5F55\u770B\u8D77\u6765\u662F install-helper \u5305\u76EE\u5F55",
496
+ init_pkg_dir_hint: "\u8BF7\u5728\u4F60\u7684\u9879\u76EE\u76EE\u5F55\u4E2D\u8FD0\u884C\u6B64\u547D\u4EE4\uFF0C\u800C\u4E0D\u662F\u5728 install-helper \u5B89\u88C5\u76EE\u5F55\u4E2D",
497
+ init_pkg_dir_example: "\u793A\u4F8B\uFF1Acd ~/my-project && install-helper",
498
+ init_cancelled: "\u5DF2\u53D6\u6D88\u5B89\u88C5"
482
499
  };
483
500
  var en_US = {
484
- wizard_title: "CANNBot Skills Setup Wizard",
501
+ wizard_title: "CANNBot Install Helper",
485
502
  wizard_detect: "Detecting installed AI coding tools...",
486
503
  wizard_select_tool: "Select AI coding tool",
487
504
  wizard_select_level: "Select install level",
@@ -566,7 +583,24 @@ var en_US = {
566
583
  status_install_time: "Installed at",
567
584
  install_installed_to: "Installed to",
568
585
  install_skills_count: "Skills",
569
- install_agents_count: "Agents"
586
+ install_agents_count: "Agents",
587
+ lang_supported: "Supported languages: zh_CN, en_US",
588
+ lang_usage: "Usage: install-helper lang set <language>",
589
+ lang_specify: "Please specify language: install-helper lang set zh_CN",
590
+ lang_unknown_action: "Unknown action",
591
+ lang_supported_actions: "Supported actions: show, set",
592
+ info_aliases: "Aliases",
593
+ uninstall_not_found: "Not found",
594
+ uninstall_no_record: "No install record found, may not be installed or record is corrupted",
595
+ uninstall_no_record_hint: "For manual cleanup, delete related files in .opencode/ or .claude/ directory",
596
+ uninstall_in_progress: "Uninstalling",
597
+ uninstall_removed: "Uninstalled",
598
+ uninstall_files_gone: " files no longer exist, install record cleaned",
599
+ uninstall_skills_in_progress: "Uninstalling",
600
+ init_pkg_dir_warn: "Current directory appears to be the install-helper package directory",
601
+ init_pkg_dir_hint: "Please run this command in your project directory, not in the install-helper package directory",
602
+ init_pkg_dir_example: "Example: cd ~/my-project && install-helper",
603
+ init_cancelled: "Installation cancelled"
570
604
  };
571
605
  var currentLang = "zh_CN";
572
606
  function setLanguage(lang) {
@@ -630,7 +664,7 @@ function printBoxTitle(title, width = 65) {
630
664
  }
631
665
  function showOperationHints(isCheckbox = false) {
632
666
  if (isCheckbox) {
633
- 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
667
+ 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
634
668
  `);
635
669
  } else {
636
670
  console.log(` \u{1F4A1} \x1B[36m\u2191\u2193\x1B[0m \u79FB\u52A8 | \x1B[36m\u23CE\x1B[0m \u786E\u8BA4
@@ -909,9 +943,6 @@ async function stepPlugins(tool, level) {
909
943
  checked: false
910
944
  };
911
945
  });
912
- choices.push(new Separator("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
913
- choices.push({ name: "<- " + t("wizard_back"), value: BACK, checked: false });
914
- choices.push({ name: "x " + t("wizard_cancel"), value: CANCEL, checked: false });
915
946
  showOperationHints(true);
916
947
  const selected = await checkbox({
917
948
  message: t("wizard_select_plugins"),
@@ -921,13 +952,7 @@ async function stepPlugins(tool, level) {
921
952
  theme: checkboxTheme,
922
953
  pageSize: 15
923
954
  });
924
- if (selected.includes(CANCEL)) {
925
- return CANCEL;
926
- }
927
- if (selected.includes(BACK)) {
928
- return BACK;
929
- }
930
- const pluginIds = selected.filter((v) => v !== BACK && v !== CANCEL);
955
+ const pluginIds = selected;
931
956
  if (pluginIds.length === 0) {
932
957
  const action = await select({
933
958
  message: t("wizard_no_selection"),
@@ -979,7 +1004,7 @@ import { execa as execa2 } from "execa";
979
1004
 
980
1005
  // src/core/scanner.ts
981
1006
  import { existsSync as existsSync5, readdirSync, readFileSync as readFileSync3, statSync, writeFileSync as writeFileSync2, mkdirSync as mkdirSync2 } from "fs";
982
- import { join as join5, dirname } from "path";
1007
+ import { join as join5 } from "path";
983
1008
  import { parse as parseYaml } from "yaml";
984
1009
  var EXCLUDE_DIRS = /* @__PURE__ */ new Set([
985
1010
  "node_modules",
@@ -1892,9 +1917,6 @@ async function interactiveSkillSelect() {
1892
1917
  checked: false
1893
1918
  };
1894
1919
  });
1895
- skillChoices.push(new Separator2("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
1896
- skillChoices.push({ name: "<- " + t("wizard_back"), value: BACK3, checked: false });
1897
- skillChoices.push({ name: "x " + t("wizard_cancel"), value: CANCEL3, checked: false });
1898
1920
  showOperationHints(true);
1899
1921
  const selectedSkills = await checkbox2({
1900
1922
  message: t("skill_select_items"),
@@ -1904,14 +1926,7 @@ async function interactiveSkillSelect() {
1904
1926
  theme: checkboxTheme,
1905
1927
  pageSize: 15
1906
1928
  });
1907
- if (selectedSkills.includes(CANCEL3)) {
1908
- return "cancel";
1909
- }
1910
- if (selectedSkills.includes(BACK3)) {
1911
- step = 0;
1912
- break;
1913
- }
1914
- const skillIds = selectedSkills.filter((v) => v !== BACK3 && v !== CANCEL3);
1929
+ const skillIds = selectedSkills;
1915
1930
  if (skillIds.length === 0) {
1916
1931
  const action = await select2({
1917
1932
  message: t("wizard_no_selection"),
@@ -2066,9 +2081,9 @@ async function initCommand() {
2066
2081
  return false;
2067
2082
  }
2068
2083
  })()) {
2069
- logger.warn("\u5F53\u524D\u76EE\u5F55\u770B\u8D77\u6765\u662F install-helper \u5305\u76EE\u5F55");
2070
- logger.info("\u8BF7\u5728\u4F60\u7684\u9879\u76EE\u76EE\u5F55\u4E2D\u8FD0\u884C\u6B64\u547D\u4EE4\uFF0C\u800C\u4E0D\u662F\u5728 install-helper \u5B89\u88C5\u76EE\u5F55\u4E2D");
2071
- logger.info("\u793A\u4F8B\uFF1Acd ~/my-project && install-helper");
2084
+ logger.warn(t("init_pkg_dir_warn"));
2085
+ logger.info(t("init_pkg_dir_hint"));
2086
+ logger.info(t("init_pkg_dir_example"));
2072
2087
  return;
2073
2088
  }
2074
2089
  printBanner(t("wizard_title"));
@@ -2141,7 +2156,7 @@ async function pluginInstallFlow() {
2141
2156
  const answers = await runWizard();
2142
2157
  if (!answers.confirmed) {
2143
2158
  if (answers.back) return "back";
2144
- logger.info("\u5DF2\u53D6\u6D88\u5B89\u88C5");
2159
+ logger.info(t("init_cancelled"));
2145
2160
  return "done";
2146
2161
  }
2147
2162
  const repoManager = createRepositoryManager();
@@ -2202,7 +2217,7 @@ async function skillInstallFlow() {
2202
2217
  const result = await selectToolWithDetection();
2203
2218
  if (result === "back") return "back";
2204
2219
  if (result === "cancel") {
2205
- logger.info("\u5DF2\u53D6\u6D88\u5B89\u88C5");
2220
+ logger.info(t("init_cancelled"));
2206
2221
  return "done";
2207
2222
  }
2208
2223
  tool = result;
@@ -2216,7 +2231,7 @@ async function skillInstallFlow() {
2216
2231
  break;
2217
2232
  }
2218
2233
  if (result === CANCEL2) {
2219
- logger.info("\u5DF2\u53D6\u6D88\u5B89\u88C5");
2234
+ logger.info(t("init_cancelled"));
2220
2235
  return "done";
2221
2236
  }
2222
2237
  level = result;
@@ -2230,7 +2245,7 @@ async function skillInstallFlow() {
2230
2245
  break;
2231
2246
  }
2232
2247
  if (selectedSkills === "cancel") {
2233
- logger.info("\u5DF2\u53D6\u6D88\u5B89\u88C5");
2248
+ logger.info(t("init_cancelled"));
2234
2249
  return "done";
2235
2250
  }
2236
2251
  if (selectedSkills.length === 0) {
@@ -2515,21 +2530,24 @@ async function installCommand(names, options) {
2515
2530
  }
2516
2531
  names = selectedSkills;
2517
2532
  const repoManager = createRepositoryManager();
2518
- const spinner = createSpinner(t("install_cloning"));
2533
+ const spinner = createSpinner("\u6B63\u5728\u52A0\u8F7D\u63D2\u4EF6\u6570\u636E...");
2519
2534
  spinner.start();
2520
2535
  const repoPath = await repoManager.ensureRepo();
2521
- spinner.succeed(t("install_repo_ready"));
2536
+ spinner.succeed("\u63D2\u4EF6\u6570\u636E\u52A0\u8F7D\u5B8C\u6210");
2522
2537
  logger.info(`${t("skill_install_progress")} ${chalk8.bold(names.length)} \u4E2A Skills...`);
2523
2538
  const level2 = options.level || "project";
2524
2539
  const results = await installSkills(names, tool2, level2, repoPath);
2525
2540
  let successCount = 0;
2526
2541
  let failCount = 0;
2527
- for (const result of results) {
2542
+ const total = results.length;
2543
+ for (let i = 0; i < results.length; i++) {
2544
+ const result = results[i];
2545
+ const progress = `[${i + 1}/${total}]`;
2528
2546
  if (result.success) {
2529
- logger.success(`${result.skillId}`);
2547
+ logger.success(`${progress} ${result.skillId}`);
2530
2548
  successCount++;
2531
2549
  } else {
2532
- logger.error(`${result.skillId}: ${result.error}`);
2550
+ logger.error(`${progress} ${result.skillId}: ${result.error}`);
2533
2551
  failCount++;
2534
2552
  }
2535
2553
  }
@@ -2612,10 +2630,10 @@ async function installCommand(names, options) {
2612
2630
  }
2613
2631
  if (pluginsToInstall.length > 0) {
2614
2632
  const repoManager = createRepositoryManager();
2615
- const spinner = createSpinner(t("install_cloning"));
2633
+ const spinner = createSpinner("\u6B63\u5728\u52A0\u8F7D\u63D2\u4EF6\u6570\u636E...");
2616
2634
  spinner.start();
2617
2635
  const repoPath = await repoManager.ensureRepo();
2618
- spinner.succeed(t("install_repo_ready"));
2636
+ spinner.succeed("\u63D2\u4EF6\u6570\u636E\u52A0\u8F7D\u5B8C\u6210");
2619
2637
  const allPlugins = getAllPlugins();
2620
2638
  const results = await installPlugins(
2621
2639
  pluginsToInstall,
@@ -2639,20 +2657,23 @@ async function installCommand(names, options) {
2639
2657
  }
2640
2658
  if (skills.length > 0) {
2641
2659
  const repoManager = createRepositoryManager();
2642
- const spinner = createSpinner(t("install_cloning"));
2660
+ const spinner = createSpinner("\u6B63\u5728\u52A0\u8F7D\u63D2\u4EF6\u6570\u636E...");
2643
2661
  spinner.start();
2644
2662
  const repoPath = await repoManager.ensureRepo();
2645
- spinner.succeed(t("install_repo_ready"));
2663
+ spinner.succeed("\u63D2\u4EF6\u6570\u636E\u52A0\u8F7D\u5B8C\u6210");
2646
2664
  logger.info(`${t("skill_install_progress")} ${chalk8.bold(skills.length)} \u4E2A Skills...`);
2647
2665
  const results = await installSkills(skills, tool, level, repoPath);
2648
2666
  let successCount = 0;
2649
2667
  let failCount = 0;
2650
- for (const result of results) {
2668
+ const total = results.length;
2669
+ for (let i = 0; i < results.length; i++) {
2670
+ const result = results[i];
2671
+ const progress = `[${i + 1}/${total}]`;
2651
2672
  if (result.success) {
2652
- logger.success(`${result.skillId}`);
2673
+ logger.success(`${progress} ${result.skillId}`);
2653
2674
  successCount++;
2654
2675
  } else {
2655
- logger.error(`${result.skillId}: ${result.error}`);
2676
+ logger.error(`${progress} ${result.skillId}: ${result.error}`);
2656
2677
  failCount++;
2657
2678
  }
2658
2679
  }
@@ -2710,18 +2731,18 @@ async function uninstallCommand(names, options) {
2710
2731
  skills.push(skill.id);
2711
2732
  continue;
2712
2733
  }
2713
- logger.error(`\u672A\u627E\u5230: ${name}`);
2734
+ logger.error(`${t("uninstall_not_found")}: ${name}`);
2714
2735
  }
2715
2736
  for (const pluginId of plugins) {
2716
2737
  const plugin = findPlugin(pluginId);
2717
2738
  if (!plugin) continue;
2718
2739
  const record = readRecord(plugin.id);
2719
2740
  if (!record) {
2720
- logger.warn(`${plugin.displayName} \u672A\u627E\u5230\u5B89\u88C5\u8BB0\u5F55\uFF0C\u53EF\u80FD\u672A\u5B89\u88C5\u6216\u5B89\u88C5\u8BB0\u5F55\u5DF2\u635F\u574F`);
2721
- logger.info(`\u5982\u9700\u5F3A\u5236\u6E05\u7406\uFF0C\u8BF7\u624B\u52A8\u5220\u9664 .opencode/ \u6216 .claude/ \u76EE\u5F55\u4E2D\u7684\u76F8\u5173\u6587\u4EF6`);
2741
+ logger.warn(`${plugin.displayName} ${t("uninstall_no_record")}`);
2742
+ logger.info(`${t("uninstall_no_record_hint")}`);
2722
2743
  continue;
2723
2744
  }
2724
- logger.info(`\u6B63\u5728\u5378\u8F7D ${plugin.displayName}...`);
2745
+ logger.info(`${t("uninstall_in_progress")} ${plugin.displayName}...`);
2725
2746
  let removedFiles = 0;
2726
2747
  let removedDirs = 0;
2727
2748
  for (const filePath of record.files) {
@@ -2754,13 +2775,13 @@ async function uninstallCommand(names, options) {
2754
2775
  removeInstalledPlugin(plugin.id);
2755
2776
  const totalRemoved = removedFiles + removedDirs;
2756
2777
  if (totalRemoved > 0) {
2757
- logger.success(`\u5DF2\u5378\u8F7D ${plugin.displayName}\uFF08\u79FB\u9664 ${removedFiles} \u4E2A\u6587\u4EF6\uFF0C${removedDirs} \u4E2A\u76EE\u5F55\uFF09`);
2778
+ logger.success(`${t("uninstall_removed")} ${plugin.displayName}\uFF08\u79FB\u9664 ${removedFiles} \u4E2A\u6587\u4EF6\uFF0C${removedDirs} \u4E2A\u76EE\u5F55\uFF09`);
2758
2779
  } else {
2759
- logger.warn(`${plugin.displayName} \u7684\u6587\u4EF6\u5DF2\u4E0D\u5B58\u5728\uFF0C\u5DF2\u6E05\u7406\u5B89\u88C5\u8BB0\u5F55`);
2780
+ logger.warn(`${plugin.displayName}${t("uninstall_files_gone")}`);
2760
2781
  }
2761
2782
  }
2762
2783
  if (skills.length > 0) {
2763
- logger.info(`\u6B63\u5728\u5378\u8F7D ${skills.length} \u4E2A Skills...`);
2784
+ logger.info(`${t("uninstall_skills_in_progress")} ${skills.length} \u4E2A Skills...`);
2764
2785
  const results = await uninstallSkills(skills, tool, level);
2765
2786
  let successCount = 0;
2766
2787
  let failCount = 0;
@@ -2886,7 +2907,7 @@ async function infoCommand(pluginName) {
2886
2907
  console.log(` ${chalk11.dim(t("info_status") + ":")} ${statusText}`);
2887
2908
  console.log(` ${chalk11.dim(t("info_skills") + ":")} ${plugin.skills}`);
2888
2909
  console.log(` ${chalk11.dim(t("info_agents") + ":")} ${plugin.agents}`);
2889
- console.log(` ${chalk11.dim("\u522B\u540D:")} ${plugin.aliases.join(", ")}`);
2910
+ console.log(` ${chalk11.dim(t("info_aliases") + ":")} ${plugin.aliases.join(", ")}`);
2890
2911
  console.log();
2891
2912
  try {
2892
2913
  const repoManager = createRepositoryManager();
@@ -2922,14 +2943,14 @@ async function langCommand(action, value) {
2922
2943
  console.log();
2923
2944
  console.log(` ${chalk12.dim(t("lang_current") + ":")} ${config.language}`);
2924
2945
  console.log();
2925
- console.log(chalk12.dim(" \u652F\u6301\u7684\u8BED\u8A00: zh_CN, en_US"));
2926
- console.log(chalk12.dim(" \u7528\u6CD5: install-helper lang set <language>"));
2946
+ console.log(chalk12.dim(` ${t("lang_supported")}`));
2947
+ console.log(chalk12.dim(` ${t("lang_usage")}`));
2927
2948
  console.log();
2928
2949
  return;
2929
2950
  }
2930
2951
  if (action === "set") {
2931
2952
  if (!value) {
2932
- console.log(chalk12.red(" \u8BF7\u6307\u5B9A\u8BED\u8A00: install-helper lang set zh_CN"));
2953
+ console.log(chalk12.red(` ${t("lang_specify")}`));
2933
2954
  return;
2934
2955
  }
2935
2956
  if (value !== "zh_CN" && value !== "en_US") {
@@ -2943,8 +2964,8 @@ async function langCommand(action, value) {
2943
2964
  console.log();
2944
2965
  return;
2945
2966
  }
2946
- console.log(chalk12.red(` \u672A\u77E5\u64CD\u4F5C: ${action}`));
2947
- console.log(chalk12.dim(" \u652F\u6301\u7684\u64CD\u4F5C: show, set"));
2967
+ console.log(chalk12.red(` ${t("lang_unknown_action")}: ${action}`));
2968
+ console.log(chalk12.dim(` ${t("lang_supported_actions")}`));
2948
2969
  }
2949
2970
 
2950
2971
  // src/cli.ts
@@ -2954,7 +2975,7 @@ function createCLI() {
2954
2975
  setLanguage(config.language);
2955
2976
  }
2956
2977
  const program2 = new Command();
2957
- program2.name("install-helper").description("Install Helper - Interactive installer for CANN operator development skills").version("0.0.2-beta.5");
2978
+ program2.name("install-helper").description("CANNBot Install Helper - Interactive installer for CANN operator development skills").version("1.0.0");
2958
2979
  program2.command("init", { isDefault: false }).description("Run interactive installation wizard").action(async () => {
2959
2980
  await initCommand();
2960
2981
  });