mcp-config-manager 2.1.0 → 2.3.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.
@@ -0,0 +1,809 @@
1
+ import path from 'path';
2
+ import os from 'os';
3
+
4
+ /**
5
+ * Skills/prompts/rules configuration per client.
6
+ * Each client can have multiple "tabs" for different types of customizations.
7
+ */
8
+
9
+ const homedir = os.homedir();
10
+ const platform = os.platform();
11
+
12
+ // Platform-specific paths for VS Code extensions
13
+ const getVSCodePath = () => {
14
+ if (platform === 'darwin') {
15
+ return path.join(homedir, 'Library/Application Support/Code/User');
16
+ } else if (platform === 'win32') {
17
+ return path.join(process.env.APPDATA || '', 'Code/User');
18
+ }
19
+ return path.join(homedir, '.config/Code/User');
20
+ };
21
+
22
+ // Platform-specific paths for Cline rules
23
+ const getClinePath = () => {
24
+ if (platform === 'darwin') {
25
+ return path.join(homedir, 'Documents', 'Cline', 'Rules');
26
+ } else if (platform === 'win32') {
27
+ return path.join(process.env.USERPROFILE || homedir, 'Documents', 'Cline', 'Rules');
28
+ }
29
+ return path.join(homedir, 'Documents', 'Cline', 'Rules');
30
+ };
31
+
32
+ /**
33
+ * Client-specific skill/prompt configurations
34
+ * Each client can have multiple tabs for different content types
35
+ */
36
+ export const CLIENT_SKILLS = {
37
+ // ============================================
38
+ // CLAUDE CODE - Skills, Commands & Agents
39
+ // ============================================
40
+ 'claude-code': {
41
+ tabs: [
42
+ {
43
+ id: 'skills',
44
+ name: 'Skills',
45
+ icon: '🎭',
46
+ path: path.join(homedir, '.claude', 'skills'),
47
+ format: 'skill-md',
48
+ filePattern: '*.md',
49
+ supportsDirectories: true,
50
+ description: 'Modular expertise modules'
51
+ },
52
+ {
53
+ id: 'commands',
54
+ name: 'Commands',
55
+ icon: '⚡',
56
+ path: path.join(homedir, '.claude', 'commands'),
57
+ format: 'command-md',
58
+ filePattern: '*.md',
59
+ supportsDirectories: false,
60
+ description: 'Slash commands for quick prompts'
61
+ },
62
+ {
63
+ id: 'agents',
64
+ name: 'Agents',
65
+ icon: '🤖',
66
+ path: path.join(homedir, '.claude', 'agents'),
67
+ format: 'agent-md',
68
+ filePattern: '*.md',
69
+ supportsDirectories: false,
70
+ description: 'Custom subagents with YAML frontmatter'
71
+ }
72
+ ]
73
+ },
74
+
75
+ // ============================================
76
+ // CURSOR - Rules
77
+ // ============================================
78
+ 'cursor': {
79
+ tabs: [
80
+ {
81
+ id: 'rules',
82
+ name: 'Rules',
83
+ icon: '📐',
84
+ path: path.join(homedir, '.cursor', 'rules'),
85
+ format: 'mdc',
86
+ filePattern: '*.mdc',
87
+ supportsDirectories: false,
88
+ description: 'Global rules for Cursor AI'
89
+ }
90
+ ]
91
+ },
92
+
93
+ // ============================================
94
+ // CONTINUE.DEV - Prompts & Rules
95
+ // ============================================
96
+ 'continue': {
97
+ tabs: [
98
+ {
99
+ id: 'prompts',
100
+ name: 'Prompts',
101
+ icon: '▶️',
102
+ path: path.join(homedir, '.continue', 'prompts'),
103
+ format: 'prompt-md',
104
+ filePattern: '*.prompt',
105
+ supportsDirectories: false,
106
+ description: 'Slash command prompts'
107
+ },
108
+ {
109
+ id: 'rules',
110
+ name: 'Rules',
111
+ icon: '📏',
112
+ path: path.join(homedir, '.continue', 'rules'),
113
+ format: 'rule-md',
114
+ filePattern: '*.md',
115
+ supportsDirectories: false,
116
+ description: 'Context rules'
117
+ }
118
+ ]
119
+ },
120
+
121
+ // ============================================
122
+ // WINDSURF (CODEIUM) - Rules
123
+ // ============================================
124
+ 'windsurf': {
125
+ tabs: [
126
+ {
127
+ id: 'rules',
128
+ name: 'Rules',
129
+ icon: '🏄',
130
+ path: path.join(homedir, '.codeium', 'windsurf', 'memories'),
131
+ format: 'rule-md',
132
+ filePattern: 'global_rules.md',
133
+ singleFile: true,
134
+ supportsDirectories: false,
135
+ description: 'Rules for Windsurf AI'
136
+ }
137
+ ]
138
+ },
139
+
140
+ // ============================================
141
+ // GITHUB COPILOT - Instructions & Skills
142
+ // NOTE: Per-repo instructions live in .github/copilot-instructions.md
143
+ // Per-repo skills in .github/skills/. User-level skills at ~/.copilot/skills/
144
+ // ============================================
145
+ 'github-copilot': {
146
+ tabs: [
147
+ {
148
+ id: 'instructions',
149
+ name: 'Instructions',
150
+ icon: '🐙',
151
+ path: path.join(homedir, '.github'),
152
+ format: 'instructions-md',
153
+ filePattern: 'copilot-instructions.md',
154
+ singleFile: true,
155
+ supportsDirectories: false,
156
+ description: 'Global instructions for Copilot'
157
+ },
158
+ {
159
+ id: 'skills',
160
+ name: 'Skills',
161
+ icon: '🎯',
162
+ path: path.join(homedir, '.copilot', 'skills'),
163
+ format: 'skill-md',
164
+ filePattern: '*.md',
165
+ supportsDirectories: true,
166
+ description: 'Personal agent skills (SKILL.md in subdirs)'
167
+ }
168
+ ]
169
+ },
170
+
171
+ // ============================================
172
+ // VS CODE (with Continue extension)
173
+ // ============================================
174
+ 'vscode': {
175
+ tabs: [
176
+ {
177
+ id: 'prompts',
178
+ name: 'Prompts',
179
+ icon: '▶️',
180
+ path: path.join(homedir, '.continue', 'prompts'),
181
+ format: 'prompt-md',
182
+ filePattern: '*.prompt',
183
+ supportsDirectories: false,
184
+ description: 'Continue.dev prompts'
185
+ },
186
+ {
187
+ id: 'rules',
188
+ name: 'Rules',
189
+ icon: '📏',
190
+ path: path.join(homedir, '.continue', 'rules'),
191
+ format: 'rule-md',
192
+ filePattern: '*.md',
193
+ supportsDirectories: false,
194
+ description: 'Continue.dev rules'
195
+ }
196
+ ]
197
+ },
198
+
199
+ // ============================================
200
+ // AMAZON Q DEVELOPER - Rules
201
+ // NOTE: Project-scoped rules live in .amazonq/rules/ at the repo root.
202
+ // The global path below (~/.aws/amazonq/rules) may not exist on all setups.
203
+ // ============================================
204
+ 'amazonq': {
205
+ tabs: [
206
+ {
207
+ id: 'rules',
208
+ name: 'Rules',
209
+ icon: '🔶',
210
+ path: path.join(homedir, '.aws', 'amazonq', 'rules'),
211
+ format: 'rule-md',
212
+ filePattern: '*.md',
213
+ supportsDirectories: false,
214
+ description: 'Rules for Amazon Q'
215
+ }
216
+ ]
217
+ },
218
+
219
+ // ============================================
220
+ // CLINE - Rules
221
+ // ============================================
222
+ 'cline': {
223
+ tabs: [
224
+ {
225
+ id: 'rules',
226
+ name: 'Rules',
227
+ icon: '🔧',
228
+ path: getClinePath(),
229
+ format: 'rule-md',
230
+ filePattern: '*.md',
231
+ supportsDirectories: false,
232
+ description: 'Global rules for Cline'
233
+ }
234
+ ]
235
+ },
236
+
237
+ // ============================================
238
+ // ROO CODE - Rules
239
+ // ============================================
240
+ 'roo-code': {
241
+ tabs: [
242
+ {
243
+ id: 'rules',
244
+ name: 'Rules',
245
+ icon: '🦘',
246
+ path: path.join(homedir, '.roo', 'rules'),
247
+ format: 'rule-md',
248
+ filePattern: '*.md',
249
+ supportsDirectories: false,
250
+ description: 'Global rules for Roo Code'
251
+ }
252
+ ]
253
+ },
254
+
255
+ // ============================================
256
+ // GEMINI CLI - Context, Commands & Skills
257
+ // ============================================
258
+ 'gemini': {
259
+ tabs: [
260
+ {
261
+ id: 'context',
262
+ name: 'Context',
263
+ icon: '💎',
264
+ path: path.join(homedir, '.gemini'),
265
+ format: 'context-md',
266
+ filePattern: 'GEMINI.md',
267
+ singleFile: true,
268
+ supportsDirectories: false,
269
+ description: 'Global context (GEMINI.md)'
270
+ },
271
+ {
272
+ id: 'commands',
273
+ name: 'Commands',
274
+ icon: '✨',
275
+ path: path.join(homedir, '.gemini', 'commands'),
276
+ format: 'command-toml',
277
+ filePattern: '*.toml',
278
+ supportsDirectories: false,
279
+ description: 'Custom commands'
280
+ },
281
+ {
282
+ id: 'skills',
283
+ name: 'Skills',
284
+ icon: '🎯',
285
+ path: path.join(homedir, '.gemini', 'skills'),
286
+ format: 'skill-md',
287
+ filePattern: '*.md',
288
+ supportsDirectories: true,
289
+ description: 'Agent skills (SKILL.md in subdirs)'
290
+ }
291
+ ]
292
+ },
293
+
294
+ // ============================================
295
+ // GOOGLE ANTIGRAVITY - Same as Gemini
296
+ // ============================================
297
+ 'google-antigravity': {
298
+ tabs: [
299
+ {
300
+ id: 'context',
301
+ name: 'Context',
302
+ icon: '💎',
303
+ path: path.join(homedir, '.gemini'),
304
+ format: 'context-md',
305
+ filePattern: 'GEMINI.md',
306
+ singleFile: true,
307
+ supportsDirectories: false,
308
+ description: 'Global context (GEMINI.md)'
309
+ },
310
+ {
311
+ id: 'commands',
312
+ name: 'Commands',
313
+ icon: '✨',
314
+ path: path.join(homedir, '.gemini', 'commands'),
315
+ format: 'command-toml',
316
+ filePattern: '*.toml',
317
+ supportsDirectories: false,
318
+ description: 'Custom commands'
319
+ },
320
+ {
321
+ id: 'skills',
322
+ name: 'Skills',
323
+ icon: '🎯',
324
+ path: path.join(homedir, '.gemini', 'skills'),
325
+ format: 'skill-md',
326
+ filePattern: '*.md',
327
+ supportsDirectories: true,
328
+ description: 'Agent skills (SKILL.md in subdirs)'
329
+ }
330
+ ]
331
+ },
332
+
333
+ // ============================================
334
+ // CODEX (OPENAI) - Agents & Skills
335
+ // ============================================
336
+ 'codex': {
337
+ tabs: [
338
+ {
339
+ id: 'agents',
340
+ name: 'Agents',
341
+ icon: '🧠',
342
+ path: path.join(homedir, '.codex'),
343
+ format: 'agents-md',
344
+ filePattern: 'AGENTS.md',
345
+ singleFile: true,
346
+ supportsDirectories: false,
347
+ description: 'Agent instructions (AGENTS.md)'
348
+ },
349
+ {
350
+ id: 'skills',
351
+ name: 'Skills',
352
+ icon: '🧠',
353
+ path: path.join(homedir, '.codex', 'skills'),
354
+ format: 'skill-md',
355
+ filePattern: '*.md',
356
+ supportsDirectories: true,
357
+ description: 'Agent skills (SKILL.md)'
358
+ }
359
+ ]
360
+ },
361
+
362
+ // ============================================
363
+ // JETBRAINS AI - Rules
364
+ // ============================================
365
+ 'jetbrains-ai': {
366
+ tabs: [
367
+ {
368
+ id: 'rules',
369
+ name: 'Rules',
370
+ icon: '🧩',
371
+ path: path.join(homedir, '.aiassistant', 'rules'),
372
+ format: 'rule-md',
373
+ filePattern: '*.md',
374
+ supportsDirectories: false,
375
+ description: 'Rules for JetBrains AI Assistant'
376
+ }
377
+ ]
378
+ },
379
+
380
+ // ============================================
381
+ // AUGMENT CODE - Commands & Rules
382
+ // NOTE: Rules are workspace-level (.augment/rules/), commands are user-level
383
+ // ============================================
384
+ 'augment': {
385
+ tabs: [
386
+ {
387
+ id: 'commands',
388
+ name: 'Commands',
389
+ icon: '⚡',
390
+ path: path.join(homedir, '.augment', 'commands'),
391
+ format: 'command-md',
392
+ filePattern: '*.md',
393
+ supportsDirectories: false,
394
+ description: 'User-wide commands for Augment Code'
395
+ },
396
+ {
397
+ id: 'rules',
398
+ name: 'Rules',
399
+ icon: '🔮',
400
+ path: path.join(homedir, '.augment', 'rules'),
401
+ format: 'rule-md',
402
+ filePattern: '*.md',
403
+ supportsDirectories: false,
404
+ description: 'Rules for Augment Code'
405
+ }
406
+ ]
407
+ },
408
+
409
+ // ============================================
410
+ // TABNINE - Guidelines
411
+ // ============================================
412
+ 'tabnine': {
413
+ tabs: [
414
+ {
415
+ id: 'guidelines',
416
+ name: 'Guidelines',
417
+ icon: '📋',
418
+ path: path.join(homedir, '.tabnine', 'guidelines'),
419
+ format: 'rule-md',
420
+ filePattern: '*.md',
421
+ supportsDirectories: false,
422
+ description: 'Guidelines for Tabnine'
423
+ }
424
+ ]
425
+ },
426
+
427
+ // ============================================
428
+ // ZED AI - No global skills support
429
+ // NOTE: Zed uses project-root .rules file for per-project config
430
+ // Rules Library stored in LMDB at ~/.config/zed/prompts/ (not editable)
431
+ // ============================================
432
+ 'zed': {
433
+ tabs: []
434
+ },
435
+
436
+ // ============================================
437
+ // AIDER - Conventions
438
+ // NOTE: Config lives in ~/.aider.conf.yml. Conventions loaded via --read flag.
439
+ // ============================================
440
+ 'aider': {
441
+ tabs: [
442
+ {
443
+ id: 'config',
444
+ name: 'Config',
445
+ icon: '🔧',
446
+ path: homedir,
447
+ format: 'yaml',
448
+ filePattern: '.aider.conf.yml',
449
+ singleFile: true,
450
+ supportsDirectories: false,
451
+ description: 'Global aider configuration'
452
+ }
453
+ ]
454
+ },
455
+
456
+ // ============================================
457
+ // 5IRE - No known skills support
458
+ // ============================================
459
+ '5ire': {
460
+ tabs: []
461
+ },
462
+
463
+ // ============================================
464
+ // FACTORY BRIDGE - No known skills support
465
+ // ============================================
466
+ 'factory-bridge': {
467
+ tabs: []
468
+ },
469
+
470
+ // ============================================
471
+ // CLAUDE DESKTOP - Skills, Commands & Agents (same as Claude Code)
472
+ // ============================================
473
+ 'claude': {
474
+ tabs: [
475
+ {
476
+ id: 'skills',
477
+ name: 'Skills',
478
+ icon: '🎭',
479
+ path: path.join(homedir, '.claude', 'skills'),
480
+ format: 'skill-md',
481
+ filePattern: '*.md',
482
+ supportsDirectories: true,
483
+ description: 'Modular expertise modules'
484
+ },
485
+ {
486
+ id: 'commands',
487
+ name: 'Commands',
488
+ icon: '⚡',
489
+ path: path.join(homedir, '.claude', 'commands'),
490
+ format: 'command-md',
491
+ filePattern: '*.md',
492
+ supportsDirectories: false,
493
+ description: 'Slash commands for quick prompts'
494
+ },
495
+ {
496
+ id: 'agents',
497
+ name: 'Agents',
498
+ icon: '🤖',
499
+ path: path.join(homedir, '.claude', 'agents'),
500
+ format: 'agent-md',
501
+ filePattern: '*.md',
502
+ supportsDirectories: false,
503
+ description: 'Custom subagents with YAML frontmatter'
504
+ }
505
+ ]
506
+ },
507
+
508
+ // ============================================
509
+ // FIREBENDER - Rules (JetBrains/Android Studio plugin)
510
+ // Personal rules at ~/.firebender/rules/*.mdc
511
+ // ============================================
512
+ 'firebender': {
513
+ tabs: [
514
+ {
515
+ id: 'rules',
516
+ name: 'Rules',
517
+ icon: '🔥',
518
+ path: path.join(homedir, '.firebender', 'rules'),
519
+ format: 'mdc',
520
+ filePattern: '*.mdc',
521
+ supportsDirectories: false,
522
+ description: 'Personal rules for Firebender'
523
+ }
524
+ ]
525
+ },
526
+
527
+ // ============================================
528
+ // GOOSE (Block) - Skills
529
+ // User-level at ~/.config/goose/skills/ and ~/.config/agents/skills/
530
+ // ============================================
531
+ 'goose': {
532
+ tabs: [
533
+ {
534
+ id: 'skills',
535
+ name: 'Skills',
536
+ icon: '🪿',
537
+ path: path.join(homedir, '.config', 'goose', 'skills'),
538
+ format: 'skill-md',
539
+ filePattern: '*.md',
540
+ supportsDirectories: true,
541
+ description: 'Goose-specific agent skills (SKILL.md)'
542
+ }
543
+ ]
544
+ },
545
+
546
+ // ============================================
547
+ // AMP (Sourcegraph) - Skills
548
+ // User-level at ~/.config/agents/skills/
549
+ // ============================================
550
+ 'amp': {
551
+ tabs: [
552
+ {
553
+ id: 'skills',
554
+ name: 'Skills',
555
+ icon: '⚡',
556
+ path: path.join(homedir, '.config', 'agents', 'skills'),
557
+ format: 'skill-md',
558
+ filePattern: '*.md',
559
+ supportsDirectories: true,
560
+ description: 'Agent skills (SKILL.md in subdirs)'
561
+ }
562
+ ]
563
+ },
564
+
565
+ // ============================================
566
+ // OPENCODE - Skills & Agents
567
+ // User-level at ~/.config/opencode/skills/
568
+ // ============================================
569
+ 'opencode': {
570
+ tabs: [
571
+ {
572
+ id: 'skills',
573
+ name: 'Skills',
574
+ icon: '💻',
575
+ path: path.join(homedir, '.config', 'opencode', 'skills'),
576
+ format: 'skill-md',
577
+ filePattern: '*.md',
578
+ supportsDirectories: true,
579
+ description: 'Agent skills (SKILL.md in subdirs)'
580
+ }
581
+ ]
582
+ },
583
+
584
+ // ============================================
585
+ // MISTRAL VIBE - Skills & Agents
586
+ // Skills at ~/.vibe/skills/, Agents at ~/.vibe/agents/
587
+ // ============================================
588
+ 'mistral-vibe': {
589
+ tabs: [
590
+ {
591
+ id: 'skills',
592
+ name: 'Skills',
593
+ icon: '🌀',
594
+ path: path.join(homedir, '.vibe', 'skills'),
595
+ format: 'skill-md',
596
+ filePattern: '*.md',
597
+ supportsDirectories: true,
598
+ description: 'Agent skills (SKILL.md in subdirs)'
599
+ },
600
+ {
601
+ id: 'agents',
602
+ name: 'Agents',
603
+ icon: '🤖',
604
+ path: path.join(homedir, '.vibe', 'agents'),
605
+ format: 'agent-toml',
606
+ filePattern: '*.toml',
607
+ supportsDirectories: false,
608
+ description: 'Custom agent profiles (.toml)'
609
+ }
610
+ ]
611
+ },
612
+
613
+ // ============================================
614
+ // PI CODING AGENT - Skills
615
+ // User-level at ~/.pi/agent/skills/
616
+ // ============================================
617
+ 'pi': {
618
+ tabs: [
619
+ {
620
+ id: 'skills',
621
+ name: 'Skills',
622
+ icon: '🥧',
623
+ path: path.join(homedir, '.pi', 'agent', 'skills'),
624
+ format: 'skill-md',
625
+ filePattern: '*.md',
626
+ supportsDirectories: true,
627
+ description: 'Agent skills (SKILL.md in subdirs)'
628
+ }
629
+ ]
630
+ },
631
+
632
+ // ============================================
633
+ // AUTOHAND CODE CLI - Skills
634
+ // User-level at ~/.autohand/skills/
635
+ // ============================================
636
+ 'autohand': {
637
+ tabs: [
638
+ {
639
+ id: 'skills',
640
+ name: 'Skills',
641
+ icon: '🤚',
642
+ path: path.join(homedir, '.autohand', 'skills'),
643
+ format: 'skill-md',
644
+ filePattern: '*.md',
645
+ supportsDirectories: true,
646
+ description: 'Agent skills (SKILL.md in subdirs)'
647
+ }
648
+ ]
649
+ },
650
+
651
+ // ============================================
652
+ // TRAE (ByteDance) - Rules
653
+ // NOTE: Project-level rules at .trae/rules/. Global path not yet confirmed.
654
+ // ============================================
655
+ 'trae': {
656
+ tabs: []
657
+ },
658
+
659
+ // ============================================
660
+ // LETTA CODE - Skills
661
+ // NOTE: Uses .skills/ at project level. Memory-first agent with Context Repos.
662
+ // ============================================
663
+ 'letta': {
664
+ tabs: []
665
+ },
666
+
667
+ // ============================================
668
+ // QODO - Rules & Agents
669
+ // NOTE: Uses TOML-based agent configs. No confirmed global user-level path.
670
+ // ============================================
671
+ 'qodo': {
672
+ tabs: []
673
+ },
674
+
675
+ // ============================================
676
+ // VT CODE - Skills
677
+ // NOTE: Follows Agent Skills standard but no confirmed global path.
678
+ // ============================================
679
+ 'vt-code': {
680
+ tabs: []
681
+ },
682
+
683
+ // ============================================
684
+ // COMMAND CODE
685
+ // NOTE: No confirmed skills path.
686
+ // ============================================
687
+ 'command-code': {
688
+ tabs: []
689
+ },
690
+
691
+ // ============================================
692
+ // PIEBALD - Uses Claude Code paths (desktop app wrapper)
693
+ // ============================================
694
+ 'piebald': {
695
+ tabs: [
696
+ {
697
+ id: 'skills',
698
+ name: 'Skills',
699
+ icon: '🎭',
700
+ path: path.join(homedir, '.claude', 'skills'),
701
+ format: 'skill-md',
702
+ filePattern: '*.md',
703
+ supportsDirectories: true,
704
+ description: 'Claude Code skills'
705
+ },
706
+ {
707
+ id: 'agents',
708
+ name: 'Agents',
709
+ icon: '🤖',
710
+ path: path.join(homedir, '.claude', 'agents'),
711
+ format: 'agent-md',
712
+ filePattern: '*.md',
713
+ supportsDirectories: false,
714
+ description: 'Claude Code agents'
715
+ }
716
+ ]
717
+ },
718
+
719
+ // ============================================
720
+ // ONA - Cloud-based, no local skills
721
+ // ============================================
722
+ 'ona': {
723
+ tabs: []
724
+ },
725
+
726
+ // ============================================
727
+ // AGENTMAN - No confirmed skills path
728
+ // ============================================
729
+ 'agentman': {
730
+ tabs: []
731
+ },
732
+
733
+ // ============================================
734
+ // MUX - No confirmed skills path
735
+ // ============================================
736
+ 'mux': {
737
+ tabs: []
738
+ },
739
+
740
+ // ============================================
741
+ // SPRING AI - Library, not standalone client
742
+ // ============================================
743
+ 'spring-ai': {
744
+ tabs: []
745
+ },
746
+
747
+ // ============================================
748
+ // DATABRICKS - Workspace-level skills only
749
+ // ============================================
750
+ 'databricks': {
751
+ tabs: []
752
+ }
753
+ };
754
+
755
+ /**
756
+ * Get skill tabs for a specific client
757
+ */
758
+ export function getClientSkillTabs(clientId) {
759
+ const config = CLIENT_SKILLS[clientId];
760
+ return config ? config.tabs : [];
761
+ }
762
+
763
+ /**
764
+ * Check if a client has any skill/prompt support
765
+ */
766
+ export function clientHasSkills(clientId) {
767
+ const tabs = getClientSkillTabs(clientId);
768
+ return tabs && tabs.length > 0;
769
+ }
770
+
771
+ /**
772
+ * Get a specific tab configuration for a client
773
+ */
774
+ export function getClientSkillTab(clientId, tabId) {
775
+ const tabs = getClientSkillTabs(clientId);
776
+ return tabs.find(t => t.id === tabId);
777
+ }
778
+
779
+ /**
780
+ * Get all clients that support skills
781
+ */
782
+ export function getClientsWithSkillSupport() {
783
+ return Object.entries(CLIENT_SKILLS)
784
+ .filter(([_, config]) => config.tabs && config.tabs.length > 0)
785
+ .map(([clientId, config]) => ({
786
+ clientId,
787
+ tabs: config.tabs
788
+ }));
789
+ }
790
+
791
+ // Legacy exports for backwards compatibility
792
+ export const SKILL_SCOPES = {};
793
+ export const COMMANDS_PATH = path.join(homedir, '.claude', 'commands');
794
+
795
+ export function getScope(scopeId) {
796
+ return null;
797
+ }
798
+
799
+ export function getScopesByPriority() {
800
+ return [];
801
+ }
802
+
803
+ export function getScopePath(scopeId) {
804
+ return null;
805
+ }
806
+
807
+ export function isScopeReadOnly(scopeId) {
808
+ return true;
809
+ }