@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.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 = ".claude/skills";
24
- configFile = "AGENTS.md";
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 = ".cursor/skills";
86
- configFile = ".cursorrules";
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 `# Skills System
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
- return existsSync2(cursorRules) || existsSync2(cursorDir);
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 homedir2 } from "os";
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 = ".codex/skills";
143
- configFile = "AGENTS.md";
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(homedir2(), ".codex");
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 homedir3 } from "os";
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 = ".gemini/skills";
199
- configFile = "GEMINI.md";
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 = /^### ([a-z0-9-]+)$/gm;
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(homedir3(), ".gemini");
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 homedir4 } from "os";
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 = ".opencode/skills";
277
- configFile = "AGENTS.md";
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(homedir4(), ".opencode");
320
- return existsSync5(opencodeDir) || existsSync5(globalOpencode);
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 homedir5 } from "os";
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 = ".antigravity/skills";
332
- configFile = "AGENTS.md";
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(homedir5(), ".antigravity");
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 homedir6 } from "os";
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 = ".agents/skills";
400
- configFile = "AGENTS.md";
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 projectAgents = join7(process.cwd(), ".agents");
449
- const globalAgents = join7(homedir6(), ".config", "agents");
450
- return existsSync7(projectAgents) || existsSync7(globalAgents);
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 homedir7 } from "os";
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 = "skills";
462
- configFile = "AGENTS.md";
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(homedir7(), ".clawdbot");
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 homedir8 } from "os";
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 = ".factory/skills";
525
- configFile = "AGENTS.md";
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(homedir8(), ".factory");
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 homedir9 } from "os";
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 = ".github/skills";
587
- configFile = "AGENTS.md";
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 skillsXml = enabledSkills.map(createSkillXml).join("\n\n");
594
- return `<skills_system priority="1">
622
+ const skillsList = enabledSkills.map((s) => `### ${s.name}
595
623
 
596
- ## Available Skills
624
+ ${s.description}
597
625
 
598
- <!-- SKILLS_TABLE_START -->
599
- <usage>
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
- How to use skills:
603
- - Invoke: \`skillkit read <skill-name>\` or \`npx skillkit read <skill-name>\`
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
- Usage notes:
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
- <available_skills>
634
+ ${skillsList}
614
635
 
615
- ${skillsXml}
636
+ ## How to Use Skills
616
637
 
617
- </available_skills>
618
- <!-- SKILLS_TABLE_END -->
638
+ When a task matches a skill's description, load it using the terminal:
619
639
 
620
- </skills_system>`;
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 skillRegex = /<name>([^<]+)<\/name>/g;
650
+ const headerRegex = /^###\s+(.+?)\s*$/gm;
625
651
  let match;
626
- while ((match = skillRegex.exec(content)) !== null) {
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 projectGithub = join10(process.cwd(), ".github", "skills");
636
- const globalCopilot = join10(homedir9(), ".copilot");
637
- return existsSync10(projectGithub) || existsSync10(globalCopilot);
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 homedir10 } from "os";
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 = ".goose/skills";
649
- configFile = "AGENTS.md";
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(homedir10(), ".config", "goose");
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 homedir11 } from "os";
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 = ".kilocode/skills";
711
- configFile = "AGENTS.md";
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(homedir11(), ".kilocode");
761
- return existsSync12(projectKilo) || existsSync12(globalKilo);
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 homedir12 } from "os";
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 = ".kiro/skills";
773
- configFile = "AGENTS.md";
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(homedir12(), ".kiro");
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 homedir13 } from "os";
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 = ".roo/skills";
845
- configFile = "AGENTS.md";
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(homedir13(), ".roo");
895
- return existsSync14(projectRoo) || existsSync14(globalRoo);
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 homedir14 } from "os";
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 = ".trae/skills";
907
- configFile = "AGENTS.md";
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 skillsXml = enabledSkills.map(createSkillXml).join("\n\n");
914
- return `<skills_system priority="1">
952
+ const skillsList = enabledSkills.map((s) => `### ${s.name}
915
953
 
916
- ## Available Skills
954
+ ${s.description}
917
955
 
918
- <!-- SKILLS_TABLE_START -->
919
- <usage>
920
- 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.
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
- How to use skills:
923
- - Invoke: \`skillkit read <skill-name>\` or \`npx skillkit read <skill-name>\`
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
- Usage notes:
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
- <available_skills>
969
+ ${skillsList}
934
970
 
935
- ${skillsXml}
971
+ ## How to Use Skills
936
972
 
937
- </available_skills>
938
- <!-- SKILLS_TABLE_END -->
973
+ When a task matches a skill's description, load it:
939
974
 
940
- </skills_system>`;
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 skillRegex = /<name>([^<]+)<\/name>/g;
984
+ const headerRegex = /^###\s+(.+?)\s*$/gm;
945
985
  let match;
