eskill 1.2.1 → 1.2.2
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/cli.js +2 -2
- package/lib/installer.js +27 -11
- package/package.json +1 -1
package/cli.js
CHANGED
|
@@ -13,7 +13,7 @@ const program = new Command();
|
|
|
13
13
|
program
|
|
14
14
|
.name('eskill')
|
|
15
15
|
.description('Unified AI Agent Skills Management - Install skills from Git URLs')
|
|
16
|
-
.version('1.2.
|
|
16
|
+
.version('1.2.2')
|
|
17
17
|
.option('-g, --global', '使用全局技能目录(~/.eskill/skills/),否则使用当前目录(./.claude/skills/)', false);
|
|
18
18
|
|
|
19
19
|
// 安装命令
|
|
@@ -126,7 +126,7 @@ program
|
|
|
126
126
|
program
|
|
127
127
|
.command('link')
|
|
128
128
|
.description('将全局技能软链接到本地')
|
|
129
|
-
.argument('<name>', '
|
|
129
|
+
.argument('<name>', '技能名称(支持 name@author 格式)')
|
|
130
130
|
.action(async (name) => {
|
|
131
131
|
try {
|
|
132
132
|
const result = await linkSkill(name);
|
package/lib/installer.js
CHANGED
|
@@ -742,20 +742,27 @@ export function removeSkill(skillName, agent = 'claude', global = false) {
|
|
|
742
742
|
* 链接全局技能到本地
|
|
743
743
|
*/
|
|
744
744
|
export async function linkSkill(skillName) {
|
|
745
|
+
// 解析 skill-name@author 格式,提取实际技能名
|
|
746
|
+
let actualSkillName = skillName;
|
|
747
|
+
const match = skillName.match(/^([^@]+)@([^@]+)$/);
|
|
748
|
+
if (match) {
|
|
749
|
+
actualSkillName = match[1];
|
|
750
|
+
}
|
|
751
|
+
|
|
745
752
|
const globalSkillsDir = getSkillsDir(true);
|
|
746
753
|
const localSkillsDir = getSkillsDir(false);
|
|
747
754
|
|
|
748
|
-
const globalSkillPath = join(globalSkillsDir,
|
|
749
|
-
const localSkillPath = join(localSkillsDir,
|
|
755
|
+
const globalSkillPath = join(globalSkillsDir, actualSkillName);
|
|
756
|
+
const localSkillPath = join(localSkillsDir, actualSkillName);
|
|
750
757
|
|
|
751
758
|
// 检查全局是否存在该技能
|
|
752
759
|
if (!existsSync(globalSkillPath)) {
|
|
753
|
-
console.log(`\n❌ 全局仓库中不存在技能: ${
|
|
754
|
-
console.log(` 位置: ~/.eskill/skills/${
|
|
760
|
+
console.log(`\n❌ 全局仓库中不存在技能: ${actualSkillName}`);
|
|
761
|
+
console.log(` 位置: ~/.eskill/skills/${actualSkillName}\n`);
|
|
755
762
|
console.log(`💡 提示:`);
|
|
756
763
|
console.log(` - 使用 "eskill install -g ${skillName}" 先安装到全局仓库`);
|
|
757
764
|
console.log(` - 或使用 "eskill install" 直接安装到本地\n`);
|
|
758
|
-
throw new Error(`全局仓库中不存在技能: ${
|
|
765
|
+
throw new Error(`全局仓库中不存在技能: ${actualSkillName}`);
|
|
759
766
|
}
|
|
760
767
|
|
|
761
768
|
// 检查本地技能目录是否存在
|
|
@@ -775,7 +782,7 @@ export async function linkSkill(skillName) {
|
|
|
775
782
|
|
|
776
783
|
// 检查本地是否已存在同名技能
|
|
777
784
|
if (existsSync(localSkillPath)) {
|
|
778
|
-
console.log(`\n⚠️ 本地已存在同名技能: ${
|
|
785
|
+
console.log(`\n⚠️ 本地已存在同名技能: ${actualSkillName}`);
|
|
779
786
|
console.log(` 位置: ${localSkillPath}\n`);
|
|
780
787
|
|
|
781
788
|
const overwrite = await confirmAction('是否删除本地技能并创建软链接?');
|
|
@@ -797,15 +804,15 @@ export async function linkSkill(skillName) {
|
|
|
797
804
|
symlinkSync(globalSkillPath, localSkillPath, 'dir');
|
|
798
805
|
|
|
799
806
|
console.log(`✓ 软链接创建成功`);
|
|
800
|
-
console.log(` 技能: ${
|
|
807
|
+
console.log(` 技能: ${actualSkillName}`);
|
|
801
808
|
console.log(` 本地路径: ${localSkillPath}`);
|
|
802
809
|
console.log(` 全局路径: ${globalSkillPath}`);
|
|
803
810
|
console.log(` 说明: 本地技能指向全局仓库,全局更新会自动同步\n`);
|
|
804
811
|
|
|
805
812
|
// 保存元数据,标记来源为软链接
|
|
806
|
-
const globalMeta = getSkillMeta(
|
|
813
|
+
const globalMeta = getSkillMeta(actualSkillName, true);
|
|
807
814
|
if (globalMeta) {
|
|
808
|
-
saveSkillMeta(
|
|
815
|
+
saveSkillMeta(actualSkillName, {
|
|
809
816
|
...globalMeta,
|
|
810
817
|
source: 'symlink',
|
|
811
818
|
installedAt: new Date().toISOString(),
|
|
@@ -813,8 +820,8 @@ export async function linkSkill(skillName) {
|
|
|
813
820
|
}, false);
|
|
814
821
|
} else {
|
|
815
822
|
// 如果全局没有元数据,创建基础元数据
|
|
816
|
-
saveSkillMeta(
|
|
817
|
-
name:
|
|
823
|
+
saveSkillMeta(actualSkillName, {
|
|
824
|
+
name: actualSkillName,
|
|
818
825
|
source: 'symlink',
|
|
819
826
|
installedAt: new Date().toISOString(),
|
|
820
827
|
updatedAt: new Date().toISOString()
|
|
@@ -845,6 +852,15 @@ export function cleanupAllSkills(global = false) {
|
|
|
845
852
|
console.error(`清理失败: ${error.message}`);
|
|
846
853
|
throw error;
|
|
847
854
|
}
|
|
855
|
+
|
|
856
|
+
// 清空元数据文件
|
|
857
|
+
try {
|
|
858
|
+
saveAllSkillsMeta([], global);
|
|
859
|
+
const metaLocation = global ? '~/.eskill/skills/.eskill-meta.json' : './.eskill-meta.json';
|
|
860
|
+
console.log(`✓ 已清空元数据: ${metaLocation}`);
|
|
861
|
+
} catch (error) {
|
|
862
|
+
console.error(`清空元数据失败: ${error.message}`);
|
|
863
|
+
}
|
|
848
864
|
}
|
|
849
865
|
|
|
850
866
|
/**
|