yuangs 6.9.20 → 6.9.22
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/agent/promptSkills.d.ts +19 -5
- package/dist/agent/promptSkills.js +94 -16
- package/dist/agent/promptSkills.js.map +1 -1
- package/dist/commands/skillsCommands.js +33 -0
- package/dist/commands/skillsCommands.js.map +1 -1
- package/dist/core/skillLoader.d.ts +38 -0
- package/dist/core/skillLoader.js +97 -0
- package/dist/core/skillLoader.js.map +1 -0
- package/package.json +1 -1
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
* Skills 系统 - Prompt 模板模式
|
|
3
3
|
*
|
|
4
4
|
* 可配置的技能模板,动态生成 prompt,支持 allowedTools、model 等配置。
|
|
5
|
-
*
|
|
5
|
+
* 支持从磁盘加载用户自定义技能(Markdown + YAML frontmatter)。
|
|
6
6
|
*
|
|
7
7
|
* 与现有 skills.ts 的区别:
|
|
8
8
|
* - skills.ts: 基于学习历史自动积累技能
|
|
9
|
-
* -
|
|
9
|
+
* - promptSkills.ts: 预定义 + 用户自定义技能模板,即时匹配
|
|
10
10
|
*/
|
|
11
11
|
export interface SkillConfig {
|
|
12
12
|
name: string;
|
|
@@ -24,14 +24,28 @@ export interface SkillConfig {
|
|
|
24
24
|
/** 是否在命令模式下启用 */
|
|
25
25
|
enabledInCommandMode?: boolean;
|
|
26
26
|
}
|
|
27
|
+
export interface UserSkillInfo {
|
|
28
|
+
name: string;
|
|
29
|
+
description: string;
|
|
30
|
+
triggerPatterns: string[];
|
|
31
|
+
loaded: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 从磁盘加载用户自定义技能
|
|
35
|
+
*/
|
|
36
|
+
export declare function loadUserSkills(): UserSkillInfo[];
|
|
37
|
+
/**
|
|
38
|
+
* 获取所有已加载的用户技能信息
|
|
39
|
+
*/
|
|
40
|
+
export declare function getUserSkillInfos(): UserSkillInfo[];
|
|
27
41
|
/**
|
|
28
|
-
*
|
|
42
|
+
* 根据用户输入匹配最合适的技能(内置 + 用户自定义)
|
|
29
43
|
*/
|
|
30
44
|
export declare function matchSkill(userInput: string): SkillConfig | null;
|
|
31
45
|
/**
|
|
32
|
-
*
|
|
46
|
+
* 获取所有已注册的技能(内置 + 用户)
|
|
33
47
|
*/
|
|
34
|
-
export declare function
|
|
48
|
+
export declare function getAllPromptSkills(): SkillConfig[];
|
|
35
49
|
/**
|
|
36
50
|
* 生成技能的系统 prompt
|
|
37
51
|
*/
|
|
@@ -3,18 +3,23 @@
|
|
|
3
3
|
* Skills 系统 - Prompt 模板模式
|
|
4
4
|
*
|
|
5
5
|
* 可配置的技能模板,动态生成 prompt,支持 allowedTools、model 等配置。
|
|
6
|
-
*
|
|
6
|
+
* 支持从磁盘加载用户自定义技能(Markdown + YAML frontmatter)。
|
|
7
7
|
*
|
|
8
8
|
* 与现有 skills.ts 的区别:
|
|
9
9
|
* - skills.ts: 基于学习历史自动积累技能
|
|
10
|
-
* -
|
|
10
|
+
* - promptSkills.ts: 预定义 + 用户自定义技能模板,即时匹配
|
|
11
11
|
*/
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.loadUserSkills = loadUserSkills;
|
|
14
|
+
exports.getUserSkillInfos = getUserSkillInfos;
|
|
13
15
|
exports.matchSkill = matchSkill;
|
|
14
|
-
exports.
|
|
16
|
+
exports.getAllPromptSkills = getAllPromptSkills;
|
|
15
17
|
exports.generateSkillPrompt = generateSkillPrompt;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
+
const skillLoader_1 = require("../core/skillLoader");
|
|
19
|
+
// 内置 + 用户技能注册表
|
|
20
|
+
const builtinSkills = new Map();
|
|
21
|
+
const userSkills = new Map();
|
|
22
|
+
let userSkillsLoaded = false;
|
|
18
23
|
// ============================================================================
|
|
19
24
|
// 内置技能定义
|
|
20
25
|
// ============================================================================
|
|
@@ -94,18 +99,88 @@ const troubleshootingSkill = {
|
|
|
94
99
|
// ============================================================================
|
|
95
100
|
// 注册与匹配
|
|
96
101
|
// ============================================================================
|
|
97
|
-
function
|
|
102
|
+
function registerBuiltinSkills() {
|
|
98
103
|
for (const skill of [gitSkill, codeAnalysisSkill, fileOpsSkill, troubleshootingSkill]) {
|
|
99
|
-
|
|
104
|
+
builtinSkills.set(skill.name, skill);
|
|
100
105
|
}
|
|
101
106
|
}
|
|
102
107
|
/**
|
|
103
|
-
*
|
|
108
|
+
* 将用户文件技能转换为 SkillConfig
|
|
109
|
+
*/
|
|
110
|
+
function userSkillToConfig(skill) {
|
|
111
|
+
return {
|
|
112
|
+
name: skill.name,
|
|
113
|
+
description: skill.description,
|
|
114
|
+
triggers: skill.triggers.map(t => {
|
|
115
|
+
try {
|
|
116
|
+
return new RegExp(t, 'i');
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// 非法的正则表达式 fallback 为字面量匹配
|
|
120
|
+
return new RegExp(t.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i');
|
|
121
|
+
}
|
|
122
|
+
}),
|
|
123
|
+
allowedTools: skill.allowedTools,
|
|
124
|
+
model: skill.model,
|
|
125
|
+
maxTurns: skill.maxTurns || 15,
|
|
126
|
+
systemPrompt: skill.body,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 从磁盘加载用户自定义技能
|
|
131
|
+
*/
|
|
132
|
+
function loadUserSkills() {
|
|
133
|
+
userSkills.clear();
|
|
134
|
+
userSkillsLoaded = true;
|
|
135
|
+
const files = (0, skillLoader_1.loadAllUserSkills)();
|
|
136
|
+
const info = [];
|
|
137
|
+
for (const file of files) {
|
|
138
|
+
const config = userSkillToConfig(file);
|
|
139
|
+
userSkills.set(config.name, config);
|
|
140
|
+
info.push({
|
|
141
|
+
name: file.name,
|
|
142
|
+
description: file.description,
|
|
143
|
+
triggerPatterns: file.triggers,
|
|
144
|
+
loaded: true,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
return info;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* 获取所有已加载的用户技能信息
|
|
151
|
+
*/
|
|
152
|
+
function getUserSkillInfos() {
|
|
153
|
+
if (!userSkillsLoaded)
|
|
154
|
+
loadUserSkills();
|
|
155
|
+
const infos = [];
|
|
156
|
+
for (const [, skill] of userSkills) {
|
|
157
|
+
infos.push({
|
|
158
|
+
name: skill.name,
|
|
159
|
+
description: skill.description,
|
|
160
|
+
triggerPatterns: skill.triggers.map(r => r.source),
|
|
161
|
+
loaded: true,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return infos;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* 根据用户输入匹配最合适的技能(内置 + 用户自定义)
|
|
104
168
|
*/
|
|
105
169
|
function matchSkill(userInput) {
|
|
106
|
-
if (
|
|
107
|
-
|
|
108
|
-
|
|
170
|
+
if (builtinSkills.size === 0)
|
|
171
|
+
registerBuiltinSkills();
|
|
172
|
+
if (!userSkillsLoaded)
|
|
173
|
+
loadUserSkills();
|
|
174
|
+
// 先匹配用户自定义技能
|
|
175
|
+
for (const [, skill] of userSkills) {
|
|
176
|
+
for (const trigger of skill.triggers) {
|
|
177
|
+
if (trigger.test(userInput)) {
|
|
178
|
+
return skill;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// 再匹配内置技能
|
|
183
|
+
for (const [, skill] of builtinSkills) {
|
|
109
184
|
for (const trigger of skill.triggers) {
|
|
110
185
|
if (trigger.test(userInput)) {
|
|
111
186
|
return skill;
|
|
@@ -115,12 +190,15 @@ function matchSkill(userInput) {
|
|
|
115
190
|
return null;
|
|
116
191
|
}
|
|
117
192
|
/**
|
|
118
|
-
*
|
|
193
|
+
* 获取所有已注册的技能(内置 + 用户)
|
|
119
194
|
*/
|
|
120
|
-
function
|
|
121
|
-
if (
|
|
122
|
-
|
|
123
|
-
|
|
195
|
+
function getAllPromptSkills() {
|
|
196
|
+
if (builtinSkills.size === 0)
|
|
197
|
+
registerBuiltinSkills();
|
|
198
|
+
if (!userSkillsLoaded) {
|
|
199
|
+
loadUserSkills();
|
|
200
|
+
}
|
|
201
|
+
return [...builtinSkills.values(), ...userSkills.values()];
|
|
124
202
|
}
|
|
125
203
|
/**
|
|
126
204
|
* 生成技能的系统 prompt
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promptSkills.js","sourceRoot":"","sources":["../../src/agent/promptSkills.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;
|
|
1
|
+
{"version":3,"file":"promptSkills.js","sourceRoot":"","sources":["../../src/agent/promptSkills.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.registerSkillsCommands = registerSkillsCommands;
|
|
7
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
8
8
|
const skills_1 = require("../agent/skills");
|
|
9
|
+
const promptSkills_1 = require("../agent/promptSkills");
|
|
9
10
|
function registerSkillsCommands(program) {
|
|
10
11
|
const skillsProgram = program.command('skills').description('Skill management commands');
|
|
11
12
|
skillsProgram
|
|
@@ -72,5 +73,37 @@ function registerSkillsCommands(program) {
|
|
|
72
73
|
}
|
|
73
74
|
console.log(chalk_1.default.green(`✓ Skill "${name}" has been enabled\n`));
|
|
74
75
|
});
|
|
76
|
+
// === Prompt skills (markdown-defined) ===
|
|
77
|
+
skillsProgram
|
|
78
|
+
.command('prompt')
|
|
79
|
+
.description('List markdown-defined prompt skills')
|
|
80
|
+
.action(() => {
|
|
81
|
+
const infos = (0, promptSkills_1.getUserSkillInfos)();
|
|
82
|
+
if (infos.length === 0) {
|
|
83
|
+
console.log(chalk_1.default.gray('\n📭 No user-defined prompt skills found\n'));
|
|
84
|
+
console.log(chalk_1.default.gray(' Place .md files in ~/.yuangs/skills/ or .yuangs/skills/\n'));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
console.log(chalk_1.default.bold.cyan(`\n📦 Prompt Skills (${infos.length})\n`));
|
|
88
|
+
infos.forEach((info) => {
|
|
89
|
+
console.log(` ${chalk_1.default.green('●')} ${chalk_1.default.bold(info.name)}`);
|
|
90
|
+
console.log(chalk_1.default.gray(` ${info.description}`));
|
|
91
|
+
if (info.triggerPatterns.length > 0) {
|
|
92
|
+
console.log(chalk_1.default.gray(` Triggers: ${info.triggerPatterns.join(', ')}`));
|
|
93
|
+
}
|
|
94
|
+
console.log();
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
skillsProgram
|
|
98
|
+
.command('prompt-reload')
|
|
99
|
+
.description('Reload prompt skills from disk')
|
|
100
|
+
.action(() => {
|
|
101
|
+
const infos = (0, promptSkills_1.loadUserSkills)();
|
|
102
|
+
console.log(chalk_1.default.green(`✓ Loaded ${infos.length} prompt skill(s) from disk\n`));
|
|
103
|
+
infos.forEach((info) => {
|
|
104
|
+
console.log(` ${chalk_1.default.green('●')} ${chalk_1.default.bold(info.name)}`);
|
|
105
|
+
});
|
|
106
|
+
console.log();
|
|
107
|
+
});
|
|
75
108
|
}
|
|
76
109
|
//# sourceMappingURL=skillsCommands.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillsCommands.js","sourceRoot":"","sources":["../../src/commands/skillsCommands.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"skillsCommands.js","sourceRoot":"","sources":["../../src/commands/skillsCommands.ts"],"names":[],"mappings":";;;;;AAKA,wDAiHC;AAtHD,kDAA0B;AAE1B,4CAA6F;AAC7F,wDAA8F;AAE9F,SAAgB,sBAAsB,CAAC,OAAgB;IACnD,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC;IAEzF,aAAa;SACR,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iBAAiB,CAAC;SAC9B,MAAM,CAAC,GAAG,EAAE;QACT,MAAM,MAAM,GAAG,IAAA,qBAAY,GAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAChD,OAAO;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAEjE,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACrB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClE,MAAM,KAAK,GAAG,IAAA,0BAAiB,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YAE3E,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,YAAY,eAAe,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;YAC7F,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,WAAW,IAAI,CAAC,CAAC,CAAC;QACjG,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,aAAa;SACR,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACb,MAAM,MAAM,GAAG,IAAA,qBAAY,GAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;QAEjE,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,IAAI,eAAe,CAAC,CAAC,CAAC;YACxD,OAAO;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,YAAY,eAAe,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEP,aAAa;SACR,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,iBAAiB,CAAC;SAC9B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACb,MAAM,EAAE,GAAG,IAAA,qBAAY,EAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,EAAE,EAAE,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,IAAI,eAAe,CAAC,CAAC,CAAC;YACxD,OAAO;QACX,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,YAAY,IAAI,uBAAuB,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEP,aAAa;SACR,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,gBAAgB,CAAC;SAC7B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACb,MAAM,EAAE,GAAG,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,EAAE,EAAE,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,IAAI,eAAe,CAAC,CAAC,CAAC;YACxD,OAAO;QACX,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,YAAY,IAAI,sBAAsB,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEP,2CAA2C;IAC3C,aAAa;SACR,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,GAAG,EAAE;QACT,MAAM,KAAK,GAAG,IAAA,gCAAiB,GAAE,CAAC;QAElC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC,CAAC;YACvF,OAAO;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAEvE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACnB,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACnD,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAChF,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,aAAa;SACR,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,GAAG,EAAE;QACT,MAAM,KAAK,GAAG,IAAA,6BAAc,GAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,MAAM,8BAA8B,CAAC,CAAC,CAAC;QACjF,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACnB,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Loader - 从 Markdown 文件加载用户自定义技能
|
|
3
|
+
*
|
|
4
|
+
* 技能文件格式:Markdown + YAML frontmatter
|
|
5
|
+
* ---
|
|
6
|
+
* name: skill-name
|
|
7
|
+
* description: 一句话描述
|
|
8
|
+
* triggers:
|
|
9
|
+
* - 触发关键词或正则
|
|
10
|
+
* - another trigger
|
|
11
|
+
* allowedTools: [tool1, tool2]
|
|
12
|
+
* model: deepseek-v4-pro
|
|
13
|
+
* ---
|
|
14
|
+
*
|
|
15
|
+
* 技能内容(body)作为 systemPrompt 注入 AI 上下文。
|
|
16
|
+
*/
|
|
17
|
+
export interface UserSkillFile {
|
|
18
|
+
name: string;
|
|
19
|
+
description: string;
|
|
20
|
+
triggers: string[];
|
|
21
|
+
allowedTools?: string[];
|
|
22
|
+
model?: string;
|
|
23
|
+
maxTurns?: number;
|
|
24
|
+
/** Markdown body(frontmatter 之后的内容) */
|
|
25
|
+
body: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 解析单个 Markdown 技能文件
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseSkillFile(filePath: string): UserSkillFile | null;
|
|
31
|
+
/**
|
|
32
|
+
* 从指定目录加载所有技能文件
|
|
33
|
+
*/
|
|
34
|
+
export declare function loadSkillsFromDir(dir: string): UserSkillFile[];
|
|
35
|
+
/**
|
|
36
|
+
* 从所有默认目录加载技能
|
|
37
|
+
*/
|
|
38
|
+
export declare function loadAllUserSkills(): UserSkillFile[];
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Skill Loader - 从 Markdown 文件加载用户自定义技能
|
|
4
|
+
*
|
|
5
|
+
* 技能文件格式:Markdown + YAML frontmatter
|
|
6
|
+
* ---
|
|
7
|
+
* name: skill-name
|
|
8
|
+
* description: 一句话描述
|
|
9
|
+
* triggers:
|
|
10
|
+
* - 触发关键词或正则
|
|
11
|
+
* - another trigger
|
|
12
|
+
* allowedTools: [tool1, tool2]
|
|
13
|
+
* model: deepseek-v4-pro
|
|
14
|
+
* ---
|
|
15
|
+
*
|
|
16
|
+
* 技能内容(body)作为 systemPrompt 注入 AI 上下文。
|
|
17
|
+
*/
|
|
18
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
19
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.parseSkillFile = parseSkillFile;
|
|
23
|
+
exports.loadSkillsFromDir = loadSkillsFromDir;
|
|
24
|
+
exports.loadAllUserSkills = loadAllUserSkills;
|
|
25
|
+
const fs_1 = __importDefault(require("fs"));
|
|
26
|
+
const path_1 = __importDefault(require("path"));
|
|
27
|
+
const os_1 = __importDefault(require("os"));
|
|
28
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
29
|
+
const SKILL_DIRS = [
|
|
30
|
+
path_1.default.join(os_1.default.homedir(), '.yuangs', 'skills'),
|
|
31
|
+
path_1.default.join(process.cwd(), '.yuangs', 'skills'),
|
|
32
|
+
];
|
|
33
|
+
/**
|
|
34
|
+
* 解析单个 Markdown 技能文件
|
|
35
|
+
*/
|
|
36
|
+
function parseSkillFile(filePath) {
|
|
37
|
+
try {
|
|
38
|
+
const content = fs_1.default.readFileSync(filePath, 'utf8');
|
|
39
|
+
const match = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
|
40
|
+
if (!match)
|
|
41
|
+
return null;
|
|
42
|
+
const frontmatter = js_yaml_1.default.load(match[1]);
|
|
43
|
+
const body = match[2].trim();
|
|
44
|
+
if (!frontmatter?.name || !frontmatter?.description)
|
|
45
|
+
return null;
|
|
46
|
+
return {
|
|
47
|
+
name: frontmatter.name,
|
|
48
|
+
description: frontmatter.description,
|
|
49
|
+
triggers: frontmatter.triggers || [],
|
|
50
|
+
allowedTools: frontmatter.allowedTools,
|
|
51
|
+
model: frontmatter.model,
|
|
52
|
+
maxTurns: frontmatter.maxTurns,
|
|
53
|
+
body,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 从指定目录加载所有技能文件
|
|
62
|
+
*/
|
|
63
|
+
function loadSkillsFromDir(dir) {
|
|
64
|
+
if (!fs_1.default.existsSync(dir))
|
|
65
|
+
return [];
|
|
66
|
+
try {
|
|
67
|
+
const files = fs_1.default.readdirSync(dir).filter(f => f.endsWith('.md'));
|
|
68
|
+
const skills = [];
|
|
69
|
+
for (const file of files) {
|
|
70
|
+
const skill = parseSkillFile(path_1.default.join(dir, file));
|
|
71
|
+
if (skill)
|
|
72
|
+
skills.push(skill);
|
|
73
|
+
}
|
|
74
|
+
return skills;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 从所有默认目录加载技能
|
|
82
|
+
*/
|
|
83
|
+
function loadAllUserSkills() {
|
|
84
|
+
const skills = [];
|
|
85
|
+
const seen = new Set();
|
|
86
|
+
for (const dir of SKILL_DIRS) {
|
|
87
|
+
const dirSkills = loadSkillsFromDir(dir);
|
|
88
|
+
for (const s of dirSkills) {
|
|
89
|
+
if (!seen.has(s.name)) {
|
|
90
|
+
seen.add(s.name);
|
|
91
|
+
skills.push(s);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return skills;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=skillLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillLoader.js","sourceRoot":"","sources":["../../src/core/skillLoader.ts"],"names":[],"mappings":"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"}
|