@cannbot-ai/install-helper 1.1.6-beta.1 → 1.1.6-beta.11
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 +245 -99
- package/dist/index.js.map +1 -1
- package/dist/locales/en_US.json +4 -3
- package/dist/locales/zh_CN.json +4 -3
- package/package.json +6 -6
package/dist/index.js
CHANGED
|
@@ -844,12 +844,13 @@ var init_zh_CN = __esm({
|
|
|
844
844
|
doctor_result_without_fix: "{warnings} \u4E2A\u8B66\u544A",
|
|
845
845
|
count_suffix: "\u4E2A",
|
|
846
846
|
try_prompt: "\u5E2E\u6211\u5F00\u53D1\u4E00\u4E2A Abs \u7B97\u5B50",
|
|
847
|
-
uninstall_interactive_title: "\u7BA1\u7406\u5DF2\u5B89\u88C5\u7684\u5185\u5BB9 \u2014 \
|
|
847
|
+
uninstall_interactive_title: "\u7BA1\u7406\u5DF2\u5B89\u88C5\u7684\u5185\u5BB9 \u2014 \u52FE\u9009\u8981\u5378\u8F7D\u7684\u9879",
|
|
848
848
|
uninstall_select_type: "\u9009\u62E9\u8981\u5378\u8F7D\u7684\u7C7B\u578B",
|
|
849
849
|
uninstall_type_skill: "\u5378\u8F7D Skills",
|
|
850
850
|
uninstall_type_plugin: "\u5378\u8F7D Plugins",
|
|
851
851
|
uninstall_checkbox_hint: "\u52FE\u9009=\u4FDD\u7559\uFF0C\u53D6\u6D88\u52FE\u9009=\u5378\u8F7D",
|
|
852
|
-
|
|
852
|
+
uninstall_checkbox_hint_select: "\u52FE\u9009\u8981\u5378\u8F7D\u7684\u9879\uFF0C\u4E0D\u9009\u6309\u56DE\u8F66\u53EF\u8FD4\u56DE",
|
|
853
|
+
uninstall_uncheck_all: "\u5378\u8F7D\u5168\u90E8",
|
|
853
854
|
uninstall_confirm_count: "\u786E\u8BA4\u5378\u8F7D\uFF08{count} \u4E2A\u5C06\u5378\u8F7D\uFF09",
|
|
854
855
|
uninstall_no_installed: "\u6CA1\u6709\u5DF2\u5B89\u88C5\u7684 Skills \u6216 Plugins",
|
|
855
856
|
uninstall_no_installed_skills: "\u6CA1\u6709\u5DF2\u5B89\u88C5\u7684 Skills",
|
|
@@ -866,7 +867,7 @@ var init_zh_CN = __esm({
|
|
|
866
867
|
uninstall_select_items: "\u7BA1\u7406\u5DF2\u5B89\u88C5\u7684 Skills\uFF08\u7A7A\u683C\u5207\u6362\uFF0C\u56DE\u8F66\u786E\u8BA4\uFF09",
|
|
867
868
|
uninstall_select_plugins: "\u7BA1\u7406\u5DF2\u5B89\u88C5\u7684 Plugins\uFF08\u7A7A\u683C\u5207\u6362\uFF0C\u56DE\u8F66\u786E\u8BA4\uFF09",
|
|
868
869
|
uninstall_select_category: "\u9009\u62E9\u8981\u7BA1\u7406\u7684 Skill \u7C7B\u522B",
|
|
869
|
-
uninstall_uncheck_all_category: "\
|
|
870
|
+
uninstall_uncheck_all_category: "\u5378\u8F7D\u672C\u7C7B\u522B\u5168\u90E8",
|
|
870
871
|
uninstall_continue_or_confirm: "\u5DF2\u6807\u8BB0 {count} \u4E2A\u5F85\u5378\u8F7D\uFF0C\u8BF7\u9009\u62E9\u64CD\u4F5C",
|
|
871
872
|
uninstall_marked_count: "\u5DF2\u6807\u8BB0 {count} \u4E2A\u5F85\u5378\u8F7D",
|
|
872
873
|
uninstall_uncategorized: "\u672A\u5206\u7C7B"
|
|
@@ -1066,12 +1067,13 @@ var init_en_US = __esm({
|
|
|
1066
1067
|
doctor_result_without_fix: "{warnings} warnings",
|
|
1067
1068
|
count_suffix: "",
|
|
1068
1069
|
try_prompt: "help me develop an Abs operator",
|
|
1069
|
-
uninstall_interactive_title: "Manage installed items \u2014
|
|
1070
|
+
uninstall_interactive_title: "Manage installed items \u2014 check to uninstall",
|
|
1070
1071
|
uninstall_select_type: "Select type to uninstall",
|
|
1071
1072
|
uninstall_type_skill: "Uninstall Skills",
|
|
1072
1073
|
uninstall_type_plugin: "Uninstall Plugins",
|
|
1073
1074
|
uninstall_checkbox_hint: "Checked = keep, unchecked = uninstall",
|
|
1074
|
-
|
|
1075
|
+
uninstall_checkbox_hint_select: "Check items to uninstall, press enter without selection to go back",
|
|
1076
|
+
uninstall_uncheck_all: "Uninstall all",
|
|
1075
1077
|
uninstall_confirm_count: "Confirm uninstall ({count} will be removed)",
|
|
1076
1078
|
uninstall_no_installed: "No installed Skills or Plugins",
|
|
1077
1079
|
uninstall_no_installed_skills: "No installed Skills",
|
|
@@ -1088,7 +1090,7 @@ var init_en_US = __esm({
|
|
|
1088
1090
|
uninstall_select_items: "Manage installed Skills (space to toggle, enter to confirm)",
|
|
1089
1091
|
uninstall_select_plugins: "Manage installed Plugins (space to toggle, enter to confirm)",
|
|
1090
1092
|
uninstall_select_category: "Select Skill category to manage",
|
|
1091
|
-
uninstall_uncheck_all_category: "
|
|
1093
|
+
uninstall_uncheck_all_category: "Uninstall all in this category",
|
|
1092
1094
|
uninstall_continue_or_confirm: "{count} marked for uninstall, choose an action",
|
|
1093
1095
|
uninstall_marked_count: "{count} marked for uninstall",
|
|
1094
1096
|
uninstall_uncategorized: "Uncategorized"
|
|
@@ -1461,30 +1463,35 @@ function scanInstalled() {
|
|
|
1461
1463
|
function verifyPluginFilesExist(configRoot, manifest, tool, level) {
|
|
1462
1464
|
const skillsDir = join5(configRoot, "skills");
|
|
1463
1465
|
const agentsDir = join5(configRoot, "agents");
|
|
1466
|
+
let hasAnyComponent = false;
|
|
1464
1467
|
if (manifest.installed_skills && manifest.installed_skills.length > 0) {
|
|
1465
1468
|
const hasAnySkill = manifest.installed_skills.some((skillId) => {
|
|
1466
1469
|
const skillPath = join5(skillsDir, skillId);
|
|
1467
|
-
return existsSync5(skillPath);
|
|
1470
|
+
return existsSync5(skillPath) || isSymlink(skillPath);
|
|
1468
1471
|
});
|
|
1469
|
-
if (
|
|
1472
|
+
if (hasAnySkill) hasAnyComponent = true;
|
|
1470
1473
|
}
|
|
1471
1474
|
if (manifest.installed_agents && manifest.installed_agents.length > 0) {
|
|
1472
1475
|
const hasAnyAgent = manifest.installed_agents.some((agentId) => {
|
|
1473
1476
|
const agentPath = join5(agentsDir, agentId);
|
|
1474
|
-
|
|
1477
|
+
const agentPathMd = join5(agentsDir, agentId + ".md");
|
|
1478
|
+
return existsSync5(agentPath) || isSymlink(agentPath) || existsSync5(agentPathMd) || isSymlink(agentPathMd);
|
|
1475
1479
|
});
|
|
1476
|
-
if (
|
|
1480
|
+
if (hasAnyAgent) hasAnyComponent = true;
|
|
1477
1481
|
}
|
|
1478
1482
|
const agentsFileName = getAgentsFileName(tool);
|
|
1479
1483
|
const configFilePath = level === "project" ? join5(configRoot, "..", agentsFileName) : join5(configRoot, agentsFileName);
|
|
1480
|
-
if (
|
|
1481
|
-
|
|
1484
|
+
if (existsSync5(configFilePath) || isSymlink(configFilePath)) hasAnyComponent = true;
|
|
1485
|
+
const pluginManifestPath = join5(configRoot, `${manifest.team}-manifest.json`);
|
|
1486
|
+
if (existsSync5(pluginManifestPath)) hasAnyComponent = true;
|
|
1487
|
+
return hasAnyComponent;
|
|
1482
1488
|
}
|
|
1483
1489
|
var init_manifest = __esm({
|
|
1484
1490
|
"src/core/manifest.ts"() {
|
|
1485
1491
|
"use strict";
|
|
1486
1492
|
init_paths();
|
|
1487
1493
|
init_registry();
|
|
1494
|
+
init_fs_helpers();
|
|
1488
1495
|
}
|
|
1489
1496
|
});
|
|
1490
1497
|
|
|
@@ -2699,7 +2706,7 @@ init_fs();
|
|
|
2699
2706
|
init_fs_helpers();
|
|
2700
2707
|
init_logger();
|
|
2701
2708
|
init_i18n();
|
|
2702
|
-
import { existsSync as existsSync11, mkdirSync as mkdirSync4, readFileSync as readFileSync7, unlinkSync as unlinkSync3 } from "fs";
|
|
2709
|
+
import { existsSync as existsSync11, mkdirSync as mkdirSync4, readFileSync as readFileSync7, unlinkSync as unlinkSync3, readdirSync as readdirSync3 } from "fs";
|
|
2703
2710
|
import { join as join10 } from "path";
|
|
2704
2711
|
function getInstallsDir() {
|
|
2705
2712
|
return join10(getCannbotConfigDir(), "installs");
|
|
@@ -2734,7 +2741,7 @@ function deleteRecord(pluginId) {
|
|
|
2734
2741
|
unlinkSync3(recordPath);
|
|
2735
2742
|
}
|
|
2736
2743
|
}
|
|
2737
|
-
function scanInstalledFiles(pluginId, displayName, tool, level, installPath, configRoot, manifest, externalRepoNames) {
|
|
2744
|
+
function scanInstalledFiles(pluginId, displayName, tool, level, installPath, configRoot, manifest, externalRepoNames, configRootConfigLink) {
|
|
2738
2745
|
const files = [];
|
|
2739
2746
|
const directories = [];
|
|
2740
2747
|
if (manifest) {
|
|
@@ -2776,9 +2783,15 @@ function scanInstalledFiles(pluginId, displayName, tool, level, installPath, con
|
|
|
2776
2783
|
}
|
|
2777
2784
|
const configFileName = tool === "claude" ? "CLAUDE.md" : "AGENTS.md";
|
|
2778
2785
|
const configFilePath = level === "project" ? join10(installPath, configFileName) : join10(configRoot, configFileName);
|
|
2779
|
-
if (existsSync11(configFilePath)) {
|
|
2786
|
+
if (existsSync11(configFilePath) || isSymlink(configFilePath)) {
|
|
2780
2787
|
files.push(configFilePath);
|
|
2781
2788
|
}
|
|
2789
|
+
if (level === "project" && configRootConfigLink !== false) {
|
|
2790
|
+
const configRootConfigPath = join10(configRoot, configFileName);
|
|
2791
|
+
if (configRootConfigPath !== configFilePath && (existsSync11(configRootConfigPath) || isSymlink(configRootConfigPath))) {
|
|
2792
|
+
files.push(configRootConfigPath);
|
|
2793
|
+
}
|
|
2794
|
+
}
|
|
2782
2795
|
const repoLinks = externalRepoNames && externalRepoNames.length > 0 ? externalRepoNames : ["asc-devkit", "pypto", "tilelang-ascend", "cann-recipes-infer", "cann-samples"];
|
|
2783
2796
|
for (const repoName of repoLinks) {
|
|
2784
2797
|
const repoLinkPath = join10(installPath, repoName);
|
|
@@ -2843,12 +2856,14 @@ function addSkillsToRecord(skillIds, tool, level, installPath) {
|
|
|
2843
2856
|
}
|
|
2844
2857
|
}
|
|
2845
2858
|
entry.installTime = now;
|
|
2846
|
-
if (
|
|
2847
|
-
|
|
2848
|
-
|
|
2849
|
-
|
|
2850
|
-
|
|
2851
|
-
|
|
2859
|
+
if (newSkills.length > 0) {
|
|
2860
|
+
if (!entry.batches) entry.batches = [];
|
|
2861
|
+
entry.batches.push({
|
|
2862
|
+
batchId: `batch-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
2863
|
+
installedAt: now,
|
|
2864
|
+
skills: newSkills
|
|
2865
|
+
});
|
|
2866
|
+
}
|
|
2852
2867
|
writeSkillRecord(record);
|
|
2853
2868
|
}
|
|
2854
2869
|
function removeSkillsFromRecord(skillIds, tool, level, installPath) {
|
|
@@ -2881,10 +2896,25 @@ function getInstalledSkills(tool, level, installPath) {
|
|
|
2881
2896
|
const recordedSkills = record[tool]?.[level]?.[installPath]?.skills || [];
|
|
2882
2897
|
const configRoot = getConfigRoot(tool, level);
|
|
2883
2898
|
const skillsDir = join10(configRoot, "skills");
|
|
2884
|
-
|
|
2899
|
+
const fromRecord = recordedSkills.filter((skillId) => {
|
|
2885
2900
|
const skillPath = join10(skillsDir, skillId);
|
|
2886
2901
|
return existsSync11(skillPath) || isSymlink(skillPath);
|
|
2887
2902
|
});
|
|
2903
|
+
const fromFs = [];
|
|
2904
|
+
if (existsSync11(skillsDir)) {
|
|
2905
|
+
try {
|
|
2906
|
+
const entries = readdirSync3(skillsDir);
|
|
2907
|
+
for (const entry of entries) {
|
|
2908
|
+
if (entry === "." || entry === "..") continue;
|
|
2909
|
+
const entryPath = join10(skillsDir, entry);
|
|
2910
|
+
if (isSymlink(entryPath) && !fromRecord.includes(entry)) {
|
|
2911
|
+
fromFs.push(entry);
|
|
2912
|
+
}
|
|
2913
|
+
}
|
|
2914
|
+
} catch {
|
|
2915
|
+
}
|
|
2916
|
+
}
|
|
2917
|
+
return [...fromRecord, ...fromFs];
|
|
2888
2918
|
}
|
|
2889
2919
|
function getLastBatchSkills(tool, level, installPath) {
|
|
2890
2920
|
const record = readSkillRecord();
|
|
@@ -2903,7 +2933,7 @@ function getLastBatchSkills(tool, level, installPath) {
|
|
|
2903
2933
|
|
|
2904
2934
|
// src/core/backup.ts
|
|
2905
2935
|
init_manifest();
|
|
2906
|
-
import { existsSync as existsSync12, copyFileSync, readdirSync as
|
|
2936
|
+
import { existsSync as existsSync12, copyFileSync, readdirSync as readdirSync4, unlinkSync as unlinkSync4 } from "fs";
|
|
2907
2937
|
import { join as join11 } from "path";
|
|
2908
2938
|
init_registry();
|
|
2909
2939
|
init_paths();
|
|
@@ -2968,7 +2998,7 @@ function findBackups(configRoot) {
|
|
|
2968
2998
|
if (!existsSync12(configRoot)) {
|
|
2969
2999
|
return [];
|
|
2970
3000
|
}
|
|
2971
|
-
const files =
|
|
3001
|
+
const files = readdirSync4(configRoot);
|
|
2972
3002
|
const backups = [];
|
|
2973
3003
|
for (const file of files) {
|
|
2974
3004
|
if (file.includes(".cannbot-backup.")) {
|
|
@@ -3434,7 +3464,8 @@ async function installPlugin(opts) {
|
|
|
3434
3464
|
cwd,
|
|
3435
3465
|
configRoot,
|
|
3436
3466
|
result.manifest,
|
|
3437
|
-
plugin.externalRepos?.map((r) => basename2(r.dir))
|
|
3467
|
+
plugin.externalRepos?.map((r) => basename2(r.dir)),
|
|
3468
|
+
plugin.configRootConfigLink
|
|
3438
3469
|
);
|
|
3439
3470
|
if (backupInfo) {
|
|
3440
3471
|
record.backup = {
|
|
@@ -3520,7 +3551,8 @@ async function installPlugin(opts) {
|
|
|
3520
3551
|
cwd,
|
|
3521
3552
|
configRoot,
|
|
3522
3553
|
manifest,
|
|
3523
|
-
plugin.externalRepos?.map((r) => basename2(r.dir))
|
|
3554
|
+
plugin.externalRepos?.map((r) => basename2(r.dir)),
|
|
3555
|
+
plugin.configRootConfigLink
|
|
3524
3556
|
);
|
|
3525
3557
|
if (backupInfo) {
|
|
3526
3558
|
record.backup = {
|
|
@@ -3564,7 +3596,7 @@ init_fs_helpers();
|
|
|
3564
3596
|
init_constants();
|
|
3565
3597
|
init_logger();
|
|
3566
3598
|
init_i18n();
|
|
3567
|
-
import { existsSync as existsSync15, mkdirSync as mkdirSync6, symlinkSync as symlinkSync2, readdirSync as
|
|
3599
|
+
import { existsSync as existsSync15, mkdirSync as mkdirSync6, symlinkSync as symlinkSync2, readdirSync as readdirSync5, rmSync as rmSync4, realpathSync as realpathSync2, readlinkSync as readlinkSync2, cpSync as cpSync2 } from "fs";
|
|
3568
3600
|
import { join as join14, dirname as dirname5, isAbsolute } from "path";
|
|
3569
3601
|
import { select as select3, checkbox, Separator as Separator2 } from "@inquirer/prompts";
|
|
3570
3602
|
import chalk5 from "chalk";
|
|
@@ -3664,7 +3696,7 @@ async function uninstallSkills(skillIds, tool, level) {
|
|
|
3664
3696
|
}
|
|
3665
3697
|
if (existsSync15(skillsDir)) {
|
|
3666
3698
|
try {
|
|
3667
|
-
const entries =
|
|
3699
|
+
const entries = readdirSync5(skillsDir);
|
|
3668
3700
|
if (entries.length === 0) {
|
|
3669
3701
|
rmSync4(skillsDir, { recursive: true });
|
|
3670
3702
|
logger.step(` ${t("uninstall_clean_empty_dir")}: skills/`);
|
|
@@ -3826,6 +3858,55 @@ async function interactiveSkillUnselect(tool, level) {
|
|
|
3826
3858
|
logger.warn(t("uninstall_no_installed_skills"));
|
|
3827
3859
|
return "back";
|
|
3828
3860
|
}
|
|
3861
|
+
if (installedSkills.length <= 15) {
|
|
3862
|
+
return await flatSkillUnselect(installedSkills);
|
|
3863
|
+
}
|
|
3864
|
+
return await categorySkillUnselect(installedSkills);
|
|
3865
|
+
}
|
|
3866
|
+
async function flatSkillUnselect(installedSkills) {
|
|
3867
|
+
const categories = getAllCategories();
|
|
3868
|
+
const installedSet = new Set(installedSkills);
|
|
3869
|
+
const skillChoices = [
|
|
3870
|
+
...installedSkills.map((skillId) => {
|
|
3871
|
+
const skill = findSkill(skillId);
|
|
3872
|
+
const cat = categories.find((c) => c.skills.some((s) => s.id === skillId));
|
|
3873
|
+
const catName = cat ? cat.name : "";
|
|
3874
|
+
const desc = skill?.description || "";
|
|
3875
|
+
return {
|
|
3876
|
+
name: `${chalk5.cyan(skillId)}${catName ? chalk5.dim(` [${catName}]`) : ""}`,
|
|
3877
|
+
value: skillId,
|
|
3878
|
+
checked: false,
|
|
3879
|
+
description: desc
|
|
3880
|
+
};
|
|
3881
|
+
})
|
|
3882
|
+
];
|
|
3883
|
+
printBoxTitle(t("uninstall_interactive_title"));
|
|
3884
|
+
logger.info(chalk5.dim(` ${t("uninstall_checkbox_hint_select")}`));
|
|
3885
|
+
logger.blank();
|
|
3886
|
+
showOperationHints(true);
|
|
3887
|
+
const selected = await checkbox({
|
|
3888
|
+
message: t("uninstall_select_items"),
|
|
3889
|
+
choices: skillChoices,
|
|
3890
|
+
loop: false,
|
|
3891
|
+
instructions: false,
|
|
3892
|
+
theme: checkboxTheme,
|
|
3893
|
+
pageSize: 20
|
|
3894
|
+
});
|
|
3895
|
+
if (selected.length === 0) {
|
|
3896
|
+
logger.info(t("uninstall_nothing_to_uninstall"));
|
|
3897
|
+
return "back";
|
|
3898
|
+
}
|
|
3899
|
+
const confirmed = await confirm({
|
|
3900
|
+
message: t("uninstall_confirm_prompt").replace("{count}", chalk5.bold(String(selected.length))),
|
|
3901
|
+
default: false
|
|
3902
|
+
});
|
|
3903
|
+
if (!confirmed) return "cancel";
|
|
3904
|
+
return {
|
|
3905
|
+
toUninstall: selected,
|
|
3906
|
+
toKeep: installedSkills.filter((id) => !selected.includes(id))
|
|
3907
|
+
};
|
|
3908
|
+
}
|
|
3909
|
+
async function categorySkillUnselect(installedSkills) {
|
|
3829
3910
|
const allCategories = getAllCategories();
|
|
3830
3911
|
const installedSet = new Set(installedSkills);
|
|
3831
3912
|
const categoriesWithInstalled = allCategories.map((cat) => ({
|
|
@@ -3842,14 +3923,13 @@ async function interactiveSkillUnselect(tool, level) {
|
|
|
3842
3923
|
skills: uncategorized.map((id) => ({ id, description: "", source: "", filePath: "" }))
|
|
3843
3924
|
});
|
|
3844
3925
|
}
|
|
3845
|
-
|
|
3926
|
+
const uninstallSet = /* @__PURE__ */ new Set();
|
|
3846
3927
|
let step = 0;
|
|
3847
3928
|
let selectedCategoryId = "";
|
|
3848
3929
|
while (true) {
|
|
3849
3930
|
switch (step) {
|
|
3850
3931
|
case 0: {
|
|
3851
|
-
const
|
|
3852
|
-
const titleSuffix = toUninstallCount > 0 ? `${t("wizard_step_3_skill_title")}\uFF08${t("uninstall_marked_count").replace("{count}", String(toUninstallCount))}\uFF09` : t("wizard_step_3_skill_title");
|
|
3932
|
+
const titleSuffix = uninstallSet.size > 0 ? `${t("wizard_step_3_skill_title")}\uFF08${t("uninstall_marked_count").replace("{count}", String(uninstallSet.size))}\uFF09` : t("wizard_step_3_skill_title");
|
|
3853
3933
|
printBoxTitle(titleSuffix);
|
|
3854
3934
|
const categoryChoices = [
|
|
3855
3935
|
{
|
|
@@ -3858,16 +3938,15 @@ async function interactiveSkillUnselect(tool, level) {
|
|
|
3858
3938
|
},
|
|
3859
3939
|
new Separator2("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),
|
|
3860
3940
|
...categoriesWithInstalled.map((cat) => {
|
|
3861
|
-
const
|
|
3862
|
-
const
|
|
3863
|
-
const suffix = catUninstallCount > 0 ? chalk5.yellow(` (${catUninstallCount} to uninstall)`) : "";
|
|
3941
|
+
const catSelectedCount = cat.skills.filter((s) => uninstallSet.has(s.id)).length;
|
|
3942
|
+
const suffix = catSelectedCount > 0 ? chalk5.yellow(` (${catSelectedCount} selected)`) : "";
|
|
3864
3943
|
return {
|
|
3865
3944
|
name: `> ${cat.name} (${cat.skills.length} skills)${suffix}`,
|
|
3866
3945
|
value: cat.id
|
|
3867
3946
|
};
|
|
3868
3947
|
}),
|
|
3869
3948
|
new Separator2("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),
|
|
3870
|
-
...
|
|
3949
|
+
...uninstallSet.size > 0 ? [{ name: `>> ${t("uninstall_confirm_count").replace("{count}", String(uninstallSet.size))}`, value: "uninstall" }] : [],
|
|
3871
3950
|
{ name: "<- " + t("wizard_back"), value: BACK },
|
|
3872
3951
|
{ name: "x " + t("wizard_cancel"), value: CANCEL }
|
|
3873
3952
|
];
|
|
@@ -3882,22 +3961,27 @@ async function interactiveSkillUnselect(tool, level) {
|
|
|
3882
3961
|
if (selectedCategoryId === BACK) return "back";
|
|
3883
3962
|
if (selectedCategoryId === CANCEL) return "cancel";
|
|
3884
3963
|
if (selectedCategoryId === UNSELECT_ALL) {
|
|
3885
|
-
|
|
3886
|
-
|
|
3887
|
-
|
|
3964
|
+
for (const id of installedSkills) {
|
|
3965
|
+
uninstallSet.add(id);
|
|
3966
|
+
}
|
|
3967
|
+
const confirmed = await confirm({
|
|
3968
|
+
message: t("uninstall_confirm_prompt").replace("{count}", chalk5.bold(String(installedSkills.length))),
|
|
3969
|
+
default: false
|
|
3970
|
+
});
|
|
3971
|
+
if (!confirmed) return "cancel";
|
|
3972
|
+
return { toUninstall: [...uninstallSet], toKeep: [] };
|
|
3888
3973
|
}
|
|
3889
3974
|
if (selectedCategoryId === "uninstall") {
|
|
3890
|
-
|
|
3891
|
-
if (toUninstall.length === 0) {
|
|
3975
|
+
if (uninstallSet.size === 0) {
|
|
3892
3976
|
logger.info(t("uninstall_nothing_to_uninstall"));
|
|
3893
3977
|
return "back";
|
|
3894
3978
|
}
|
|
3895
3979
|
const confirmed = await confirm({
|
|
3896
|
-
message: t("uninstall_confirm_prompt").replace("{count}", chalk5.bold(String(
|
|
3980
|
+
message: t("uninstall_confirm_prompt").replace("{count}", chalk5.bold(String(uninstallSet.size))),
|
|
3897
3981
|
default: false
|
|
3898
3982
|
});
|
|
3899
3983
|
if (!confirmed) return "cancel";
|
|
3900
|
-
return { toUninstall
|
|
3984
|
+
return { toUninstall: [...uninstallSet], toKeep: installedSkills.filter((id) => !uninstallSet.has(id)) };
|
|
3901
3985
|
}
|
|
3902
3986
|
step = 1;
|
|
3903
3987
|
break;
|
|
@@ -3907,26 +3991,26 @@ async function interactiveSkillUnselect(tool, level) {
|
|
|
3907
3991
|
if (!category) return "back";
|
|
3908
3992
|
printBoxTitle(t("wizard_step_4_skill_title").replace("{category}", category.name));
|
|
3909
3993
|
const categorySkillIds = new Set(category.skills.map((s) => s.id));
|
|
3910
|
-
const
|
|
3994
|
+
const selectedInCategory = new Set([...uninstallSet].filter((id) => categorySkillIds.has(id)));
|
|
3911
3995
|
const skillChoices = [
|
|
3912
3996
|
{
|
|
3913
3997
|
name: `>> ${t("uninstall_uncheck_all_category")}`,
|
|
3914
3998
|
value: SELECT_ALL_CATEGORY,
|
|
3915
|
-
checked:
|
|
3999
|
+
checked: selectedInCategory.size === category.skills.length,
|
|
3916
4000
|
description: t("uninstall_uncheck_all_category")
|
|
3917
4001
|
},
|
|
3918
4002
|
new Separator2("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),
|
|
3919
4003
|
...category.skills.map((skill) => {
|
|
3920
|
-
const
|
|
4004
|
+
const isSelected = selectedInCategory.has(skill.id);
|
|
3921
4005
|
return {
|
|
3922
4006
|
name: `${chalk5.cyan(skill.id)}`,
|
|
3923
4007
|
value: skill.id,
|
|
3924
|
-
checked:
|
|
4008
|
+
checked: isSelected,
|
|
3925
4009
|
description: skill.description || ""
|
|
3926
4010
|
};
|
|
3927
4011
|
})
|
|
3928
4012
|
];
|
|
3929
|
-
logger.info(chalk5.dim(` ${t("
|
|
4013
|
+
logger.info(chalk5.dim(` ${t("uninstall_checkbox_hint_select")}`));
|
|
3930
4014
|
logger.blank();
|
|
3931
4015
|
showOperationHints(true);
|
|
3932
4016
|
const selectedSkills = await checkbox({
|
|
@@ -3937,20 +4021,20 @@ async function interactiveSkillUnselect(tool, level) {
|
|
|
3937
4021
|
theme: checkboxTheme,
|
|
3938
4022
|
pageSize: 15
|
|
3939
4023
|
});
|
|
3940
|
-
let
|
|
4024
|
+
let selectedInCat;
|
|
3941
4025
|
if (selectedSkills.includes(SELECT_ALL_CATEGORY)) {
|
|
3942
|
-
|
|
4026
|
+
selectedInCat = category.skills.map((s) => s.id);
|
|
3943
4027
|
} else {
|
|
3944
|
-
|
|
4028
|
+
selectedInCat = selectedSkills.filter((id) => id !== SELECT_ALL_CATEGORY);
|
|
3945
4029
|
}
|
|
3946
4030
|
for (const id of categorySkillIds) {
|
|
3947
|
-
if (
|
|
3948
|
-
|
|
4031
|
+
if (selectedInCat.includes(id)) {
|
|
4032
|
+
uninstallSet.add(id);
|
|
3949
4033
|
} else {
|
|
3950
|
-
|
|
4034
|
+
uninstallSet.delete(id);
|
|
3951
4035
|
}
|
|
3952
4036
|
}
|
|
3953
|
-
const toUninstallCount =
|
|
4037
|
+
const toUninstallCount = uninstallSet.size;
|
|
3954
4038
|
const action = await select3({
|
|
3955
4039
|
message: toUninstallCount > 0 ? t("uninstall_continue_or_confirm").replace("{count}", String(toUninstallCount)) : t("wizard_no_selection"),
|
|
3956
4040
|
choices: toUninstallCount > 0 ? [
|
|
@@ -3968,17 +4052,16 @@ async function interactiveSkillUnselect(tool, level) {
|
|
|
3968
4052
|
theme: selectTheme
|
|
3969
4053
|
});
|
|
3970
4054
|
if (action === "uninstall") {
|
|
3971
|
-
|
|
3972
|
-
if (toUninstall.length === 0) {
|
|
4055
|
+
if (uninstallSet.size === 0) {
|
|
3973
4056
|
logger.info(t("uninstall_nothing_to_uninstall"));
|
|
3974
4057
|
return "back";
|
|
3975
4058
|
}
|
|
3976
4059
|
const confirmed = await confirm({
|
|
3977
|
-
message: t("uninstall_confirm_prompt").replace("{count}", chalk5.bold(String(
|
|
4060
|
+
message: t("uninstall_confirm_prompt").replace("{count}", chalk5.bold(String(uninstallSet.size))),
|
|
3978
4061
|
default: false
|
|
3979
4062
|
});
|
|
3980
4063
|
if (!confirmed) return "cancel";
|
|
3981
|
-
return { toUninstall
|
|
4064
|
+
return { toUninstall: [...uninstallSet], toKeep: installedSkills.filter((id) => !uninstallSet.has(id)) };
|
|
3982
4065
|
}
|
|
3983
4066
|
if (action === CONTINUE_SELECT) {
|
|
3984
4067
|
step = 0;
|
|
@@ -4376,7 +4459,7 @@ init_manifest();
|
|
|
4376
4459
|
init_paths();
|
|
4377
4460
|
init_i18n();
|
|
4378
4461
|
import chalk8 from "chalk";
|
|
4379
|
-
import { existsSync as existsSync17, readdirSync as
|
|
4462
|
+
import { existsSync as existsSync17, readdirSync as readdirSync6, lstatSync as lstatSync2, unlinkSync as unlinkSync5, mkdirSync as mkdirSync7 } from "fs";
|
|
4380
4463
|
import { join as join16 } from "path";
|
|
4381
4464
|
async function doctorCommand(options = {}) {
|
|
4382
4465
|
console.log();
|
|
@@ -4435,7 +4518,7 @@ async function doctorCommand(options = {}) {
|
|
|
4435
4518
|
if (existsSync17(skillsDir)) {
|
|
4436
4519
|
const brokenLinks = checkBrokenLinks(skillsDir);
|
|
4437
4520
|
if (brokenLinks === 0) {
|
|
4438
|
-
const count =
|
|
4521
|
+
const count = readdirSync6(skillsDir).length;
|
|
4439
4522
|
console.log(chalk8.green(" \u2713") + ` ${skillsDir} \u2014 ${t("doctor_links_valid").replace("{count}", String(count))}`);
|
|
4440
4523
|
} else {
|
|
4441
4524
|
console.log(chalk8.yellow(" \u26A0") + ` ${skillsDir} \u2014 ${t("doctor_broken_links").replace("{count}", String(brokenLinks))}`);
|
|
@@ -4457,7 +4540,7 @@ async function doctorCommand(options = {}) {
|
|
|
4457
4540
|
if (existsSync17(agentsDir)) {
|
|
4458
4541
|
const brokenLinks = checkBrokenLinks(agentsDir);
|
|
4459
4542
|
if (brokenLinks === 0) {
|
|
4460
|
-
const count =
|
|
4543
|
+
const count = readdirSync6(agentsDir).length;
|
|
4461
4544
|
console.log(chalk8.green(" \u2713") + ` ${agentsDir} \u2014 ${t("doctor_links_valid").replace("{count}", String(count))}`);
|
|
4462
4545
|
} else {
|
|
4463
4546
|
console.log(chalk8.yellow(" \u26A0") + ` ${agentsDir} \u2014 ${t("doctor_broken_links").replace("{count}", String(brokenLinks))}`);
|
|
@@ -4504,7 +4587,7 @@ async function doctorCommand(options = {}) {
|
|
|
4504
4587
|
function checkBrokenLinks(dir) {
|
|
4505
4588
|
let broken = 0;
|
|
4506
4589
|
try {
|
|
4507
|
-
const entries =
|
|
4590
|
+
const entries = readdirSync6(dir);
|
|
4508
4591
|
for (const entry of entries) {
|
|
4509
4592
|
const fullPath = join16(dir, entry);
|
|
4510
4593
|
try {
|
|
@@ -4525,7 +4608,7 @@ function checkBrokenLinks(dir) {
|
|
|
4525
4608
|
function fixBrokenLinks(dir) {
|
|
4526
4609
|
let fixed = 0;
|
|
4527
4610
|
try {
|
|
4528
|
-
const entries =
|
|
4611
|
+
const entries = readdirSync6(dir);
|
|
4529
4612
|
for (const entry of entries) {
|
|
4530
4613
|
const fullPath = join16(dir, entry);
|
|
4531
4614
|
try {
|
|
@@ -4912,8 +4995,8 @@ async function installPlugins(pluginIds, tool, level, repoPath, installPath, yes
|
|
|
4912
4995
|
|
|
4913
4996
|
// src/commands/uninstall.ts
|
|
4914
4997
|
init_registry();
|
|
4915
|
-
import { existsSync as existsSync18, unlinkSync as unlinkSync6, rmdirSync, readdirSync as
|
|
4916
|
-
import { resolve, basename as basename3, sep } from "path";
|
|
4998
|
+
import { existsSync as existsSync18, unlinkSync as unlinkSync6, rmdirSync, readdirSync as readdirSync7 } from "fs";
|
|
4999
|
+
import { resolve, basename as basename3, sep, join as join18 } from "path";
|
|
4917
5000
|
import chalk11 from "chalk";
|
|
4918
5001
|
import { select as select5, checkbox as checkbox2, Separator as Separator4, confirm as confirm3 } from "@inquirer/prompts";
|
|
4919
5002
|
init_config();
|
|
@@ -4925,6 +5008,8 @@ init_manifest();
|
|
|
4925
5008
|
init_theme();
|
|
4926
5009
|
init_wizard();
|
|
4927
5010
|
async function uninstallCommand(names, options) {
|
|
5011
|
+
const userSpecifiedTool = !!options.tool;
|
|
5012
|
+
const userSpecifiedLevel = !!options.level;
|
|
4928
5013
|
const tool = options.tool ? validateTool(options.tool) : "opencode";
|
|
4929
5014
|
const level = options.level ? validateLevel(options.level) : "project";
|
|
4930
5015
|
if (options.all) {
|
|
@@ -4936,7 +5021,7 @@ async function uninstallCommand(names, options) {
|
|
|
4936
5021
|
return;
|
|
4937
5022
|
}
|
|
4938
5023
|
if (names.length === 0) {
|
|
4939
|
-
await uninstallInteractive(tool, level);
|
|
5024
|
+
await uninstallInteractive(tool, level, userSpecifiedTool, userSpecifiedLevel);
|
|
4940
5025
|
return;
|
|
4941
5026
|
}
|
|
4942
5027
|
const plugins = [];
|
|
@@ -5028,27 +5113,69 @@ async function uninstallRecent(tool, level, yes) {
|
|
|
5028
5113
|
logger.success(t("skill_uninstall_done"));
|
|
5029
5114
|
logger.blank();
|
|
5030
5115
|
}
|
|
5031
|
-
async function uninstallInteractive(defaultTool, defaultLevel) {
|
|
5116
|
+
async function uninstallInteractive(defaultTool, defaultLevel, userSpecifiedTool, userSpecifiedLevel) {
|
|
5032
5117
|
let tool = defaultTool;
|
|
5033
5118
|
let level = defaultLevel;
|
|
5034
|
-
const
|
|
5035
|
-
|
|
5036
|
-
|
|
5037
|
-
|
|
5038
|
-
|
|
5039
|
-
|
|
5040
|
-
|
|
5041
|
-
|
|
5042
|
-
|
|
5043
|
-
|
|
5044
|
-
|
|
5045
|
-
|
|
5046
|
-
|
|
5047
|
-
|
|
5048
|
-
|
|
5119
|
+
const allInstalledPlugins = scanInstalled();
|
|
5120
|
+
const toolsWithPlugins = new Set(allInstalledPlugins.map((p) => `${p.tool}:${p.level}`));
|
|
5121
|
+
const toolsWithSkills = /* @__PURE__ */ new Set();
|
|
5122
|
+
for (const toolName of ["opencode", "claude", "trae", "cursor", "copilot", "codearts"]) {
|
|
5123
|
+
for (const lvl of ["project", "global"]) {
|
|
5124
|
+
const ip = lvl === "project" ? process.cwd() : getConfigRoot(toolName, lvl);
|
|
5125
|
+
const skills = getInstalledSkills(toolName, lvl, ip);
|
|
5126
|
+
if (skills.length > 0) {
|
|
5127
|
+
toolsWithSkills.add(`${toolName}:${lvl}`);
|
|
5128
|
+
}
|
|
5129
|
+
}
|
|
5130
|
+
}
|
|
5131
|
+
const hasSkills = toolsWithSkills.size > 0;
|
|
5132
|
+
const hasPlugins = toolsWithPlugins.size > 0;
|
|
5133
|
+
if (!hasSkills && !hasPlugins) {
|
|
5134
|
+
logger.warn(t("uninstall_no_installed"));
|
|
5049
5135
|
return;
|
|
5050
5136
|
}
|
|
5051
|
-
|
|
5137
|
+
let uninstallType;
|
|
5138
|
+
if (hasSkills && hasPlugins) {
|
|
5139
|
+
printBoxTitle(t("uninstall_interactive_title"));
|
|
5140
|
+
const skillCount = [...toolsWithSkills].reduce((sum, key) => {
|
|
5141
|
+
const [toolName, lvl] = key.split(":");
|
|
5142
|
+
const ip = lvl === "project" ? process.cwd() : getConfigRoot(toolName, lvl);
|
|
5143
|
+
return sum + getInstalledSkills(toolName, lvl, ip).length;
|
|
5144
|
+
}, 0);
|
|
5145
|
+
const pluginCount = allInstalledPlugins.length;
|
|
5146
|
+
const typeChoices = [
|
|
5147
|
+
{ name: `> ${t("uninstall_type_skill")} (${skillCount})`, value: "skill" },
|
|
5148
|
+
{ name: `> ${t("uninstall_type_plugin")} (${pluginCount})`, value: "plugin" },
|
|
5149
|
+
new Separator4("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),
|
|
5150
|
+
{ name: "x " + t("wizard_cancel"), value: "cancel" }
|
|
5151
|
+
];
|
|
5152
|
+
showOperationHints();
|
|
5153
|
+
const choice = await select5({
|
|
5154
|
+
message: t("uninstall_select_type"),
|
|
5155
|
+
choices: typeChoices,
|
|
5156
|
+
loop: false,
|
|
5157
|
+
theme: selectTheme
|
|
5158
|
+
});
|
|
5159
|
+
if (choice === "cancel") {
|
|
5160
|
+
logger.info(t("init_cancelled"));
|
|
5161
|
+
return;
|
|
5162
|
+
}
|
|
5163
|
+
uninstallType = choice;
|
|
5164
|
+
} else if (hasSkills) {
|
|
5165
|
+
uninstallType = "skill";
|
|
5166
|
+
} else {
|
|
5167
|
+
uninstallType = "plugin";
|
|
5168
|
+
}
|
|
5169
|
+
const relevantKeys = uninstallType === "skill" ? toolsWithSkills : toolsWithPlugins;
|
|
5170
|
+
const toolsWithContent = /* @__PURE__ */ new Set();
|
|
5171
|
+
for (const key of relevantKeys) {
|
|
5172
|
+
toolsWithContent.add(key.split(":")[0]);
|
|
5173
|
+
}
|
|
5174
|
+
if (toolsWithContent.size === 1) {
|
|
5175
|
+
tool = [...toolsWithContent][0];
|
|
5176
|
+
} else if (userSpecifiedTool && toolsWithContent.has(defaultTool)) {
|
|
5177
|
+
tool = defaultTool;
|
|
5178
|
+
} else {
|
|
5052
5179
|
const detected = await selectToolWithDetection();
|
|
5053
5180
|
if (detected === "back" || detected === "cancel") {
|
|
5054
5181
|
logger.info(t("init_cancelled"));
|
|
@@ -5056,7 +5183,18 @@ async function uninstallInteractive(defaultTool, defaultLevel) {
|
|
|
5056
5183
|
}
|
|
5057
5184
|
tool = detected;
|
|
5058
5185
|
}
|
|
5059
|
-
|
|
5186
|
+
const levelsWithContent = /* @__PURE__ */ new Set();
|
|
5187
|
+
for (const key of relevantKeys) {
|
|
5188
|
+
const [toolName, lvl] = key.split(":");
|
|
5189
|
+
if (toolName === tool) {
|
|
5190
|
+
levelsWithContent.add(lvl);
|
|
5191
|
+
}
|
|
5192
|
+
}
|
|
5193
|
+
if (levelsWithContent.size === 1) {
|
|
5194
|
+
level = [...levelsWithContent][0];
|
|
5195
|
+
} else if (userSpecifiedLevel && levelsWithContent.has(defaultLevel)) {
|
|
5196
|
+
level = defaultLevel;
|
|
5197
|
+
} else {
|
|
5060
5198
|
const { stepLevel: stepLevel2 } = await Promise.resolve().then(() => (init_wizard(), wizard_exports));
|
|
5061
5199
|
const levelResult = await stepLevel2();
|
|
5062
5200
|
if (levelResult === "__back__" || levelResult === "__cancel__") {
|
|
@@ -5094,12 +5232,12 @@ async function interactivePluginUninstall(tool, level) {
|
|
|
5094
5232
|
...installed.map((inst) => ({
|
|
5095
5233
|
name: `${chalk11.cyan(inst.displayName)} ${chalk11.dim(`(${inst.id})`)}`,
|
|
5096
5234
|
value: inst.id,
|
|
5097
|
-
checked:
|
|
5235
|
+
checked: false,
|
|
5098
5236
|
description: `${inst.skillsCount} skills, ${inst.agentsCount} agents`
|
|
5099
5237
|
}))
|
|
5100
5238
|
];
|
|
5101
5239
|
printBoxTitle(t("uninstall_interactive_title"));
|
|
5102
|
-
logger.info(chalk11.dim(` ${t("
|
|
5240
|
+
logger.info(chalk11.dim(` ${t("uninstall_checkbox_hint_select")}`));
|
|
5103
5241
|
logger.blank();
|
|
5104
5242
|
showOperationHints(true);
|
|
5105
5243
|
const selected = await checkbox2({
|
|
@@ -5110,13 +5248,13 @@ async function interactivePluginUninstall(tool, level) {
|
|
|
5110
5248
|
theme: checkboxTheme,
|
|
5111
5249
|
pageSize: 15
|
|
5112
5250
|
});
|
|
5113
|
-
const toUninstall = installed.filter((inst) =>
|
|
5251
|
+
const toUninstall = installed.filter((inst) => selected.includes(inst.id));
|
|
5114
5252
|
if (toUninstall.length === 0) {
|
|
5115
5253
|
logger.info(t("uninstall_nothing_to_uninstall"));
|
|
5116
5254
|
return;
|
|
5117
5255
|
}
|
|
5118
5256
|
const confirmed = await confirm3({
|
|
5119
|
-
message: t("
|
|
5257
|
+
message: t("uninstall_confirm_prompt").replace("{count}", chalk11.bold(String(toUninstall.length))),
|
|
5120
5258
|
default: false
|
|
5121
5259
|
});
|
|
5122
5260
|
if (!confirmed) {
|
|
@@ -5154,7 +5292,15 @@ async function uninstallPluginById(pluginId, batchMode) {
|
|
|
5154
5292
|
};
|
|
5155
5293
|
let removedFiles = 0;
|
|
5156
5294
|
let removedDirs = 0;
|
|
5157
|
-
|
|
5295
|
+
const configFileName = record.tool === "claude" ? "CLAUDE.md" : "AGENTS.md";
|
|
5296
|
+
const configRootConfigPath = join18(configRoot, configFileName);
|
|
5297
|
+
const installPathConfigPath = join18(record.installPath, configFileName);
|
|
5298
|
+
const extraFiles = [];
|
|
5299
|
+
if (record.level === "project" && configRootConfigPath !== installPathConfigPath && !record.files.includes(configRootConfigPath) && (existsSync18(configRootConfigPath) || isSymlink(configRootConfigPath))) {
|
|
5300
|
+
extraFiles.push(configRootConfigPath);
|
|
5301
|
+
}
|
|
5302
|
+
const allFiles = [...record.files, ...extraFiles];
|
|
5303
|
+
for (const filePath of allFiles) {
|
|
5158
5304
|
if (!isSafePath(filePath)) continue;
|
|
5159
5305
|
try {
|
|
5160
5306
|
if (existsSync18(filePath) || isSymlink(filePath)) {
|
|
@@ -5173,7 +5319,7 @@ async function uninstallPluginById(pluginId, batchMode) {
|
|
|
5173
5319
|
continue;
|
|
5174
5320
|
}
|
|
5175
5321
|
if (existsSync18(dirPath)) {
|
|
5176
|
-
const entries =
|
|
5322
|
+
const entries = readdirSync7(dirPath);
|
|
5177
5323
|
if (entries.length === 0) {
|
|
5178
5324
|
rmdirSync(dirPath);
|
|
5179
5325
|
const name = basename3(dirPath);
|
|
@@ -5334,8 +5480,8 @@ async function updateCommand(pluginNames, options) {
|
|
|
5334
5480
|
// src/commands/info.ts
|
|
5335
5481
|
init_registry();
|
|
5336
5482
|
import chalk13 from "chalk";
|
|
5337
|
-
import { existsSync as existsSync19, readdirSync as
|
|
5338
|
-
import { join as
|
|
5483
|
+
import { existsSync as existsSync19, readdirSync as readdirSync8 } from "fs";
|
|
5484
|
+
import { join as join19 } from "path";
|
|
5339
5485
|
init_manifest();
|
|
5340
5486
|
init_i18n();
|
|
5341
5487
|
async function infoCommand(pluginName) {
|
|
@@ -5362,13 +5508,13 @@ async function infoCommand(pluginName) {
|
|
|
5362
5508
|
try {
|
|
5363
5509
|
const repoManager = createRepositoryManager();
|
|
5364
5510
|
const repoPath = await repoManager.ensureRepo();
|
|
5365
|
-
const quickstartPath =
|
|
5511
|
+
const quickstartPath = join19(repoPath, plugin.dir, "quickstart.md");
|
|
5366
5512
|
if (existsSync19(quickstartPath)) {
|
|
5367
5513
|
console.log(` ${chalk13.dim(t("info_quickstart") + ":")} ${quickstartPath}`);
|
|
5368
5514
|
}
|
|
5369
|
-
const agentsDir =
|
|
5515
|
+
const agentsDir = join19(repoPath, plugin.dir, "agents");
|
|
5370
5516
|
if (existsSync19(agentsDir)) {
|
|
5371
|
-
const agentFiles =
|
|
5517
|
+
const agentFiles = readdirSync8(agentsDir).filter((f) => f.endsWith(".md"));
|
|
5372
5518
|
if (agentFiles.length > 0) {
|
|
5373
5519
|
console.log();
|
|
5374
5520
|
console.log(` ${chalk13.bold("Agents:")}`);
|
|
@@ -5425,7 +5571,7 @@ init_config();
|
|
|
5425
5571
|
init_i18n();
|
|
5426
5572
|
import { readFileSync as readFileSync9, existsSync as existsSync20 } from "fs";
|
|
5427
5573
|
import { fileURLToPath as fileURLToPath4 } from "url";
|
|
5428
|
-
import { dirname as dirname6, join as
|
|
5574
|
+
import { dirname as dirname6, join as join20 } from "path";
|
|
5429
5575
|
function readVersion() {
|
|
5430
5576
|
try {
|
|
5431
5577
|
if (typeof INSTALL_HELPER_VERSION !== "undefined" && INSTALL_HELPER_VERSION) {
|
|
@@ -5437,9 +5583,9 @@ function readVersion() {
|
|
|
5437
5583
|
const __filename4 = fileURLToPath4(import.meta.url);
|
|
5438
5584
|
const __dirname4 = dirname6(__filename4);
|
|
5439
5585
|
const candidates = [
|
|
5440
|
-
|
|
5441
|
-
|
|
5442
|
-
|
|
5586
|
+
join20(__dirname4, "..", "package.json"),
|
|
5587
|
+
join20(__dirname4, "package.json"),
|
|
5588
|
+
join20(process.cwd(), "package.json")
|
|
5443
5589
|
];
|
|
5444
5590
|
for (const pkgPath of candidates) {
|
|
5445
5591
|
if (existsSync20(pkgPath)) {
|