ccjk 2.4.4 → 2.5.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.
Files changed (53) hide show
  1. package/dist/chunks/api-providers.mjs +73 -1
  2. package/dist/chunks/ccjk-config.mjs +13 -77
  3. package/dist/chunks/ccr.mjs +9 -4
  4. package/dist/chunks/check-updates.mjs +4 -2
  5. package/dist/chunks/claude-code-config-manager.mjs +9 -15
  6. package/dist/chunks/claude-code-incremental-manager.mjs +5 -8
  7. package/dist/chunks/codex.mjs +10 -569
  8. package/dist/chunks/config-switch.mjs +7 -5
  9. package/dist/chunks/config.mjs +573 -0
  10. package/dist/chunks/config2.mjs +451 -0
  11. package/dist/chunks/doctor.mjs +89 -1
  12. package/dist/chunks/features.mjs +13 -10
  13. package/dist/chunks/index.mjs +10 -1164
  14. package/dist/chunks/index2.mjs +8 -2
  15. package/dist/chunks/init.mjs +14 -11
  16. package/dist/chunks/json-config.mjs +59 -0
  17. package/dist/chunks/mcp-server.mjs +776 -0
  18. package/dist/chunks/mcp.mjs +10 -8
  19. package/dist/chunks/menu.mjs +5 -5
  20. package/dist/chunks/package.mjs +1 -1
  21. package/dist/chunks/permissions.mjs +420 -0
  22. package/dist/chunks/prompts.mjs +2 -1
  23. package/dist/chunks/providers.mjs +261 -0
  24. package/dist/chunks/session.mjs +484 -41
  25. package/dist/chunks/skills.mjs +553 -0
  26. package/dist/chunks/stats.mjs +411 -0
  27. package/dist/chunks/uninstall.mjs +4 -3
  28. package/dist/chunks/update.mjs +6 -3
  29. package/dist/chunks/workflows2.mjs +140 -0
  30. package/dist/cli.mjs +316 -10
  31. package/dist/i18n/locales/en/hooks.json +47 -0
  32. package/dist/i18n/locales/en/mcp.json +55 -0
  33. package/dist/i18n/locales/en/permissions.json +43 -0
  34. package/dist/i18n/locales/en/sandbox.json +44 -0
  35. package/dist/i18n/locales/en/skills.json +89 -129
  36. package/dist/i18n/locales/en/stats.json +20 -0
  37. package/dist/i18n/locales/zh-CN/hooks.json +47 -0
  38. package/dist/i18n/locales/zh-CN/mcp.json +55 -0
  39. package/dist/i18n/locales/zh-CN/permissions.json +43 -0
  40. package/dist/i18n/locales/zh-CN/sandbox.json +44 -0
  41. package/dist/i18n/locales/zh-CN/skills.json +88 -128
  42. package/dist/i18n/locales/zh-CN/stats.json +20 -0
  43. package/dist/index.mjs +12 -8
  44. package/dist/shared/ccjk.B-lZxV2u.mjs +1162 -0
  45. package/dist/shared/{ccjk.CURU8gbR.mjs → ccjk.CUdzQluX.mjs} +1 -1
  46. package/dist/shared/{ccjk.ByTIGCUC.mjs → ccjk.Dut3wyoP.mjs} +1 -1
  47. package/dist/shared/ccjk.J8YiPsOw.mjs +259 -0
  48. package/dist/shared/{ccjk.CGTmRqsu.mjs → ccjk.rLRHmcqD.mjs} +5 -134
  49. package/dist/shared/{ccjk.QbS8EAOd.mjs → ccjk.uVUeWAt8.mjs} +2 -1
  50. package/package.json +1 -1
  51. package/templates/common/skills/code-review.md +343 -0
  52. package/templates/common/skills/summarize.md +312 -0
  53. package/templates/common/skills/translate.md +202 -0
