@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 +81 -60
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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,
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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("
|
|
2070
|
-
logger.info("
|
|
2071
|
-
logger.info("
|
|
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("
|
|
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("
|
|
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("
|
|
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("
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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}
|
|
2721
|
-
logger.info(
|
|
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(
|
|
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(
|
|
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}
|
|
2780
|
+
logger.warn(`${plugin.displayName}${t("uninstall_files_gone")}`);
|
|
2760
2781
|
}
|
|
2761
2782
|
}
|
|
2762
2783
|
if (skills.length > 0) {
|
|
2763
|
-
logger.info(
|
|
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("
|
|
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(
|
|
2926
|
-
console.log(chalk12.dim(
|
|
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(
|
|
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(`
|
|
2947
|
-
console.log(chalk12.dim(
|
|
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
|
|
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
|
});
|