@skillkit/agents 1.6.2 → 1.6.4
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.d.ts +35 -37
- package/dist/index.js +235 -196
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -17,11 +17,13 @@ function escapeXml(text) {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
// src/claude-code.ts
|
|
20
|
+
import { AGENT_CONFIG } from "@skillkit/core";
|
|
21
|
+
var config = AGENT_CONFIG["claude-code"];
|
|
20
22
|
var ClaudeCodeAdapter = class {
|
|
21
23
|
type = "claude-code";
|
|
22
24
|
name = "Claude Code";
|
|
23
|
-
skillsDir =
|
|
24
|
-
configFile =
|
|
25
|
+
skillsDir = config.skillsDir;
|
|
26
|
+
configFile = config.configFile;
|
|
25
27
|
generateConfig(skills) {
|
|
26
28
|
const enabledSkills = skills.filter((s) => s.enabled);
|
|
27
29
|
if (enabledSkills.length === 0) {
|
|
@@ -79,11 +81,14 @@ ${skillsXml}
|
|
|
79
81
|
// src/cursor.ts
|
|
80
82
|
import { existsSync as existsSync2 } from "fs";
|
|
81
83
|
import { join as join2 } from "path";
|
|
84
|
+
import { homedir as homedir2 } from "os";
|
|
85
|
+
import { AGENT_CONFIG as AGENT_CONFIG2 } from "@skillkit/core";
|
|
86
|
+
var config2 = AGENT_CONFIG2.cursor;
|
|
82
87
|
var CursorAdapter = class {
|
|
83
88
|
type = "cursor";
|
|
84
89
|
name = "Cursor";
|
|
85
|
-
skillsDir =
|
|
86
|
-
configFile =
|
|
90
|
+
skillsDir = config2.skillsDir;
|
|
91
|
+
configFile = config2.configFile;
|
|
87
92
|
generateConfig(skills) {
|
|
88
93
|
const enabledSkills = skills.filter((s) => s.enabled);
|
|
89
94
|
if (enabledSkills.length === 0) {
|
|
@@ -91,7 +96,12 @@ var CursorAdapter = class {
|
|
|
91
96
|
}
|
|
92
97
|
const skillsList = enabledSkills.map((s) => `- **${s.name}**: ${s.description}`).join("\n");
|
|
93
98
|
const skillsXml = enabledSkills.map(createSkillXml).join("\n\n");
|
|
94
|
-
return
|
|
99
|
+
return `---
|
|
100
|
+
description: SkillKit skills integration - provides specialized capabilities and domain knowledge
|
|
101
|
+
globs: "**/*"
|
|
102
|
+
alwaysApply: true
|
|
103
|
+
---
|
|
104
|
+
# Skills System
|
|
95
105
|
|
|
96
106
|
You have access to specialized skills that can help complete tasks. Use the skillkit CLI to load skill instructions when needed.
|
|
97
107
|
|
|
@@ -126,21 +136,25 @@ ${skillsXml}
|
|
|
126
136
|
return `skillkit read ${skillName}`;
|
|
127
137
|
}
|
|
128
138
|
async isDetected() {
|
|
129
|
-
const cursorRules = join2(process.cwd(), ".cursorrules");
|
|
130
139
|
const cursorDir = join2(process.cwd(), ".cursor");
|
|
131
|
-
|
|
140
|
+
const cursorRulesDir = join2(process.cwd(), ".cursor", "rules");
|
|
141
|
+
const cursorRulesFile = join2(process.cwd(), ".cursorrules");
|
|
142
|
+
const globalCursor = join2(homedir2(), ".cursor");
|
|
143
|
+
return existsSync2(cursorDir) || existsSync2(cursorRulesDir) || existsSync2(cursorRulesFile) || existsSync2(globalCursor);
|
|
132
144
|
}
|
|
133
145
|
};
|
|
134
146
|
|
|
135
147
|
// src/codex.ts
|
|
136
148
|
import { existsSync as existsSync3 } from "fs";
|
|
137
149
|
import { join as join3 } from "path";
|
|
138
|
-
import { homedir as
|
|
150
|
+
import { homedir as homedir3 } from "os";
|
|
151
|
+
import { AGENT_CONFIG as AGENT_CONFIG3 } from "@skillkit/core";
|
|
152
|
+
var config3 = AGENT_CONFIG3.codex;
|
|
139
153
|
var CodexAdapter = class {
|
|
140
154
|
type = "codex";
|
|
141
155
|
name = "OpenAI Codex CLI";
|
|
142
|
-
skillsDir =
|
|
143
|
-
configFile =
|
|
156
|
+
skillsDir = config3.skillsDir;
|
|
157
|
+
configFile = config3.configFile;
|
|
144
158
|
generateConfig(skills) {
|
|
145
159
|
const enabledSkills = skills.filter((s) => s.enabled);
|
|
146
160
|
if (enabledSkills.length === 0) {
|
|
@@ -183,7 +197,7 @@ Skills are loaded on-demand to keep context clean. Only load skills when relevan
|
|
|
183
197
|
}
|
|
184
198
|
async isDetected() {
|
|
185
199
|
const codexDir = join3(process.cwd(), ".codex");
|
|
186
|
-
const globalCodex = join3(
|
|
200
|
+
const globalCodex = join3(homedir3(), ".codex");
|
|
187
201
|
return existsSync3(codexDir) || existsSync3(globalCodex);
|
|
188
202
|
}
|
|
189
203
|
};
|
|
@@ -191,12 +205,14 @@ Skills are loaded on-demand to keep context clean. Only load skills when relevan
|
|
|
191
205
|
// src/gemini-cli.ts
|
|
192
206
|
import { existsSync as existsSync4 } from "fs";
|
|
193
207
|
import { join as join4 } from "path";
|
|
194
|
-
import { homedir as
|
|
208
|
+
import { homedir as homedir4 } from "os";
|
|
209
|
+
import { AGENT_CONFIG as AGENT_CONFIG4 } from "@skillkit/core";
|
|
210
|
+
var config4 = AGENT_CONFIG4["gemini-cli"];
|
|
195
211
|
var GeminiCliAdapter = class {
|
|
196
212
|
type = "gemini-cli";
|
|
197
213
|
name = "Gemini CLI";
|
|
198
|
-
skillsDir =
|
|
199
|
-
configFile =
|
|
214
|
+
skillsDir = config4.skillsDir;
|
|
215
|
+
configFile = config4.configFile;
|
|
200
216
|
generateConfig(skills) {
|
|
201
217
|
const enabledSkills = skills.filter((s) => s.enabled);
|
|
202
218
|
if (enabledSkills.length === 0) {
|
|
@@ -247,7 +263,7 @@ ${JSON.stringify(skillsJson, null, 2)}
|
|
|
247
263
|
}
|
|
248
264
|
}
|
|
249
265
|
if (skillNames.length === 0) {
|
|
250
|
-
const headerRegex =
|
|
266
|
+
const headerRegex = /^###\s+(.+?)\s*$/gm;
|
|
251
267
|
let match;
|
|
252
268
|
while ((match = headerRegex.exec(content)) !== null) {
|
|
253
269
|
skillNames.push(match[1].trim());
|
|
@@ -261,7 +277,7 @@ ${JSON.stringify(skillsJson, null, 2)}
|
|
|
261
277
|
async isDetected() {
|
|
262
278
|
const geminiMd = join4(process.cwd(), "GEMINI.md");
|
|
263
279
|
const geminiDir = join4(process.cwd(), ".gemini");
|
|
264
|
-
const globalGemini = join4(
|
|
280
|
+
const globalGemini = join4(homedir4(), ".gemini");
|
|
265
281
|
return existsSync4(geminiMd) || existsSync4(geminiDir) || existsSync4(globalGemini);
|
|
266
282
|
}
|
|
267
283
|
};
|
|
@@ -269,12 +285,14 @@ ${JSON.stringify(skillsJson, null, 2)}
|
|
|
269
285
|
// src/opencode.ts
|
|
270
286
|
import { existsSync as existsSync5 } from "fs";
|
|
271
287
|
import { join as join5 } from "path";
|
|
272
|
-
import { homedir as
|
|
288
|
+
import { homedir as homedir5 } from "os";
|
|
289
|
+
import { AGENT_CONFIG as AGENT_CONFIG5 } from "@skillkit/core";
|
|
290
|
+
var config5 = AGENT_CONFIG5.opencode;
|
|
273
291
|
var OpenCodeAdapter = class {
|
|
274
292
|
type = "opencode";
|
|
275
293
|
name = "OpenCode";
|
|
276
|
-
skillsDir =
|
|
277
|
-
configFile =
|
|
294
|
+
skillsDir = config5.skillsDir;
|
|
295
|
+
configFile = config5.configFile;
|
|
278
296
|
generateConfig(skills) {
|
|
279
297
|
const enabledSkills = skills.filter((s) => s.enabled);
|
|
280
298
|
if (enabledSkills.length === 0) {
|
|
@@ -316,20 +334,23 @@ This loads the skill's instructions into context.
|
|
|
316
334
|
}
|
|
317
335
|
async isDetected() {
|
|
318
336
|
const opencodeDir = join5(process.cwd(), ".opencode");
|
|
319
|
-
const globalOpencode = join5(
|
|
320
|
-
|
|
337
|
+
const globalOpencode = join5(homedir5(), ".config", "opencode");
|
|
338
|
+
const opencodeJson = join5(process.cwd(), "opencode.json");
|
|
339
|
+
return existsSync5(opencodeDir) || existsSync5(globalOpencode) || existsSync5(opencodeJson);
|
|
321
340
|
}
|
|
322
341
|
};
|
|
323
342
|
|
|
324
343
|
// src/antigravity.ts
|
|
325
344
|
import { existsSync as existsSync6 } from "fs";
|
|
326
345
|
import { join as join6 } from "path";
|
|
327
|
-
import { homedir as
|
|
346
|
+
import { homedir as homedir6 } from "os";
|
|
347
|
+
import { AGENT_CONFIG as AGENT_CONFIG6 } from "@skillkit/core";
|
|
348
|
+
var config6 = AGENT_CONFIG6.antigravity;
|
|
328
349
|
var AntigravityAdapter = class {
|
|
329
350
|
type = "antigravity";
|
|
330
351
|
name = "Antigravity";
|
|
331
|
-
skillsDir =
|
|
332
|
-
configFile =
|
|
352
|
+
skillsDir = config6.skillsDir;
|
|
353
|
+
configFile = config6.configFile;
|
|
333
354
|
generateConfig(skills) {
|
|
334
355
|
const enabledSkills = skills.filter((s) => s.enabled);
|
|
335
356
|
if (enabledSkills.length === 0) {
|
|
@@ -384,7 +405,7 @@ ${s.description}
|
|
|
384
405
|
}
|
|
385
406
|
async isDetected() {
|
|
386
407
|
const agDir = join6(process.cwd(), ".antigravity");
|
|
387
|
-
const globalAg = join6(
|
|
408
|
+
const globalAg = join6(homedir6(), ".antigravity");
|
|
388
409
|
return existsSync6(agDir) || existsSync6(globalAg);
|
|
389
410
|
}
|
|
390
411
|
};
|
|
@@ -392,12 +413,14 @@ ${s.description}
|
|
|
392
413
|
// src/amp.ts
|
|
393
414
|
import { existsSync as existsSync7 } from "fs";
|
|
394
415
|
import { join as join7 } from "path";
|
|
395
|
-
import { homedir as
|
|
416
|
+
import { homedir as homedir7 } from "os";
|
|
417
|
+
import { AGENT_CONFIG as AGENT_CONFIG7 } from "@skillkit/core";
|
|
418
|
+
var config7 = AGENT_CONFIG7.amp;
|
|
396
419
|
var AmpAdapter = class {
|
|
397
420
|
type = "amp";
|
|
398
421
|
name = "Amp";
|
|
399
|
-
skillsDir =
|
|
400
|
-
configFile =
|
|
422
|
+
skillsDir = config7.skillsDir;
|
|
423
|
+
configFile = config7.configFile;
|
|
401
424
|
generateConfig(skills) {
|
|
402
425
|
const enabledSkills = skills.filter((s) => s.enabled);
|
|
403
426
|
if (enabledSkills.length === 0) {
|
|
@@ -445,21 +468,23 @@ ${skillsXml}
|
|
|
445
468
|
return `skillkit read ${skillName}`;
|
|
446
469
|
}
|
|
447
470
|
async isDetected() {
|
|
448
|
-
const
|
|
449
|
-
const
|
|
450
|
-
return existsSync7(
|
|
471
|
+
const projectAmp = join7(process.cwd(), ".amp");
|
|
472
|
+
const globalAmp = join7(homedir7(), ".amp");
|
|
473
|
+
return existsSync7(projectAmp) || existsSync7(globalAmp);
|
|
451
474
|
}
|
|
452
475
|
};
|
|
453
476
|
|
|
454
477
|
// src/clawdbot.ts
|
|
455
478
|
import { existsSync as existsSync8 } from "fs";
|
|
456
479
|
import { join as join8 } from "path";
|
|
457
|
-
import { homedir as
|
|
480
|
+
import { homedir as homedir8 } from "os";
|
|
481
|
+
import { AGENT_CONFIG as AGENT_CONFIG8 } from "@skillkit/core";
|
|
482
|
+
var config8 = AGENT_CONFIG8.clawdbot;
|
|
458
483
|
var ClawdbotAdapter = class {
|
|
459
484
|
type = "clawdbot";
|
|
460
485
|
name = "Clawdbot";
|
|
461
|
-
skillsDir =
|
|
462
|
-
configFile =
|
|
486
|
+
skillsDir = config8.skillsDir;
|
|
487
|
+
configFile = config8.configFile;
|
|
463
488
|
generateConfig(skills) {
|
|
464
489
|
const enabledSkills = skills.filter((s) => s.enabled);
|
|
465
490
|
if (enabledSkills.length === 0) {
|
|
@@ -508,7 +533,7 @@ ${skillsXml}
|
|
|
508
533
|
}
|
|
509
534
|
async isDetected() {
|
|
510
535
|
const projectSkills = join8(process.cwd(), "skills");
|
|
511
|
-
const globalClawdbot = join8(
|
|
536
|
+
const globalClawdbot = join8(homedir8(), ".clawdbot");
|
|
512
537
|
const clawdbotConfig = join8(process.cwd(), "clawdbot.json");
|
|
513
538
|
return existsSync8(projectSkills) || existsSync8(globalClawdbot) || existsSync8(clawdbotConfig);
|
|
514
539
|
}
|
|
@@ -517,12 +542,14 @@ ${skillsXml}
|
|
|
517
542
|
// src/droid.ts
|
|
518
543
|
import { existsSync as existsSync9 } from "fs";
|
|
519
544
|
import { join as join9 } from "path";
|
|
520
|
-
import { homedir as
|
|
545
|
+
import { homedir as homedir9 } from "os";
|
|
546
|
+
import { AGENT_CONFIG as AGENT_CONFIG9 } from "@skillkit/core";
|
|
547
|
+
var config9 = AGENT_CONFIG9.droid;
|
|
521
548
|
var DroidAdapter = class {
|
|
522
549
|
type = "droid";
|
|
523
550
|
name = "Droid (Factory)";
|
|
524
|
-
skillsDir =
|
|
525
|
-
configFile =
|
|
551
|
+
skillsDir = config9.skillsDir;
|
|
552
|
+
configFile = config9.configFile;
|
|
526
553
|
generateConfig(skills) {
|
|
527
554
|
const enabledSkills = skills.filter((s) => s.enabled);
|
|
528
555
|
if (enabledSkills.length === 0) {
|
|
@@ -571,7 +598,7 @@ ${skillsXml}
|
|
|
571
598
|
}
|
|
572
599
|
async isDetected() {
|
|
573
600
|
const projectFactory = join9(process.cwd(), ".factory");
|
|
574
|
-
const globalFactory = join9(
|
|
601
|
+
const globalFactory = join9(homedir9(), ".factory");
|
|
575
602
|
return existsSync9(projectFactory) || existsSync9(globalFactory);
|
|
576
603
|
}
|
|
577
604
|
};
|
|
@@ -579,51 +606,50 @@ ${skillsXml}
|
|
|
579
606
|
// src/github-copilot.ts
|
|
580
607
|
import { existsSync as existsSync10 } from "fs";
|
|
581
608
|
import { join as join10 } from "path";
|
|
582
|
-
import { homedir as
|
|
609
|
+
import { homedir as homedir10 } from "os";
|
|
610
|
+
import { AGENT_CONFIG as AGENT_CONFIG10 } from "@skillkit/core";
|
|
611
|
+
var config10 = AGENT_CONFIG10["github-copilot"];
|
|
583
612
|
var GitHubCopilotAdapter = class {
|
|
584
613
|
type = "github-copilot";
|
|
585
614
|
name = "GitHub Copilot";
|
|
586
|
-
skillsDir =
|
|
587
|
-
configFile =
|
|
615
|
+
skillsDir = config10.skillsDir;
|
|
616
|
+
configFile = config10.configFile;
|
|
588
617
|
generateConfig(skills) {
|
|
589
618
|
const enabledSkills = skills.filter((s) => s.enabled);
|
|
590
619
|
if (enabledSkills.length === 0) {
|
|
591
620
|
return "";
|
|
592
621
|
}
|
|
593
|
-
const
|
|
594
|
-
return `<skills_system priority="1">
|
|
622
|
+
const skillsList = enabledSkills.map((s) => `### ${s.name}
|
|
595
623
|
|
|
596
|
-
|
|
624
|
+
${s.description}
|
|
597
625
|
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
When users ask you to perform tasks, check if any of the available skills below can help complete the task more effectively. Skills provide specialized capabilities and domain knowledge.
|
|
626
|
+
**Invoke:** \`skillkit read ${s.name}\``).join("\n\n");
|
|
627
|
+
return `# Skills System
|
|
601
628
|
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
- The skill content will load with detailed instructions on how to complete the task
|
|
605
|
-
- Base directory provided in output for resolving bundled resources (references/, scripts/, assets/)
|
|
629
|
+
You have access to specialized skills that can help complete tasks.
|
|
630
|
+
Skills provide domain-specific knowledge and step-by-step instructions.
|
|
606
631
|
|
|
607
|
-
|
|
608
|
-
- Only use skills listed in <available_skills> below
|
|
609
|
-
- Do not invoke a skill that is already loaded in your context
|
|
610
|
-
- Each skill invocation is stateless
|
|
611
|
-
</usage>
|
|
632
|
+
## Available Skills
|
|
612
633
|
|
|
613
|
-
|
|
634
|
+
${skillsList}
|
|
614
635
|
|
|
615
|
-
|
|
636
|
+
## How to Use Skills
|
|
616
637
|
|
|
617
|
-
|
|
618
|
-
<!-- SKILLS_TABLE_END -->
|
|
638
|
+
When a task matches a skill's description, load it using the terminal:
|
|
619
639
|
|
|
620
|
-
|
|
640
|
+
\`\`\`bash
|
|
641
|
+
skillkit read <skill-name>
|
|
642
|
+
\`\`\`
|
|
643
|
+
|
|
644
|
+
The skill content will load with detailed instructions.
|
|
645
|
+
Each skill is self-contained with its own resources.
|
|
646
|
+
`;
|
|
621
647
|
}
|
|
622
648
|
parseConfig(content) {
|
|
623
649
|
const skillNames = [];
|
|
624
|
-
const
|
|
650
|
+
const headerRegex = /^###\s+(.+?)\s*$/gm;
|
|
625
651
|
let match;
|
|
626
|
-
while ((match =
|
|
652
|
+
while ((match = headerRegex.exec(content)) !== null) {
|
|
627
653
|
skillNames.push(match[1].trim());
|
|
628
654
|
}
|
|
629
655
|
return skillNames;
|
|
@@ -632,21 +658,24 @@ ${skillsXml}
|
|
|
632
658
|
return `skillkit read ${skillName}`;
|
|
633
659
|
}
|
|
634
660
|
async isDetected() {
|
|
635
|
-
const
|
|
636
|
-
const
|
|
637
|
-
|
|
661
|
+
const copilotInstructions = join10(process.cwd(), ".github", "copilot-instructions.md");
|
|
662
|
+
const githubInstructions = join10(process.cwd(), ".github", "instructions");
|
|
663
|
+
const globalCopilot = join10(homedir10(), ".copilot");
|
|
664
|
+
return existsSync10(copilotInstructions) || existsSync10(githubInstructions) || existsSync10(globalCopilot);
|
|
638
665
|
}
|
|
639
666
|
};
|
|
640
667
|
|
|
641
668
|
// src/goose.ts
|
|
642
669
|
import { existsSync as existsSync11 } from "fs";
|
|
643
670
|
import { join as join11 } from "path";
|
|
644
|
-
import { homedir as
|
|
671
|
+
import { homedir as homedir11 } from "os";
|
|
672
|
+
import { AGENT_CONFIG as AGENT_CONFIG11 } from "@skillkit/core";
|
|
673
|
+
var config11 = AGENT_CONFIG11.goose;
|
|
645
674
|
var GooseAdapter = class {
|
|
646
675
|
type = "goose";
|
|
647
676
|
name = "Goose";
|
|
648
|
-
skillsDir =
|
|
649
|
-
configFile =
|
|
677
|
+
skillsDir = config11.skillsDir;
|
|
678
|
+
configFile = config11.configFile;
|
|
650
679
|
generateConfig(skills) {
|
|
651
680
|
const enabledSkills = skills.filter((s) => s.enabled);
|
|
652
681
|
if (enabledSkills.length === 0) {
|
|
@@ -695,7 +724,7 @@ ${skillsXml}
|
|
|
695
724
|
}
|
|
696
725
|
async isDetected() {
|
|
697
726
|
const projectGoose = join11(process.cwd(), ".goose");
|
|
698
|
-
const globalGoose = join11(
|
|
727
|
+
const globalGoose = join11(homedir11(), ".config", "goose");
|
|
699
728
|
return existsSync11(projectGoose) || existsSync11(globalGoose);
|
|
700
729
|
}
|
|
701
730
|
};
|
|
@@ -703,12 +732,14 @@ ${skillsXml}
|
|
|
703
732
|
// src/kilo.ts
|
|
704
733
|
import { existsSync as existsSync12 } from "fs";
|
|
705
734
|
import { join as join12 } from "path";
|
|
706
|
-
import { homedir as
|
|
735
|
+
import { homedir as homedir12 } from "os";
|
|
736
|
+
import { AGENT_CONFIG as AGENT_CONFIG12 } from "@skillkit/core";
|
|
737
|
+
var config12 = AGENT_CONFIG12.kilo;
|
|
707
738
|
var KiloAdapter = class {
|
|
708
739
|
type = "kilo";
|
|
709
740
|
name = "Kilo Code";
|
|
710
|
-
skillsDir =
|
|
711
|
-
configFile =
|
|
741
|
+
skillsDir = config12.skillsDir;
|
|
742
|
+
configFile = config12.configFile;
|
|
712
743
|
generateConfig(skills) {
|
|
713
744
|
const enabledSkills = skills.filter((s) => s.enabled);
|
|
714
745
|
if (enabledSkills.length === 0) {
|
|
@@ -757,20 +788,23 @@ ${skillsXml}
|
|
|
757
788
|
}
|
|
758
789
|
async isDetected() {
|
|
759
790
|
const projectKilo = join12(process.cwd(), ".kilocode");
|
|
760
|
-
const globalKilo = join12(
|
|
761
|
-
|
|
791
|
+
const globalKilo = join12(homedir12(), ".kilocode");
|
|
792
|
+
const kiloModes = join12(process.cwd(), ".kilocode", "modes");
|
|
793
|
+
return existsSync12(projectKilo) || existsSync12(globalKilo) || existsSync12(kiloModes);
|
|
762
794
|
}
|
|
763
795
|
};
|
|
764
796
|
|
|
765
797
|
// src/kiro-cli.ts
|
|
766
798
|
import { existsSync as existsSync13 } from "fs";
|
|
767
799
|
import { join as join13 } from "path";
|
|
768
|
-
import { homedir as
|
|
800
|
+
import { homedir as homedir13 } from "os";
|
|
801
|
+
import { AGENT_CONFIG as AGENT_CONFIG13 } from "@skillkit/core";
|
|
802
|
+
var config13 = AGENT_CONFIG13["kiro-cli"];
|
|
769
803
|
var KiroCliAdapter = class {
|
|
770
804
|
type = "kiro-cli";
|
|
771
805
|
name = "Kiro CLI";
|
|
772
|
-
skillsDir =
|
|
773
|
-
configFile =
|
|
806
|
+
skillsDir = config13.skillsDir;
|
|
807
|
+
configFile = config13.configFile;
|
|
774
808
|
generateConfig(skills) {
|
|
775
809
|
const enabledSkills = skills.filter((s) => s.enabled);
|
|
776
810
|
if (enabledSkills.length === 0) {
|
|
@@ -829,7 +863,7 @@ ${skillsXml}
|
|
|
829
863
|
}
|
|
830
864
|
async isDetected() {
|
|
831
865
|
const projectKiro = join13(process.cwd(), ".kiro");
|
|
832
|
-
const globalKiro = join13(
|
|
866
|
+
const globalKiro = join13(homedir13(), ".kiro");
|
|
833
867
|
return existsSync13(projectKiro) || existsSync13(globalKiro);
|
|
834
868
|
}
|
|
835
869
|
};
|
|
@@ -837,12 +871,14 @@ ${skillsXml}
|
|
|
837
871
|
// src/roo.ts
|
|
838
872
|
import { existsSync as existsSync14 } from "fs";
|
|
839
873
|
import { join as join14 } from "path";
|
|
840
|
-
import { homedir as
|
|
874
|
+
import { homedir as homedir14 } from "os";
|
|
875
|
+
import { AGENT_CONFIG as AGENT_CONFIG14 } from "@skillkit/core";
|
|
876
|
+
var config14 = AGENT_CONFIG14.roo;
|
|
841
877
|
var RooAdapter = class {
|
|
842
878
|
type = "roo";
|
|
843
879
|
name = "Roo Code";
|
|
844
|
-
skillsDir =
|
|
845
|
-
configFile =
|
|
880
|
+
skillsDir = config14.skillsDir;
|
|
881
|
+
configFile = config14.configFile;
|
|
846
882
|
generateConfig(skills) {
|
|
847
883
|
const enabledSkills = skills.filter((s) => s.enabled);
|
|
848
884
|
if (enabledSkills.length === 0) {
|
|
@@ -891,59 +927,63 @@ ${skillsXml}
|
|
|
891
927
|
}
|
|
892
928
|
async isDetected() {
|
|
893
929
|
const projectRoo = join14(process.cwd(), ".roo");
|
|
894
|
-
const globalRoo = join14(
|
|
895
|
-
|
|
930
|
+
const globalRoo = join14(homedir14(), ".roo");
|
|
931
|
+
const rooModes = join14(process.cwd(), ".roo", "modes");
|
|
932
|
+
return existsSync14(projectRoo) || existsSync14(globalRoo) || existsSync14(rooModes);
|
|
896
933
|
}
|
|
897
934
|
};
|
|
898
935
|
|
|
899
936
|
// src/trae.ts
|
|
900
937
|
import { existsSync as existsSync15 } from "fs";
|
|
901
938
|
import { join as join15 } from "path";
|
|
902
|
-
import { homedir as
|
|
939
|
+
import { homedir as homedir15 } from "os";
|
|
940
|
+
import { AGENT_CONFIG as AGENT_CONFIG15 } from "@skillkit/core";
|
|
941
|
+
var config15 = AGENT_CONFIG15.trae;
|
|
903
942
|
var TraeAdapter = class {
|
|
904
943
|
type = "trae";
|
|
905
944
|
name = "Trae";
|
|
906
|
-
skillsDir =
|
|
907
|
-
configFile =
|
|
945
|
+
skillsDir = config15.skillsDir;
|
|
946
|
+
configFile = config15.configFile;
|
|
908
947
|
generateConfig(skills) {
|
|
909
948
|
const enabledSkills = skills.filter((s) => s.enabled);
|
|
910
949
|
if (enabledSkills.length === 0) {
|
|
911
950
|
return "";
|
|
912
951
|
}
|
|
913
|
-
const
|
|
914
|
-
return `<skills_system priority="1">
|
|
952
|
+
const skillsList = enabledSkills.map((s) => `### ${s.name}
|
|
915
953
|
|
|
916
|
-
|
|
954
|
+
${s.description}
|
|
917
955
|
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
956
|
+
**Invoke:** \`skillkit read ${s.name}\``).join("\n\n");
|
|
957
|
+
return `---
|
|
958
|
+
alwaysApply: true
|
|
959
|
+
description: SkillKit skills integration for Trae
|
|
960
|
+
globs: ["**/*"]
|
|
961
|
+
---
|
|
962
|
+
# Skills System
|
|
921
963
|
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
- The skill content will load with detailed instructions on how to complete the task
|
|
925
|
-
- Base directory provided in output for resolving bundled resources (references/, scripts/, assets/)
|
|
964
|
+
You have access to specialized skills that can help complete tasks.
|
|
965
|
+
When a task matches a skill's description, load it using the skillkit CLI.
|
|
926
966
|
|
|
927
|
-
|
|
928
|
-
- Only use skills listed in <available_skills> below
|
|
929
|
-
- Do not invoke a skill that is already loaded in your context
|
|
930
|
-
- Each skill invocation is stateless
|
|
931
|
-
</usage>
|
|
967
|
+
## Available Skills
|
|
932
968
|
|
|
933
|
-
|
|
969
|
+
${skillsList}
|
|
934
970
|
|
|
935
|
-
|
|
971
|
+
## How to Use Skills
|
|
936
972
|
|
|
937
|
-
|
|
938
|
-
<!-- SKILLS_TABLE_END -->
|
|
973
|
+
When a task matches a skill's description, load it:
|
|
939
974
|
|
|
940
|
-
|
|
975
|
+
\`\`\`bash
|
|
976
|
+
skillkit read <skill-name>
|
|
977
|
+
\`\`\`
|
|
978
|
+
|
|
979
|
+
Skills provide detailed instructions for completing complex tasks.
|
|
980
|
+
`;
|
|
941
981
|
}
|
|
942
982
|
parseConfig(content) {
|
|
943
983
|
const skillNames = [];
|
|
944
|
-
const
|
|
984
|
+
const headerRegex = /^###\s+(.+?)\s*$/gm;
|
|
945
985
|
let match;
|
|
946
|
-
while ((match =
|
|
986
|
+
while ((match = headerRegex.exec(content)) !== null) {
|
|
947
987
|
skillNames.push(match[1].trim());
|
|
948
988
|
}
|
|
949
989
|
return skillNames;
|
|
@@ -953,59 +993,63 @@ ${skillsXml}
|
|
|
953
993
|
}
|
|
954
994
|
async isDetected() {
|
|
955
995
|
const projectTrae = join15(process.cwd(), ".trae");
|
|
956
|
-
const
|
|
957
|
-
|
|
996
|
+
const traeRulesDir = join15(process.cwd(), ".trae", "rules");
|
|
997
|
+
const globalTrae = join15(homedir15(), ".trae");
|
|
998
|
+
return existsSync15(projectTrae) || existsSync15(traeRulesDir) || existsSync15(globalTrae);
|
|
958
999
|
}
|
|
959
1000
|
};
|
|
960
1001
|
|
|
961
1002
|
// src/windsurf.ts
|
|
962
1003
|
import { existsSync as existsSync16 } from "fs";
|
|
963
1004
|
import { join as join16 } from "path";
|
|
964
|
-
import { homedir as
|
|
1005
|
+
import { homedir as homedir16 } from "os";
|
|
1006
|
+
import { AGENT_CONFIG as AGENT_CONFIG16 } from "@skillkit/core";
|
|
1007
|
+
var config16 = AGENT_CONFIG16.windsurf;
|
|
965
1008
|
var WindsurfAdapter = class {
|
|
966
1009
|
type = "windsurf";
|
|
967
1010
|
name = "Windsurf";
|
|
968
|
-
skillsDir =
|
|
969
|
-
configFile =
|
|
1011
|
+
skillsDir = config16.skillsDir;
|
|
1012
|
+
configFile = config16.configFile;
|
|
970
1013
|
generateConfig(skills) {
|
|
971
1014
|
const enabledSkills = skills.filter((s) => s.enabled);
|
|
972
1015
|
if (enabledSkills.length === 0) {
|
|
973
1016
|
return "";
|
|
974
1017
|
}
|
|
975
|
-
const
|
|
976
|
-
return `<skills_system priority="1">
|
|
1018
|
+
const skillsList = enabledSkills.map((s) => `### ${s.name}
|
|
977
1019
|
|
|
978
|
-
|
|
1020
|
+
${s.description}
|
|
979
1021
|
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
1022
|
+
**Invoke:** \`skillkit read ${s.name}\``).join("\n\n");
|
|
1023
|
+
return `---
|
|
1024
|
+
name: "skillkit-skills"
|
|
1025
|
+
mode: "model-decision"
|
|
1026
|
+
---
|
|
1027
|
+
# Skills System
|
|
983
1028
|
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
- The skill content will load with detailed instructions on how to complete the task
|
|
987
|
-
- Base directory provided in output for resolving bundled resources (references/, scripts/, assets/)
|
|
1029
|
+
You have access to specialized skills that can help complete tasks.
|
|
1030
|
+
When a task matches a skill's description, load it using the skillkit CLI.
|
|
988
1031
|
|
|
989
|
-
|
|
990
|
-
- Only use skills listed in <available_skills> below
|
|
991
|
-
- Do not invoke a skill that is already loaded in your context
|
|
992
|
-
- Each skill invocation is stateless
|
|
993
|
-
</usage>
|
|
1032
|
+
## Available Skills
|
|
994
1033
|
|
|
995
|
-
|
|
1034
|
+
${skillsList}
|
|
996
1035
|
|
|
997
|
-
|
|
1036
|
+
## How to Use Skills
|
|
998
1037
|
|
|
999
|
-
|
|
1000
|
-
<!-- SKILLS_TABLE_END -->
|
|
1038
|
+
When a task matches a skill's description, load it:
|
|
1001
1039
|
|
|
1002
|
-
|
|
1040
|
+
\`\`\`bash
|
|
1041
|
+
skillkit read <skill-name>
|
|
1042
|
+
\`\`\`
|
|
1043
|
+
|
|
1044
|
+
Skills provide detailed instructions for completing complex tasks.
|
|
1045
|
+
Each skill is self-contained with its own resources.
|
|
1046
|
+
`;
|
|
1003
1047
|
}
|
|
1004
1048
|
parseConfig(content) {
|
|
1005
1049
|
const skillNames = [];
|
|
1006
|
-
const
|
|
1050
|
+
const headerRegex = /^###\s+(.+?)\s*$/gm;
|
|
1007
1051
|
let match;
|
|
1008
|
-
while ((match =
|
|
1052
|
+
while ((match = headerRegex.exec(content)) !== null) {
|
|
1009
1053
|
skillNames.push(match[1].trim());
|
|
1010
1054
|
}
|
|
1011
1055
|
return skillNames;
|
|
@@ -1015,19 +1059,22 @@ ${skillsXml}
|
|
|
1015
1059
|
}
|
|
1016
1060
|
async isDetected() {
|
|
1017
1061
|
const projectWindsurf = join16(process.cwd(), ".windsurf");
|
|
1018
|
-
const
|
|
1019
|
-
|
|
1062
|
+
const projectRulesDir = join16(process.cwd(), ".windsurf", "rules");
|
|
1063
|
+
const globalWindsurf = join16(homedir16(), ".codeium", "windsurf");
|
|
1064
|
+
return existsSync16(projectWindsurf) || existsSync16(projectRulesDir) || existsSync16(globalWindsurf);
|
|
1020
1065
|
}
|
|
1021
1066
|
};
|
|
1022
1067
|
|
|
1023
1068
|
// src/universal.ts
|
|
1024
1069
|
import { existsSync as existsSync17 } from "fs";
|
|
1025
1070
|
import { join as join17 } from "path";
|
|
1071
|
+
import { AGENT_CONFIG as AGENT_CONFIG17 } from "@skillkit/core";
|
|
1072
|
+
var config17 = AGENT_CONFIG17.universal;
|
|
1026
1073
|
var UniversalAdapter = class {
|
|
1027
1074
|
type = "universal";
|
|
1028
1075
|
name = "Universal (Any Agent)";
|
|
1029
|
-
skillsDir =
|
|
1030
|
-
configFile =
|
|
1076
|
+
skillsDir = config17.skillsDir;
|
|
1077
|
+
configFile = config17.configFile;
|
|
1031
1078
|
generateConfig(skills) {
|
|
1032
1079
|
const enabledSkills = skills.filter((s) => s.enabled);
|
|
1033
1080
|
if (enabledSkills.length === 0) {
|
|
@@ -1107,14 +1154,14 @@ ${skillsXml}
|
|
|
1107
1154
|
import { minimatch } from "minimatch";
|
|
1108
1155
|
var PermissionManager = class {
|
|
1109
1156
|
config;
|
|
1110
|
-
constructor(
|
|
1111
|
-
this.config =
|
|
1157
|
+
constructor(config18) {
|
|
1158
|
+
this.config = config18 || { default: "ask" };
|
|
1112
1159
|
}
|
|
1113
1160
|
/**
|
|
1114
1161
|
* Set permission configuration
|
|
1115
1162
|
*/
|
|
1116
|
-
setConfig(
|
|
1117
|
-
this.config =
|
|
1163
|
+
setConfig(config18) {
|
|
1164
|
+
this.config = config18;
|
|
1118
1165
|
}
|
|
1119
1166
|
/**
|
|
1120
1167
|
* Get permission configuration
|
|
@@ -1262,20 +1309,20 @@ var PermissionManager = class {
|
|
|
1262
1309
|
* Parse permissions from SKILL.md metadata
|
|
1263
1310
|
*/
|
|
1264
1311
|
static fromMetadata(metadata) {
|
|
1265
|
-
const
|
|
1312
|
+
const config18 = {};
|
|
1266
1313
|
if (metadata.filePermissions && Array.isArray(metadata.filePermissions)) {
|
|
1267
|
-
|
|
1314
|
+
config18.files = metadata.filePermissions;
|
|
1268
1315
|
}
|
|
1269
1316
|
if (metadata.commandPermissions && Array.isArray(metadata.commandPermissions)) {
|
|
1270
|
-
|
|
1317
|
+
config18.commands = metadata.commandPermissions;
|
|
1271
1318
|
}
|
|
1272
1319
|
if (metadata.networkPermissions && Array.isArray(metadata.networkPermissions)) {
|
|
1273
|
-
|
|
1320
|
+
config18.network = metadata.networkPermissions;
|
|
1274
1321
|
}
|
|
1275
1322
|
if (metadata.defaultPermission) {
|
|
1276
|
-
|
|
1323
|
+
config18.default = metadata.defaultPermission;
|
|
1277
1324
|
}
|
|
1278
|
-
return
|
|
1325
|
+
return config18;
|
|
1279
1326
|
}
|
|
1280
1327
|
/**
|
|
1281
1328
|
* Merge two permission configs
|
|
@@ -1290,8 +1337,8 @@ var PermissionManager = class {
|
|
|
1290
1337
|
};
|
|
1291
1338
|
}
|
|
1292
1339
|
};
|
|
1293
|
-
function createPermissionManager(
|
|
1294
|
-
return new PermissionManager(
|
|
1340
|
+
function createPermissionManager(config18) {
|
|
1341
|
+
return new PermissionManager(config18);
|
|
1295
1342
|
}
|
|
1296
1343
|
function isAllowed(level) {
|
|
1297
1344
|
return level === "allow";
|
|
@@ -1309,10 +1356,10 @@ var GlobMatcher = class {
|
|
|
1309
1356
|
config;
|
|
1310
1357
|
includePatterns;
|
|
1311
1358
|
excludePatterns;
|
|
1312
|
-
constructor(
|
|
1313
|
-
this.config =
|
|
1314
|
-
this.includePatterns =
|
|
1315
|
-
this.excludePatterns = (
|
|
1359
|
+
constructor(config18) {
|
|
1360
|
+
this.config = config18;
|
|
1361
|
+
this.includePatterns = config18.include.map((p) => this.patternToRegex(p));
|
|
1362
|
+
this.excludePatterns = (config18.exclude || []).map((p) => this.patternToRegex(p));
|
|
1316
1363
|
}
|
|
1317
1364
|
/**
|
|
1318
1365
|
* Check if a file matches the glob patterns
|
|
@@ -1412,8 +1459,8 @@ var GlobMatcher = class {
|
|
|
1412
1459
|
return `globs: ${JSON.stringify(globs)}`;
|
|
1413
1460
|
}
|
|
1414
1461
|
};
|
|
1415
|
-
function createGlobMatcher(
|
|
1416
|
-
return new GlobMatcher(
|
|
1462
|
+
function createGlobMatcher(config18) {
|
|
1463
|
+
return new GlobMatcher(config18);
|
|
1417
1464
|
}
|
|
1418
1465
|
function matchPattern(pattern) {
|
|
1419
1466
|
return new GlobMatcher({ include: [pattern] });
|
|
@@ -1831,8 +1878,8 @@ var ModeManager = class {
|
|
|
1831
1878
|
/**
|
|
1832
1879
|
* Add a mode configuration
|
|
1833
1880
|
*/
|
|
1834
|
-
addMode(
|
|
1835
|
-
this.modes.set(
|
|
1881
|
+
addMode(config18) {
|
|
1882
|
+
this.modes.set(config18.mode, config18);
|
|
1836
1883
|
}
|
|
1837
1884
|
/**
|
|
1838
1885
|
* Get a mode configuration
|
|
@@ -1856,14 +1903,14 @@ var ModeManager = class {
|
|
|
1856
1903
|
* Set the current mode
|
|
1857
1904
|
*/
|
|
1858
1905
|
setMode(mode) {
|
|
1859
|
-
const
|
|
1860
|
-
if (!
|
|
1906
|
+
const config18 = this.modes.get(mode);
|
|
1907
|
+
if (!config18) {
|
|
1861
1908
|
throw new Error(`Mode not configured: ${mode}`);
|
|
1862
1909
|
}
|
|
1863
1910
|
const previousMode = this.currentMode;
|
|
1864
1911
|
this.currentMode = mode;
|
|
1865
1912
|
for (const listener of this.modeListeners) {
|
|
1866
|
-
listener(mode, previousMode,
|
|
1913
|
+
listener(mode, previousMode, config18);
|
|
1867
1914
|
}
|
|
1868
1915
|
}
|
|
1869
1916
|
/**
|
|
@@ -1882,15 +1929,15 @@ var ModeManager = class {
|
|
|
1882
1929
|
* Get skills for current mode
|
|
1883
1930
|
*/
|
|
1884
1931
|
getCurrentSkills() {
|
|
1885
|
-
const
|
|
1886
|
-
return
|
|
1932
|
+
const config18 = this.getCurrentModeConfig();
|
|
1933
|
+
return config18?.skills || [];
|
|
1887
1934
|
}
|
|
1888
1935
|
/**
|
|
1889
1936
|
* Get tools for current mode
|
|
1890
1937
|
*/
|
|
1891
1938
|
getCurrentTools() {
|
|
1892
|
-
const
|
|
1893
|
-
return
|
|
1939
|
+
const config18 = this.getCurrentModeConfig();
|
|
1940
|
+
return config18?.tools || [];
|
|
1894
1941
|
}
|
|
1895
1942
|
/**
|
|
1896
1943
|
* Check if a skill is available in current mode
|
|
@@ -1903,11 +1950,11 @@ var ModeManager = class {
|
|
|
1903
1950
|
* Check if a file is allowed in current mode
|
|
1904
1951
|
*/
|
|
1905
1952
|
isFileAllowed(filePath) {
|
|
1906
|
-
const
|
|
1907
|
-
if (!
|
|
1953
|
+
const config18 = this.getCurrentModeConfig();
|
|
1954
|
+
if (!config18?.allowedFiles || config18.allowedFiles.length === 0) {
|
|
1908
1955
|
return true;
|
|
1909
1956
|
}
|
|
1910
|
-
const matcher = new GlobMatcher({ include:
|
|
1957
|
+
const matcher = new GlobMatcher({ include: config18.allowedFiles });
|
|
1911
1958
|
return matcher.matches(filePath);
|
|
1912
1959
|
}
|
|
1913
1960
|
/**
|
|
@@ -1936,20 +1983,20 @@ var ModeManager = class {
|
|
|
1936
1983
|
* Generate mode-specific prompt prefix
|
|
1937
1984
|
*/
|
|
1938
1985
|
getPromptPrefix() {
|
|
1939
|
-
const
|
|
1940
|
-
return
|
|
1986
|
+
const config18 = this.getCurrentModeConfig();
|
|
1987
|
+
return config18?.promptPrefix || "";
|
|
1941
1988
|
}
|
|
1942
1989
|
/**
|
|
1943
1990
|
* Generate Roo-compatible mode configuration
|
|
1944
1991
|
*/
|
|
1945
1992
|
generateRooConfig() {
|
|
1946
1993
|
const modes = {};
|
|
1947
|
-
for (const
|
|
1948
|
-
modes[
|
|
1949
|
-
description:
|
|
1950
|
-
skills:
|
|
1951
|
-
tools:
|
|
1952
|
-
promptPrefix:
|
|
1994
|
+
for (const config18 of this.modes.values()) {
|
|
1995
|
+
modes[config18.mode] = {
|
|
1996
|
+
description: config18.description,
|
|
1997
|
+
skills: config18.skills,
|
|
1998
|
+
tools: config18.tools,
|
|
1999
|
+
promptPrefix: config18.promptPrefix
|
|
1953
2000
|
};
|
|
1954
2001
|
}
|
|
1955
2002
|
return {
|
|
@@ -1964,23 +2011,23 @@ var ModeManager = class {
|
|
|
1964
2011
|
const lines = [];
|
|
1965
2012
|
lines.push("# Available Modes");
|
|
1966
2013
|
lines.push("");
|
|
1967
|
-
for (const
|
|
1968
|
-
lines.push(`## ${
|
|
2014
|
+
for (const config18 of this.modes.values()) {
|
|
2015
|
+
lines.push(`## ${config18.mode}`);
|
|
1969
2016
|
lines.push("");
|
|
1970
|
-
lines.push(
|
|
2017
|
+
lines.push(config18.description);
|
|
1971
2018
|
lines.push("");
|
|
1972
|
-
if (
|
|
2019
|
+
if (config18.skills.length > 0) {
|
|
1973
2020
|
lines.push("### Skills");
|
|
1974
2021
|
lines.push("");
|
|
1975
|
-
for (const skill of
|
|
2022
|
+
for (const skill of config18.skills) {
|
|
1976
2023
|
lines.push(`- ${skill}`);
|
|
1977
2024
|
}
|
|
1978
2025
|
lines.push("");
|
|
1979
2026
|
}
|
|
1980
|
-
if (
|
|
2027
|
+
if (config18.tools && config18.tools.length > 0) {
|
|
1981
2028
|
lines.push("### Tools");
|
|
1982
2029
|
lines.push("");
|
|
1983
|
-
for (const tool of
|
|
2030
|
+
for (const tool of config18.tools) {
|
|
1984
2031
|
lines.push(`- ${tool}`);
|
|
1985
2032
|
}
|
|
1986
2033
|
lines.push("");
|
|
@@ -1994,10 +2041,10 @@ function createModeManager(modes) {
|
|
|
1994
2041
|
}
|
|
1995
2042
|
function createDefaultModeManager(skillsPerMode) {
|
|
1996
2043
|
const manager = new ModeManager();
|
|
1997
|
-
for (const [mode,
|
|
2044
|
+
for (const [mode, config18] of Object.entries(DEFAULT_MODES)) {
|
|
1998
2045
|
const skills = skillsPerMode[mode] || [];
|
|
1999
2046
|
manager.addMode({
|
|
2000
|
-
...
|
|
2047
|
+
...config18,
|
|
2001
2048
|
skills
|
|
2002
2049
|
});
|
|
2003
2050
|
}
|
|
@@ -2062,12 +2109,6 @@ async function detectAgent() {
|
|
|
2062
2109
|
}
|
|
2063
2110
|
return "universal";
|
|
2064
2111
|
}
|
|
2065
|
-
function getSkillsDir(type) {
|
|
2066
|
-
return adapters[type].skillsDir;
|
|
2067
|
-
}
|
|
2068
|
-
function getConfigFile(type) {
|
|
2069
|
-
return adapters[type].configFile;
|
|
2070
|
-
}
|
|
2071
2112
|
export {
|
|
2072
2113
|
ALL_MODES,
|
|
2073
2114
|
AmpAdapter,
|
|
@@ -2104,9 +2145,7 @@ export {
|
|
|
2104
2145
|
fromCommonPatterns,
|
|
2105
2146
|
getAdapter,
|
|
2106
2147
|
getAllAdapters,
|
|
2107
|
-
getConfigFile,
|
|
2108
2148
|
getDefaultModeConfig,
|
|
2109
|
-
getSkillsDir,
|
|
2110
2149
|
isAllowed,
|
|
2111
2150
|
isDenied,
|
|
2112
2151
|
matchPattern,
|