@@ -0,0 +1,553 @@
1
+ import ansis from 'ansis';
2
+ import inquirer from 'inquirer';
3
+ import { i18n } from './index2.mjs';
4
+ import { s as searchSkills, i as getSkill, g as getAllSkills, a as addSkill, n as setSkillEnabled, m as removeSkill, d as getBatchCategories, c as createBatchSkills } from '../shared/ccjk.B-lZxV2u.mjs';
5
+ import 'node:fs';
6
+ import 'node:process';
7
+ import 'node:url';
8
+ import 'i18next';
9
+ import 'i18next-fs-backend';
10
+ import 'pathe';
11
+ import './constants.mjs';
12
+ import 'node:os';
13
+ import './fs-operations.mjs';
14
+ import 'node:crypto';
15
+ import 'node:fs/promises';
16
+
17
+ async function listSkills(options = {}) {
18
+ console.log("");
19
+ console.log(ansis.bold.cyan("\u2501".repeat(60)));
20
+ console.log(ansis.bold.cyan(` ${i18n.t("skills:title.list")}`));
21
+ console.log(ansis.bold.cyan("\u2501".repeat(60)));
22
+ console.log("");
23
+ try {
24
+ const skills = searchSkills({
25
+ category: options.category,
26
+ enabled: options.showDisabled ? void 0 : true
27
+ });
28
+ if (skills.length === 0) {
29
+ console.log(ansis.yellow(` ${i18n.t("skills:message.noSkills")}`));
30
+ console.log("");
31
+ console.log(ansis.dim(` ${i18n.t("skills:hint.createSkill")}`));
32
+ console.log(ansis.dim(` ccjk skills create <name>`));
33
+ console.log("");
34
+ return;
35
+ }
36
+ const byCategory = /* @__PURE__ */ new Map();
37
+ for (const skill of skills) {
38
+ const categorySkills = byCategory.get(skill.category) || [];
39
+ categorySkills.push(skill);
40
+ byCategory.set(skill.category, categorySkills);
41
+ }
42
+ for (const [category, categorySkills] of byCategory) {
43
+ console.log(ansis.bold.green(` ${getCategoryIcon(category)} ${i18n.t(`skills:category.${category}`)}`));
44
+ console.log("");
45
+ for (const skill of categorySkills) {
46
+ const statusIcon = skill.enabled ? ansis.green("\u2713") : ansis.dim("\u25CB");
47
+ const name = skill.name[options.lang || "en"];
48
+ const description = skill.description[options.lang || "en"];
49
+ const triggers = skill.triggers.map((t) => ansis.cyan(t)).join(", ");
50
+ console.log(` ${statusIcon} ${ansis.bold(name)} ${ansis.dim(`(${skill.id})`)}`);
51
+ console.log(` ${ansis.dim(description)}`);
52
+ console.log(` ${ansis.dim(i18n.t("skills:label.triggers"))}: ${triggers}`);
53
+ if (skill.tags && skill.tags.length > 0) {
54
+ const tags = skill.tags.map((tag) => ansis.bgGray.white(` ${tag} `)).join(" ");
55
+ console.log(` ${tags}`);
56
+ }
57
+ console.log("");
58
+ }
59
+ }
60
+ console.log(ansis.dim(` ${i18n.t("skills:message.totalSkills", { count: skills.length })}`));
61
+ console.log("");
62
+ } catch (error) {
63
+ console.error(ansis.red(`
64
+ ${i18n.t("skills:error.listFailed")}: ${error}`));
65
+ throw error;
66
+ }
67
+ }
68
+ async function runSkill(skillName, options = {}) {
69
+ console.log("");
70
+ console.log(ansis.bold.cyan("\u2501".repeat(60)));
71
+ console.log(ansis.bold.cyan(` ${i18n.t("skills:title.run")}`));
72
+ console.log(ansis.bold.cyan("\u2501".repeat(60)));
73
+ console.log("");
74
+ try {
75
+ let skill = getSkill(skillName);
76
+ if (!skill) {
77
+ const allSkills = getAllSkills();
78
+ skill = allSkills.find((s) => s.triggers.includes(skillName) || s.triggers.includes(`/${skillName}`));
79
+ }
80
+ if (!skill) {
81
+ console.error(ansis.red(` ${i18n.t("skills:error.skillNotFound", { name: skillName })}`));
82
+ console.log("");
83
+ console.log(ansis.dim(` ${i18n.t("skills:hint.listSkills")}`));
84
+ console.log(ansis.dim(` ccjk skills list`));
85
+ console.log("");
86
+ return;
87
+ }
88
+ if (!skill.enabled) {
89
+ console.warn(ansis.yellow(` ${i18n.t("skills:warning.skillDisabled", { name: skill.name[options.lang || "en"] })}`));
90
+ console.log("");
91
+ console.log(ansis.dim(` ${i18n.t("skills:hint.enableSkill")}`));
92
+ console.log(ansis.dim(` ccjk skills enable ${skill.id}`));
93
+ console.log("");
94
+ return;
95
+ }
96
+ console.log(ansis.bold(` ${skill.name[options.lang || "en"]}`));
97
+ console.log(ansis.dim(` ${skill.description[options.lang || "en"]}`));
98
+ console.log("");
99
+ console.log(ansis.bold.green(` ${i18n.t("skills:label.template")}:`));
100
+ console.log("");
101
+ console.log(ansis.dim(" \u2500".repeat(30)));
102
+ console.log(skill.template.split("\n").map((line) => ` ${line}`).join("\n"));
103
+ console.log(ansis.dim(" \u2500".repeat(30)));
104
+ console.log("");
105
+ console.log(ansis.green(` \u2713 ${i18n.t("skills:message.skillExecuted")}`));
106
+ console.log("");
107
+ console.log(ansis.dim(` ${i18n.t("skills:hint.copyTemplate")}`));
108
+ console.log("");
109
+ } catch (error) {
110
+ console.error(ansis.red(`
111
+ ${i18n.t("skills:error.runFailed")}: ${error}`));
112
+ throw error;
113
+ }
114
+ }
115
+ async function showSkillInfo(skillName, options = {}) {
116
+ console.log("");
117
+ console.log(ansis.bold.cyan("\u2501".repeat(60)));
118
+ console.log(ansis.bold.cyan(` ${i18n.t("skills:title.info")}`));
119
+ console.log(ansis.bold.cyan("\u2501".repeat(60)));
120
+ console.log("");
121
+ try {
122
+ const skill = getSkill(skillName);
123
+ if (!skill) {
124
+ console.error(ansis.red(` ${i18n.t("skills:error.skillNotFound", { name: skillName })}`));
125
+ console.log("");
126
+ return;
127
+ }
128
+ const name = skill.name[options.lang || "en"];
129
+ const description = skill.description[options.lang || "en"];
130
+ const statusBadge = skill.enabled ? ansis.bgGreen.white(" ENABLED ") : ansis.bgRed.white(" DISABLED ");
131
+ console.log(`${ansis.bold.green(` ${name}`)} ${statusBadge}`);
132
+ console.log(ansis.dim(` ${description}`));
133
+ console.log("");
134
+ console.log(ansis.bold(` ${i18n.t("skills:label.details")}:`));
135
+ console.log(ansis.dim(` ${i18n.t("skills:label.id")}: ${skill.id}`));
136
+ console.log(ansis.dim(` ${i18n.t("skills:label.version")}: ${skill.version}`));
137
+ console.log(ansis.dim(` ${i18n.t("skills:label.category")}: ${i18n.t(`skills:category.${skill.category}`)}`));
138
+ if (skill.author) {
139
+ console.log(ansis.dim(` ${i18n.t("skills:label.author")}: ${skill.author}`));
140
+ }
141
+ console.log("");
142
+ console.log(ansis.bold(` ${i18n.t("skills:label.triggers")}:`));
143
+ for (const trigger of skill.triggers) {
144
+ console.log(ansis.cyan(` ${trigger}`));
145
+ }
146
+ if (skill.tags && skill.tags.length > 0) {
147
+ console.log("");
148
+ console.log(ansis.bold(` ${i18n.t("skills:label.tags")}:`));
149
+ const tags = skill.tags.map((tag) => ansis.bgGray.white(` ${tag} `)).join(" ");
150
+ console.log(` ${tags}`);
151
+ }
152
+ if (skill.agents && skill.agents.length > 0) {
153
+ console.log("");
154
+ console.log(ansis.bold(` ${i18n.t("skills:label.agents")}:`));
155
+ for (const agent of skill.agents) {
156
+ console.log(ansis.dim(` - ${agent}`));
157
+ }
158
+ }
159
+ console.log("");
160
+ console.log(ansis.bold(` ${i18n.t("skills:label.template")}:`));
161
+ console.log(ansis.dim(` ${skill.template.length} ${i18n.t("skills:label.characters")}`));
162
+ console.log("");
163
+ } catch (error) {
164
+ console.error(ansis.red(`
165
+ ${i18n.t("skills:error.infoFailed")}: ${error}`));
166
+ throw error;
167
+ }
168
+ }
169
+ async function createSkill(skillName, options = {}) {
170
+ console.log("");
171
+ console.log(ansis.bold.cyan("\u2501".repeat(60)));
172
+ console.log(ansis.bold.cyan(` ${i18n.t("skills:title.create")}`));
173
+ console.log(ansis.bold.cyan("\u2501".repeat(60)));
174
+ console.log("");
175
+ try {
176
+ if (options.batch) {
177
+ await createBatchSkillsInteractive(options);
178
+ return;
179
+ }
180
+ const existing = getSkill(skillName);
181
+ if (existing) {
182
+ console.error(ansis.red(` ${i18n.t("skills:error.skillExists", { name: skillName })}`));
183
+ console.log("");
184
+ return;
185
+ }
186
+ const answers = await inquirer.prompt([
187
+ {
188
+ type: "input",
189
+ name: "nameEn",
190
+ message: i18n.t("skills:prompt.nameEn"),
191
+ default: skillName,
192
+ validate: (input) => input.length > 0 || i18n.t("skills:error.nameRequired")
193
+ },
194
+ {
195
+ type: "input",
196
+ name: "nameZh",
197
+ message: i18n.t("skills:prompt.nameZh"),
198
+ default: skillName
199
+ },
200
+ {
201
+ type: "input",
202
+ name: "descriptionEn",
203
+ message: i18n.t("skills:prompt.descriptionEn"),
204
+ validate: (input) => input.length > 0 || i18n.t("skills:error.descriptionRequired")
205
+ },
206
+ {
207
+ type: "input",
208
+ name: "descriptionZh",
209
+ message: i18n.t("skills:prompt.descriptionZh")
210
+ },
211
+ {
212
+ type: "list",
213
+ name: "category",
214
+ message: i18n.t("skills:prompt.category"),
215
+ choices: [
216
+ { name: i18n.t("skills:category.git"), value: "git" },
217
+ { name: i18n.t("skills:category.dev"), value: "dev" },
218
+ { name: i18n.t("skills:category.testing"), value: "testing" },
219
+ { name: i18n.t("skills:category.docs"), value: "docs" },
220
+ { name: i18n.t("skills:category.review"), value: "review" },
221
+ { name: i18n.t("skills:category.seo"), value: "seo" },
222
+ { name: i18n.t("skills:category.devops"), value: "devops" },
223
+ { name: i18n.t("skills:category.custom"), value: "custom" }
224
+ ],
225
+ default: options.category || "custom"
226
+ },
227
+ {
228
+ type: "input",
229
+ name: "triggers",
230
+ message: i18n.t("skills:prompt.triggers"),
231
+ default: `/${skillName}`,
232
+ validate: (input) => input.length > 0 || i18n.t("skills:error.triggersRequired")
233
+ },
234
+ {
235
+ type: "editor",
236
+ name: "template",
237
+ message: i18n.t("skills:prompt.template"),
238
+ default: getDefaultTemplate(skillName, options.lang)
239
+ }
240
+ ]);
241
+ const skill = {
242
+ id: skillName,
243
+ name: {
244
+ "en": answers.nameEn,
245
+ "zh-CN": answers.nameZh || answers.nameEn
246
+ },
247
+ description: {
248
+ "en": answers.descriptionEn,
249
+ "zh-CN": answers.descriptionZh || answers.descriptionEn
250
+ },
251
+ category: answers.category,
252
+ triggers: answers.triggers.split(",").map((t) => t.trim()),
253
+ template: answers.template,
254
+ enabled: true,
255
+ version: "1.0.0"
256
+ };
257
+ const result = addSkill(skill);
258
+ if (result.success) {
259
+ console.log(ansis.green(`
260
+ \u2713 ${i18n.t("skills:message.skillCreated", { name: skill.name[options.lang || "en"] })}`));
261
+ console.log(ansis.dim(` ${i18n.t("skills:label.path")}: ${result.path}`));
262
+ console.log("");
263
+ console.log(ansis.dim(` ${i18n.t("skills:hint.runSkill")}`));
264
+ console.log(ansis.dim(` ccjk skills run ${skillName}`));
265
+ console.log("");
266
+ } else {
267
+ console.error(ansis.red(`
268
+ ${i18n.t("skills:error.createFailed")}: ${result.error}`));
269
+ }
270
+ } catch (error) {
271
+ console.error(ansis.red(`
272
+ ${i18n.t("skills:error.createFailed")}: ${error}`));
273
+ throw error;
274
+ }
275
+ }
276
+ async function enableSkill(skillName, options = {}) {
277
+ try {
278
+ const skill = getSkill(skillName);
279
+ if (!skill) {
280
+ console.error(ansis.red(` ${i18n.t("skills:error.skillNotFound", { name: skillName })}`));
281
+ return;
282
+ }
283
+ if (skill.enabled) {
284
+ console.log(ansis.yellow(` ${i18n.t("skills:message.alreadyEnabled", { name: skill.name[options.lang || "en"] })}`));
285
+ return;
286
+ }
287
+ const success = setSkillEnabled(skillName, true);
288
+ if (success) {
289
+ console.log(ansis.green(` \u2713 ${i18n.t("skills:message.skillEnabled", { name: skill.name[options.lang || "en"] })}`));
290
+ } else {
291
+ console.error(ansis.red(` ${i18n.t("skills:error.enableFailed")}`));
292
+ }
293
+ } catch (error) {
294
+ console.error(ansis.red(`
295
+ ${i18n.t("skills:error.enableFailed")}: ${error}`));
296
+ throw error;
297
+ }
298
+ }
299
+ async function disableSkill(skillName, options = {}) {
300
+ try {
301
+ const skill = getSkill(skillName);
302
+ if (!skill) {
303
+ console.error(ansis.red(` ${i18n.t("skills:error.skillNotFound", { name: skillName })}`));
304
+ return;
305
+ }
306
+ if (!skill.enabled) {
307
+ console.log(ansis.yellow(` ${i18n.t("skills:message.alreadyDisabled", { name: skill.name[options.lang || "en"] })}`));
308
+ return;
309
+ }
310
+ const success = setSkillEnabled(skillName, false);
311
+ if (success) {
312
+ console.log(ansis.green(` \u2713 ${i18n.t("skills:message.skillDisabled", { name: skill.name[options.lang || "en"] })}`));
313
+ } else {
314
+ console.error(ansis.red(` ${i18n.t("skills:error.disableFailed")}`));
315
+ }
316
+ } catch (error) {
317
+ console.error(ansis.red(`
318
+ ${i18n.t("skills:error.disableFailed")}: ${error}`));
319
+ throw error;
320
+ }
321
+ }
322
+ async function deleteSkill(skillName, options = {}) {
323
+ try {
324
+ const skill = getSkill(skillName);
325
+ if (!skill) {
326
+ console.error(ansis.red(` ${i18n.t("skills:error.skillNotFound", { name: skillName })}`));
327
+ return;
328
+ }
329
+ const { confirm } = await inquirer.prompt({
330
+ type: "confirm",
331
+ name: "confirm",
332
+ message: i18n.t("skills:prompt.confirmDelete", { name: skill.name[options.lang || "en"] }),
333
+ default: false
334
+ });
335
+ if (!confirm) {
336
+ console.log(ansis.yellow(` ${i18n.t("skills:message.deleteCancelled")}`));
337
+ return;
338
+ }
339
+ const success = removeSkill(skillName);
340
+ if (success) {
341
+ console.log(ansis.green(` \u2713 ${i18n.t("skills:message.skillDeleted", { name: skill.name[options.lang || "en"] })}`));
342
+ } else {
343
+ console.error(ansis.red(` ${i18n.t("skills:error.deleteFailed")}`));
344
+ }
345
+ } catch (error) {
346
+ console.error(ansis.red(`
347
+ ${i18n.t("skills:error.deleteFailed")}: ${error}`));
348
+ throw error;
349
+ }
350
+ }
351
+ async function skillsMenu(options = {}) {
352
+ while (true) {
353
+ console.log("");
354
+ console.log(ansis.bold.cyan("\u2501".repeat(60)));
355
+ console.log(ansis.bold.cyan(` ${i18n.t("skills:menu.title")}`));
356
+ console.log(ansis.bold.cyan("\u2501".repeat(60)));
357
+ console.log("");
358
+ const { action } = await inquirer.prompt({
359
+ type: "list",
360
+ name: "action",
361
+ message: i18n.t("skills:menu.prompt"),
362
+ choices: [
363
+ { name: `\u{1F4CB} ${i18n.t("skills:menu.list")}`, value: "list" },
364
+ { name: `\u25B6\uFE0F ${i18n.t("skills:menu.run")}`, value: "run" },
365
+ { name: `\u2139\uFE0F ${i18n.t("skills:menu.info")}`, value: "info" },
366
+ { name: `\u2795 ${i18n.t("skills:menu.create")}`, value: "create" },
367
+ { name: `\u{1F4E6} ${i18n.t("skills:menu.batch")}`, value: "batch" },
368
+ { name: `\u2705 ${i18n.t("skills:menu.enable")}`, value: "enable" },
369
+ { name: `\u274C ${i18n.t("skills:menu.disable")}`, value: "disable" },
370
+ { name: `\u{1F5D1}\uFE0F ${i18n.t("skills:menu.delete")}`, value: "delete" },
371
+ new inquirer.Separator(),
372
+ { name: `\u{1F519} ${i18n.t("skills:menu.back")}`, value: "back" }
373
+ ]
374
+ });
375
+ if (action === "back") {
376
+ break;
377
+ }
378
+ try {
379
+ switch (action) {
380
+ case "list":
381
+ await listSkills(options);
382
+ break;
383
+ case "run": {
384
+ const { skillName } = await inquirer.prompt({
385
+ type: "input",
386
+ name: "skillName",
387
+ message: i18n.t("skills:prompt.skillName")
388
+ });
389
+ await runSkill(skillName, options);
390
+ break;
391
+ }
392
+ case "info": {
393
+ const { skillName } = await inquirer.prompt({
394
+ type: "input",
395
+ name: "skillName",
396
+ message: i18n.t("skills:prompt.skillName")
397
+ });
398
+ await showSkillInfo(skillName, options);
399
+ break;
400
+ }
401
+ case "create": {
402
+ const { skillName } = await inquirer.prompt({
403
+ type: "input",
404
+ name: "skillName",
405
+ message: i18n.t("skills:prompt.newSkillName")
406
+ });
407
+ await createSkill(skillName, options);
408
+ break;
409
+ }
410
+ case "batch":
411
+ await createBatchSkillsInteractive(options);
412
+ break;
413
+ case "enable": {
414
+ const { skillName } = await inquirer.prompt({
415
+ type: "input",
416
+ name: "skillName",
417
+ message: i18n.t("skills:prompt.skillName")
418
+ });
419
+ await enableSkill(skillName, options);
420
+ break;
421
+ }
422
+ case "disable": {
423
+ const { skillName } = await inquirer.prompt({
424
+ type: "input",
425
+ name: "skillName",
426
+ message: i18n.t("skills:prompt.skillName")
427
+ });
428
+ await disableSkill(skillName, options);
429
+ break;
430
+ }
431
+ case "delete": {
432
+ const { skillName } = await inquirer.prompt({
433
+ type: "input",
434
+ name: "skillName",
435
+ message: i18n.t("skills:prompt.skillName")
436
+ });
437
+ await deleteSkill(skillName, options);
438
+ break;
439
+ }
440
+ }
441
+ } catch (error) {
442
+ console.error(ansis.red(`
443
+ ${i18n.t("common.error")}: ${error}`));
444
+ }
445
+ await inquirer.prompt({
446
+ type: "input",
447
+ name: "continue",
448
+ message: i18n.t("common.pressEnterToContinue")
449
+ });
450
+ }
451
+ }
452
+ function getCategoryIcon(category) {
453
+ const icons = {
454
+ git: "\u{1F500}",
455
+ dev: "\u{1F4BB}",
456
+ testing: "\u{1F9EA}",
457
+ docs: "\u{1F4DA}",
458
+ review: "\u{1F440}",
459
+ seo: "\u{1F50D}",
460
+ devops: "\u{1F680}",
461
+ custom: "\u2699\uFE0F"
462
+ };
463
+ return icons[category] || "\u{1F4E6}";
464
+ }
465
+ function getDefaultTemplate(skillName, lang) {
466
+ const isZh = lang === "zh-CN";
467
+ if (isZh) {
468
+ return `# ${skillName}
469
+
470
+ ## \u6280\u80FD\u63CF\u8FF0
471
+
472
+ \u8FD9\u662F\u4E00\u4E2A\u81EA\u5B9A\u4E49\u6280\u80FD\u6A21\u677F\u3002\u8BF7\u63CF\u8FF0\u8FD9\u4E2A\u6280\u80FD\u7684\u7528\u9014\u548C\u529F\u80FD\u3002
473
+
474
+ ## \u4F7F\u7528\u573A\u666F
475
+
476
+ - \u573A\u666F 1
477
+ - \u573A\u666F 2
478
+ - \u573A\u666F 3
479
+
480
+ ## \u6267\u884C\u6B65\u9AA4
481
+
482
+ 1. \u7B2C\u4E00\u6B65
483
+ 2. \u7B2C\u4E8C\u6B65
484
+ 3. \u7B2C\u4E09\u6B65
485
+
486
+ ## \u6CE8\u610F\u4E8B\u9879
487
+
488
+ - \u6CE8\u610F\u4E8B\u9879 1
489
+ - \u6CE8\u610F\u4E8B\u9879 2
490
+ `;
491
+ }
492
+ return `# ${skillName}
493
+
494
+ ## Skill Description
495
+
496
+ This is a custom skill template. Please describe the purpose and functionality of this skill.
497
+
498
+ ## Use Cases
499
+
500
+ - Use case 1
501
+ - Use case 2
502
+ - Use case 3
503
+
504
+ ## Execution Steps
505
+
506
+ 1. Step 1
507
+ 2. Step 2
508
+ 3. Step 3
509
+
510
+ ## Notes
511
+
512
+ - Note 1
513
+ - Note 2
514
+ `;
515
+ }
516
+ async function createBatchSkillsInteractive(_options) {
517
+ console.log(ansis.bold(` ${i18n.t("skills:batch.title")}`));
518
+ console.log("");
519
+ const categories = getBatchCategories();
520
+ const answers = await inquirer.prompt([
521
+ {
522
+ type: "checkbox",
523
+ name: "categories",
524
+ message: i18n.t("skills:batch.prompt"),
525
+ choices: categories.map((cat) => ({
526
+ name: i18n.t(`skills:batch.${cat}`),
527
+ value: cat,
528
+ checked: false
529
+ }))
530
+ }
531
+ ]);
532
+ if (answers.categories.length === 0) {
533
+ console.log(ansis.yellow(` ${i18n.t("skills:batch.noneSelected")}`));
534
+ return;
535
+ }
536
+ console.log("");
537
+ console.log(ansis.dim(` ${i18n.t("skills:batch.creating")}...`));
538
+ console.log("");
539
+ const results = createBatchSkills({
540
+ lang: answers.categories.includes("typescript") ? "typescript" : answers.categories.includes("python") ? "python" : void 0,
541
+ seo: answers.categories.includes("seo"),
542
+ devops: answers.categories.includes("devops")
543
+ });
544
+ const succeeded = results.filter((r) => r.success).length;
545
+ const failed = results.filter((r) => !r.success).length;
546
+ console.log(ansis.green(` \u2713 ${i18n.t("skills:batch.created", { count: succeeded })}`));
547
+ if (failed > 0) {
548
+ console.log(ansis.red(` \u2717 ${i18n.t("skills:batch.failed", { count: failed })}`));
549
+ }
550
+ console.log("");
551
+ }
552
+
553
+ export { createSkill, deleteSkill, disableSkill, enableSkill, listSkills, runSkill, showSkillInfo, skillsMenu };