946
- while ((match = skillRegex.exec(content)) !== null) {
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 globalTrae = join15(homedir14(), ".trae");
957
- return existsSync15(projectTrae) || existsSync15(globalTrae);
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 homedir15 } from "os";
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 = ".windsurf/skills";
969
- configFile = "AGENTS.md";
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 skillsXml = enabledSkills.map(createSkillXml).join("\n\n");
976
- return `<skills_system priority="1">
1018
+ const skillsList = enabledSkills.map((s) => `### ${s.name}
977
1019
 
978
- ## Available Skills
1020
+ ${s.description}
979
1021
 
980
- <!-- SKILLS_TABLE_START -->
981
- <usage>
982
- 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.
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
- How to use skills:
985
- - Invoke: \`skillkit read <skill-name>\` or \`npx skillkit read <skill-name>\`
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
- Usage notes:
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
- <available_skills>
1034
+ ${skillsList}
996
1035
 
997
- ${skillsXml}
1036
+ ## How to Use Skills
998
1037
 
999
- </available_skills>
1000
- <!-- SKILLS_TABLE_END -->
1038
+ When a task matches a skill's description, load it:
1001
1039
 
1002
- </skills_system>`;
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 skillRegex = /<name>([^<]+)<\/name>/g;
1050
+ const headerRegex = /^###\s+(.+?)\s*$/gm;
1007
1051
  let match;
1008
- while ((match = skillRegex.exec(content)) !== null) {
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 globalWindsurf = join16(homedir15(), ".codeium", "windsurf");
1019
- return existsSync16(projectWindsurf) || existsSync16(globalWindsurf);
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 = ".agent/skills";
1030
- configFile = "AGENTS.md";
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(config) {
1111
- this.config = config || { default: "ask" };
1157
+ constructor(config18) {
1158
+ this.config = config18 || { default: "ask" };
1112
1159
  }
1113
1160
  /**
1114
1161
  * Set permission configuration
1115
1162
  */
1116
- setConfig(config) {
1117
- this.config = 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 config = {};
1312
+ const config18 = {};
1266
1313
  if (metadata.filePermissions && Array.isArray(metadata.filePermissions)) {
1267
- config.files = metadata.filePermissions;
1314
+ config18.files = metadata.filePermissions;
1268
1315
  }
1269
1316
  if (metadata.commandPermissions && Array.isArray(metadata.commandPermissions)) {
1270
- config.commands = metadata.commandPermissions;
1317
+ config18.commands = metadata.commandPermissions;
1271
1318
  }
1272
1319
  if (metadata.networkPermissions && Array.isArray(metadata.networkPermissions)) {
1273
- config.network = metadata.networkPermissions;
1320
+ config18.network = metadata.networkPermissions;
1274
1321
  }
1275
1322
  if (metadata.defaultPermission) {
1276
- config.default = metadata.defaultPermission;
1323
+ config18.default = metadata.defaultPermission;
1277
1324
  }
1278
- return config;
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(config) {
1294
- return new PermissionManager(config);
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(config) {
1313
- this.config = config;
1314
- this.includePatterns = config.include.map((p) => this.patternToRegex(p));
1315
- this.excludePatterns = (config.exclude || []).map((p) => this.patternToRegex(p));
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(config) {
1416
- return new GlobMatcher(config);
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(config) {
1835
- this.modes.set(config.mode, config);
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 config = this.modes.get(mode);
1860
- if (!config) {
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, config);
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 config = this.getCurrentModeConfig();
1886
- return config?.skills || [];
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 config = this.getCurrentModeConfig();
1893
- return config?.tools || [];
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 config = this.getCurrentModeConfig();
1907
- if (!config?.allowedFiles || config.allowedFiles.length === 0) {
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: config.allowedFiles });
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 config = this.getCurrentModeConfig();
1940
- return config?.promptPrefix || "";
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 config of this.modes.values()) {
1948
- modes[config.mode] = {
1949
- description: config.description,
1950
- skills: config.skills,
1951
- tools: config.tools,
1952
- promptPrefix: config.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 config of this.modes.values()) {
1968
- lines.push(`## ${config.mode}`);
2014
+ for (const config18 of this.modes.values()) {
2015
+ lines.push(`## ${config18.mode}`);
1969
2016
  lines.push("");
1970
- lines.push(config.description);
2017
+ lines.push(config18.description);
1971
2018
  lines.push("");
1972
- if (config.skills.length > 0) {
2019
+ if (config18.skills.length > 0) {
1973
2020
  lines.push("### Skills");
1974
2021
  lines.push("");
1975
- for (const skill of config.skills) {
2022
+ for (const skill of config18.skills) {
1976
2023
  lines.push(`- ${skill}`);
1977
2024
  }
1978
2025
  lines.push("");
1979
2026
  }
1980
- if (config.tools && config.tools.length > 0) {
2027
+ if (config18.tools && config18.tools.length > 0) {
1981
2028
  lines.push("### Tools");
1982
2029
  lines.push("");
1983
- for (const tool of config.tools) {
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, config] of Object.entries(DEFAULT_MODES)) {
2044
+ for (const [mode, config18] of Object.entries(DEFAULT_MODES)) {
1998
2045
  const skills = skillsPerMode[mode] || [];
1999
2046
  manager.addMode({
2000
- ...config,
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,