vskill 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/dist/agents/agents-registry.d.ts +48 -37
  2. package/dist/agents/agents-registry.js +206 -261
  3. package/dist/agents/agents-registry.js.map +1 -1
  4. package/dist/agents/agents-registry.test.d.ts +1 -0
  5. package/dist/agents/agents-registry.test.js +203 -0
  6. package/dist/agents/agents-registry.test.js.map +1 -0
  7. package/dist/api/client.js +9 -1
  8. package/dist/api/client.js.map +1 -1
  9. package/dist/api/client.test.d.ts +1 -0
  10. package/dist/api/client.test.js +204 -0
  11. package/dist/api/client.test.js.map +1 -0
  12. package/dist/blocklist/blocklist.d.ts +23 -0
  13. package/dist/blocklist/blocklist.js +116 -0
  14. package/dist/blocklist/blocklist.js.map +1 -0
  15. package/dist/blocklist/blocklist.test.d.ts +1 -0
  16. package/dist/blocklist/blocklist.test.js +259 -0
  17. package/dist/blocklist/blocklist.test.js.map +1 -0
  18. package/dist/blocklist/types.d.ts +18 -0
  19. package/dist/blocklist/types.js +5 -0
  20. package/dist/blocklist/types.js.map +1 -0
  21. package/dist/commands/add.d.ts +2 -0
  22. package/dist/commands/add.js +221 -6
  23. package/dist/commands/add.js.map +1 -1
  24. package/dist/commands/add.test.d.ts +1 -0
  25. package/dist/commands/add.test.js +682 -0
  26. package/dist/commands/add.test.js.map +1 -0
  27. package/dist/commands/blocklist.d.ts +1 -0
  28. package/dist/commands/blocklist.js +87 -0
  29. package/dist/commands/blocklist.js.map +1 -0
  30. package/dist/commands/blocklist.test.d.ts +1 -0
  31. package/dist/commands/blocklist.test.js +158 -0
  32. package/dist/commands/blocklist.test.js.map +1 -0
  33. package/dist/commands/remove.d.ts +7 -0
  34. package/dist/commands/remove.js +91 -0
  35. package/dist/commands/remove.js.map +1 -0
  36. package/dist/commands/remove.test.d.ts +1 -0
  37. package/dist/commands/remove.test.js +164 -0
  38. package/dist/commands/remove.test.js.map +1 -0
  39. package/dist/commands/submit.d.ts +1 -1
  40. package/dist/commands/submit.js +26 -16
  41. package/dist/commands/submit.js.map +1 -1
  42. package/dist/commands/submit.test.d.ts +1 -0
  43. package/dist/commands/submit.test.js +74 -0
  44. package/dist/commands/submit.test.js.map +1 -0
  45. package/dist/index.js +21 -2
  46. package/dist/index.js.map +1 -1
  47. package/dist/lockfile/lockfile.test.d.ts +1 -0
  48. package/dist/lockfile/lockfile.test.js +196 -0
  49. package/dist/lockfile/lockfile.test.js.map +1 -0
  50. package/dist/lockfile/types.d.ts +8 -0
  51. package/dist/marketplace/index.d.ts +2 -0
  52. package/dist/marketplace/index.js +2 -0
  53. package/dist/marketplace/index.js.map +1 -0
  54. package/dist/marketplace/marketplace.d.ts +34 -0
  55. package/dist/marketplace/marketplace.js +51 -0
  56. package/dist/marketplace/marketplace.js.map +1 -0
  57. package/dist/marketplace/marketplace.test.d.ts +1 -0
  58. package/dist/marketplace/marketplace.test.js +103 -0
  59. package/dist/marketplace/marketplace.test.js.map +1 -0
  60. package/dist/scanner/index.d.ts +4 -0
  61. package/dist/scanner/index.js +4 -0
  62. package/dist/scanner/index.js.map +1 -1
  63. package/dist/scanner/patterns.test.d.ts +1 -0
  64. package/dist/scanner/patterns.test.js +353 -0
  65. package/dist/scanner/patterns.test.js.map +1 -0
  66. package/dist/scanner/repo-scanner.d.ts +30 -0
  67. package/dist/scanner/repo-scanner.js +190 -0
  68. package/dist/scanner/repo-scanner.js.map +1 -0
  69. package/dist/scanner/tier1.test.d.ts +1 -0
  70. package/dist/scanner/tier1.test.js +182 -0
  71. package/dist/scanner/tier1.test.js.map +1 -0
  72. package/dist/scanner/tier2-llm.d.ts +28 -0
  73. package/dist/scanner/tier2-llm.js +130 -0
  74. package/dist/scanner/tier2-llm.js.map +1 -0
  75. package/dist/scanner/types.d.ts +58 -0
  76. package/dist/scanner/types.js +5 -0
  77. package/dist/scanner/types.js.map +1 -0
  78. package/dist/security/index.d.ts +2 -0
  79. package/dist/security/index.js +2 -0
  80. package/dist/security/index.js.map +1 -0
  81. package/dist/security/platform-security.d.ts +17 -0
  82. package/dist/security/platform-security.js +34 -0
  83. package/dist/security/platform-security.js.map +1 -0
  84. package/dist/security/platform-security.test.d.ts +1 -0
  85. package/dist/security/platform-security.test.js +92 -0
  86. package/dist/security/platform-security.test.js.map +1 -0
  87. package/dist/settings/index.d.ts +2 -0
  88. package/dist/settings/index.js +2 -0
  89. package/dist/settings/index.js.map +1 -0
  90. package/dist/settings/settings.d.ts +16 -0
  91. package/dist/settings/settings.js +73 -0
  92. package/dist/settings/settings.js.map +1 -0
  93. package/dist/settings/settings.test.d.ts +1 -0
  94. package/dist/settings/settings.test.js +103 -0
  95. package/dist/settings/settings.test.js.map +1 -0
  96. package/dist/utils/__tests__/paths.test.d.ts +1 -0
  97. package/dist/utils/__tests__/paths.test.js +22 -0
  98. package/dist/utils/__tests__/paths.test.js.map +1 -0
  99. package/dist/utils/__tests__/validation.test.d.ts +1 -0
  100. package/dist/utils/__tests__/validation.test.js +49 -0
  101. package/dist/utils/__tests__/validation.test.js.map +1 -0
  102. package/dist/utils/browser.d.ts +6 -0
  103. package/dist/utils/browser.js +37 -0
  104. package/dist/utils/browser.js.map +1 -0
  105. package/dist/utils/paths.d.ts +5 -0
  106. package/dist/utils/paths.js +13 -0
  107. package/dist/utils/paths.js.map +1 -0
  108. package/dist/utils/validation.d.ts +14 -0
  109. package/dist/utils/validation.js +34 -0
  110. package/dist/utils/validation.js.map +1 -0
  111. package/package.json +5 -2
  112. package/scripts/preuninstall.cjs +58 -0
@@ -1,511 +1,456 @@
1
1
  /**
2
- * 39-Agent Registry for vskill CLI
2
+ * Agent Registry 39 AI coding agents with metadata.
3
3
  *
4
- * Complete registry of all AI coding agents that support the Agent Skills format.
5
- * Source: skills@1.3.9 npm package (vercel-labs/skills)
4
+ * Each agent has detection paths, parent company info, and feature support.
5
+ * Used to determine which agents can install/use verified skills.
6
+ */
7
+ /**
8
+ * Complete registry of 39 AI coding agents.
6
9
  *
7
- * @see research/agent-registry-data-model.md for full design documentation
10
+ * 7 universal agents, 32 non-universal agents.
8
11
  */
9
- import { existsSync } from 'node:fs';
10
- import { join } from 'node:path';
11
- import { homedir } from 'node:os';
12
- // ---------------------------------------------------------------------------
13
- // Helpers
14
- // ---------------------------------------------------------------------------
15
- const home = homedir();
16
- const xdgConfig = process.env.XDG_CONFIG_HOME || join(home, '.config');
17
- const claudeConfig = process.env.CLAUDE_CONFIG_DIR || join(home, '.claude');
18
- const codexHome = process.env.CODEX_HOME || join(home, '.codex');
19
- function exists(...segments) {
20
- return existsSync(join(...segments));
21
- }
22
- const DEFAULT_FEATURES = {
23
- basicSkills: true,
24
- allowedTools: true,
25
- contextFork: false,
26
- hooks: false,
27
- };
28
- // ---------------------------------------------------------------------------
29
- // Registry
30
- // ---------------------------------------------------------------------------
31
12
  export const AGENTS_REGISTRY = [
32
- // ═══ Universal Agents (7) ═══
13
+ // ----------------------------------------------------------------
14
+ // Universal agents (7)
15
+ // ----------------------------------------------------------------
33
16
  {
34
17
  id: 'amp',
35
18
  displayName: 'Amp',
36
- localSkillsDir: '.agents/skills',
37
- globalSkillsDir: join(xdgConfig, 'agents/skills'),
19
+ localSkillsDir: '.amp/skills',
20
+ globalSkillsDir: '~/.amp/skills',
38
21
  isUniversal: true,
39
- showInUniversalList: true,
40
- detectInstalled: async () => exists(xdgConfig, 'amp'),
41
- envVars: ['XDG_CONFIG_HOME'],
42
- parentCompany: 'Amp (Sourcegraph)',
43
- featureSupport: { ...DEFAULT_FEATURES },
22
+ detectInstalled: 'which amp',
23
+ parentCompany: 'Sourcegraph',
24
+ featureSupport: { slashCommands: true, hooks: false, mcp: true, customSystemPrompt: true },
44
25
  },
45
26
  {
46
27
  id: 'codex',
47
- displayName: 'Codex',
48
- localSkillsDir: '.agents/skills',
49
- globalSkillsDir: join(codexHome, 'skills'),
28
+ displayName: 'Codex CLI',
29
+ localSkillsDir: '.codex/skills',
30
+ globalSkillsDir: '~/.codex/skills',
50
31
  isUniversal: true,
51
- showInUniversalList: true,
52
- detectInstalled: async () => exists(codexHome) || exists('/etc/codex'),
53
- envVars: ['CODEX_HOME'],
32
+ detectInstalled: 'which codex',
54
33
  parentCompany: 'OpenAI',
55
- featureSupport: { ...DEFAULT_FEATURES },
34
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
56
35
  },
57
36
  {
58
37
  id: 'gemini-cli',
59
38
  displayName: 'Gemini CLI',
60
- localSkillsDir: '.agents/skills',
61
- globalSkillsDir: join(home, '.gemini/skills'),
39
+ localSkillsDir: '.gemini/skills',
40
+ globalSkillsDir: '~/.gemini/skills',
62
41
  isUniversal: true,
63
- showInUniversalList: true,
64
- detectInstalled: async () => exists(home, '.gemini'),
42
+ detectInstalled: 'which gemini',
65
43
  parentCompany: 'Google',
66
- featureSupport: { ...DEFAULT_FEATURES },
44
+ featureSupport: { slashCommands: false, hooks: false, mcp: true, customSystemPrompt: true },
67
45
  },
68
46
  {
69
47
  id: 'github-copilot',
70
48
  displayName: 'GitHub Copilot',
71
- localSkillsDir: '.agents/skills',
72
- globalSkillsDir: join(home, '.copilot/skills'),
49
+ localSkillsDir: '.github/copilot/skills',
50
+ globalSkillsDir: '~/.config/github-copilot/skills',
73
51
  isUniversal: true,
74
- showInUniversalList: true,
75
- detectInstalled: async () => exists(process.cwd(), '.github') || exists(home, '.copilot'),
76
- parentCompany: 'Microsoft',
77
- featureSupport: { ...DEFAULT_FEATURES },
78
- notes: 'Detection checks .github dir (common false positive)',
52
+ detectInstalled: 'which github-copilot',
53
+ parentCompany: 'GitHub (Microsoft)',
54
+ featureSupport: { slashCommands: true, hooks: false, mcp: true, customSystemPrompt: true },
79
55
  },
80
56
  {
81
57
  id: 'kimi-cli',
82
- displayName: 'Kimi Code CLI',
83
- localSkillsDir: '.agents/skills',
84
- globalSkillsDir: join(home, '.config/agents/skills'),
58
+ displayName: 'Kimi CLI',
59
+ localSkillsDir: '.kimi/skills',
60
+ globalSkillsDir: '~/.kimi/skills',
85
61
  isUniversal: true,
86
- showInUniversalList: true,
87
- detectInstalled: async () => exists(home, '.kimi'),
62
+ detectInstalled: 'which kimi',
88
63
  parentCompany: 'Moonshot AI',
89
- featureSupport: { ...DEFAULT_FEATURES },
64
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
90
65
  },
91
66
  {
92
67
  id: 'opencode',
93
68
  displayName: 'OpenCode',
94
- localSkillsDir: '.agents/skills',
95
- globalSkillsDir: join(xdgConfig, 'opencode/skills'),
69
+ localSkillsDir: '.opencode/skills',
70
+ globalSkillsDir: '~/.opencode/skills',
96
71
  isUniversal: true,
97
- showInUniversalList: true,
98
- detectInstalled: async () => exists(xdgConfig, 'opencode') || exists(home, '.claude/skills'),
99
- envVars: ['XDG_CONFIG_HOME'],
100
- parentCompany: 'sst (open source)',
101
- featureSupport: { ...DEFAULT_FEATURES },
102
- notes: 'Cross-detects Claude Code skills directory as fallback',
72
+ detectInstalled: 'which opencode',
73
+ parentCompany: 'Community',
74
+ featureSupport: { slashCommands: false, hooks: false, mcp: true, customSystemPrompt: true },
103
75
  },
104
76
  {
105
77
  id: 'replit',
106
- displayName: 'Replit',
107
- localSkillsDir: '.agents/skills',
108
- globalSkillsDir: join(xdgConfig, 'agents/skills'),
78
+ displayName: 'Replit Agent',
79
+ localSkillsDir: '.replit/skills',
80
+ globalSkillsDir: '~/.replit/skills',
109
81
  isUniversal: true,
110
- showInUniversalList: false,
111
- detectInstalled: async () => exists(process.cwd(), '.agents'),
112
- envVars: ['XDG_CONFIG_HOME'],
82
+ detectInstalled: 'which replit',
113
83
  parentCompany: 'Replit',
114
- featureSupport: { ...DEFAULT_FEATURES },
115
- notes: 'Hidden universal agent (showInUniversalList: false)',
84
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
116
85
  },
117
- // ═══ Non-Universal Agents (32) ═══
86
+ // ----------------------------------------------------------------
87
+ // Non-universal agents (32)
88
+ // ----------------------------------------------------------------
118
89
  {
119
90
  id: 'antigravity',
120
91
  displayName: 'Antigravity',
121
- localSkillsDir: '.agent/skills',
122
- globalSkillsDir: join(home, '.gemini/antigravity/skills'),
92
+ localSkillsDir: '.antigravity/skills',
93
+ globalSkillsDir: '~/.antigravity/skills',
123
94
  isUniversal: false,
124
- showInUniversalList: false,
125
- detectInstalled: async () => exists(process.cwd(), '.agent') || exists(home, '.gemini/antigravity'),
126
- parentCompany: 'Google',
127
- featureSupport: { ...DEFAULT_FEATURES },
128
- notes: 'Singular .agent/skills (not .agents/skills)',
95
+ detectInstalled: 'which antigravity',
96
+ parentCompany: 'Antigravity',
97
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
129
98
  },
130
99
  {
131
100
  id: 'augment',
132
- displayName: 'Augment',
101
+ displayName: 'Augment Code',
133
102
  localSkillsDir: '.augment/skills',
134
- globalSkillsDir: join(home, '.augment/skills'),
103
+ globalSkillsDir: '~/.augment/skills',
135
104
  isUniversal: false,
136
- showInUniversalList: false,
137
- detectInstalled: async () => exists(home, '.augment'),
105
+ detectInstalled: 'which augment',
138
106
  parentCompany: 'Augment',
139
- featureSupport: { ...DEFAULT_FEATURES },
107
+ featureSupport: { slashCommands: true, hooks: false, mcp: true, customSystemPrompt: true },
140
108
  },
141
109
  {
142
110
  id: 'claude-code',
143
111
  displayName: 'Claude Code',
144
- localSkillsDir: '.claude/skills',
145
- globalSkillsDir: join(claudeConfig, 'skills'),
112
+ localSkillsDir: '.claude/commands',
113
+ globalSkillsDir: '~/.claude/commands',
146
114
  isUniversal: false,
147
- showInUniversalList: false,
148
- detectInstalled: async () => exists(claudeConfig),
149
- envVars: ['CLAUDE_CONFIG_DIR'],
115
+ detectInstalled: 'which claude',
150
116
  parentCompany: 'Anthropic',
151
- featureSupport: { basicSkills: true, allowedTools: true, contextFork: true, hooks: true },
152
- notes: 'Most feature-rich agent. Only one supporting context: fork.',
117
+ featureSupport: { slashCommands: true, hooks: true, mcp: true, customSystemPrompt: true },
118
+ pluginCacheDir: '~/.claude/plugins/cache',
153
119
  },
154
120
  {
155
121
  id: 'openclaw',
156
122
  displayName: 'OpenClaw',
157
- localSkillsDir: 'skills',
158
- globalSkillsDir: join(home, '.openclaw/skills'),
123
+ localSkillsDir: '.openclaw/skills',
124
+ globalSkillsDir: '~/.openclaw/skills',
159
125
  isUniversal: false,
160
- showInUniversalList: false,
161
- detectInstalled: async () => exists(home, '.openclaw') || exists(home, '.clawdbot') || exists(home, '.moltbot'),
162
- parentCompany: 'OpenClaw',
163
- featureSupport: { ...DEFAULT_FEATURES },
164
- notes: 'Bare skills/ dir. 3 legacy global names from rebranding.',
126
+ detectInstalled: 'which openclaw',
127
+ parentCompany: 'Community',
128
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
165
129
  },
166
130
  {
167
131
  id: 'cline',
168
132
  displayName: 'Cline',
169
133
  localSkillsDir: '.cline/skills',
170
- globalSkillsDir: join(home, '.cline/skills'),
134
+ globalSkillsDir: '~/.cline/skills',
171
135
  isUniversal: false,
172
- showInUniversalList: false,
173
- detectInstalled: async () => exists(home, '.cline'),
174
- parentCompany: 'Cline (open source)',
175
- featureSupport: { basicSkills: true, allowedTools: true, contextFork: false, hooks: true },
176
- notes: 'One of two agents supporting hooks (with Claude Code)',
136
+ detectInstalled: 'which cline',
137
+ parentCompany: 'Cline',
138
+ featureSupport: { slashCommands: true, hooks: false, mcp: true, customSystemPrompt: true },
177
139
  },
178
140
  {
179
141
  id: 'codebuddy',
180
142
  displayName: 'CodeBuddy',
181
143
  localSkillsDir: '.codebuddy/skills',
182
- globalSkillsDir: join(home, '.codebuddy/skills'),
144
+ globalSkillsDir: '~/.codebuddy/skills',
183
145
  isUniversal: false,
184
- showInUniversalList: false,
185
- detectInstalled: async () => exists(process.cwd(), '.codebuddy') || exists(home, '.codebuddy'),
146
+ detectInstalled: 'which codebuddy',
186
147
  parentCompany: 'CodeBuddy',
187
- featureSupport: { ...DEFAULT_FEATURES },
148
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
188
149
  },
189
150
  {
190
151
  id: 'command-code',
191
152
  displayName: 'Command Code',
192
- localSkillsDir: '.commandcode/skills',
193
- globalSkillsDir: join(home, '.commandcode/skills'),
153
+ localSkillsDir: '.command-code/skills',
154
+ globalSkillsDir: '~/.command-code/skills',
194
155
  isUniversal: false,
195
- showInUniversalList: false,
196
- detectInstalled: async () => exists(home, '.commandcode'),
197
- parentCompany: 'Command Code',
198
- featureSupport: { ...DEFAULT_FEATURES },
156
+ detectInstalled: 'which command-code',
157
+ parentCompany: 'Command',
158
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
199
159
  },
200
160
  {
201
161
  id: 'continue',
202
162
  displayName: 'Continue',
203
163
  localSkillsDir: '.continue/skills',
204
- globalSkillsDir: join(home, '.continue/skills'),
164
+ globalSkillsDir: '~/.continue/skills',
205
165
  isUniversal: false,
206
- showInUniversalList: false,
207
- detectInstalled: async () => exists(process.cwd(), '.continue') || exists(home, '.continue'),
208
- parentCompany: 'Continue (open source)',
209
- featureSupport: { ...DEFAULT_FEATURES },
166
+ detectInstalled: 'which continue',
167
+ parentCompany: 'Continue',
168
+ featureSupport: { slashCommands: true, hooks: false, mcp: true, customSystemPrompt: true },
210
169
  },
211
170
  {
212
171
  id: 'crush',
213
172
  displayName: 'Crush',
214
173
  localSkillsDir: '.crush/skills',
215
- globalSkillsDir: join(home, '.config/crush/skills'),
174
+ globalSkillsDir: '~/.crush/skills',
216
175
  isUniversal: false,
217
- showInUniversalList: false,
218
- detectInstalled: async () => exists(home, '.config/crush'),
219
- parentCompany: 'Charmbracelet',
220
- featureSupport: { ...DEFAULT_FEATURES },
176
+ detectInstalled: 'which crush',
177
+ parentCompany: 'Crush',
178
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
221
179
  },
222
180
  {
223
181
  id: 'cursor',
224
182
  displayName: 'Cursor',
225
183
  localSkillsDir: '.cursor/skills',
226
- globalSkillsDir: join(home, '.cursor/skills'),
184
+ globalSkillsDir: '~/.cursor/skills',
227
185
  isUniversal: false,
228
- showInUniversalList: false,
229
- detectInstalled: async () => exists(home, '.cursor'),
186
+ detectInstalled: 'which cursor',
230
187
  parentCompany: 'Anysphere',
231
- featureSupport: { ...DEFAULT_FEATURES },
188
+ featureSupport: { slashCommands: true, hooks: false, mcp: true, customSystemPrompt: true },
232
189
  },
233
190
  {
234
191
  id: 'droid',
235
192
  displayName: 'Droid',
236
- localSkillsDir: '.factory/skills',
237
- globalSkillsDir: join(home, '.factory/skills'),
193
+ localSkillsDir: '.droid/skills',
194
+ globalSkillsDir: '~/.droid/skills',
238
195
  isUniversal: false,
239
- showInUniversalList: false,
240
- detectInstalled: async () => exists(home, '.factory'),
241
- parentCompany: 'Factory AI',
242
- featureSupport: { ...DEFAULT_FEATURES },
243
- notes: 'Dir is .factory/ not .droid/',
196
+ detectInstalled: 'which droid',
197
+ parentCompany: 'Droid',
198
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
244
199
  },
245
200
  {
246
201
  id: 'goose',
247
202
  displayName: 'Goose',
248
203
  localSkillsDir: '.goose/skills',
249
- globalSkillsDir: join(xdgConfig, 'goose/skills'),
204
+ globalSkillsDir: '~/.goose/skills',
250
205
  isUniversal: false,
251
- showInUniversalList: false,
252
- detectInstalled: async () => exists(xdgConfig, 'goose'),
253
- envVars: ['XDG_CONFIG_HOME'],
206
+ detectInstalled: 'which goose',
254
207
  parentCompany: 'Block',
255
- featureSupport: { ...DEFAULT_FEATURES },
208
+ featureSupport: { slashCommands: false, hooks: false, mcp: true, customSystemPrompt: true },
256
209
  },
257
210
  {
258
211
  id: 'junie',
259
212
  displayName: 'Junie',
260
213
  localSkillsDir: '.junie/skills',
261
- globalSkillsDir: join(home, '.junie/skills'),
214
+ globalSkillsDir: '~/.junie/skills',
262
215
  isUniversal: false,
263
- showInUniversalList: false,
264
- detectInstalled: async () => exists(home, '.junie'),
216
+ detectInstalled: 'which junie',
265
217
  parentCompany: 'JetBrains',
266
- featureSupport: { ...DEFAULT_FEATURES },
218
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
267
219
  },
268
220
  {
269
221
  id: 'iflow-cli',
270
222
  displayName: 'iFlow CLI',
271
223
  localSkillsDir: '.iflow/skills',
272
- globalSkillsDir: join(home, '.iflow/skills'),
224
+ globalSkillsDir: '~/.iflow/skills',
273
225
  isUniversal: false,
274
- showInUniversalList: false,
275
- detectInstalled: async () => exists(home, '.iflow'),
226
+ detectInstalled: 'which iflow',
276
227
  parentCompany: 'iFlow',
277
- featureSupport: { ...DEFAULT_FEATURES },
228
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
278
229
  },
279
230
  {
280
231
  id: 'kilo',
281
- displayName: 'Kilo Code',
282
- localSkillsDir: '.kilocode/skills',
283
- globalSkillsDir: join(home, '.kilocode/skills'),
232
+ displayName: 'Kilo',
233
+ localSkillsDir: '.kilo/skills',
234
+ globalSkillsDir: '~/.kilo/skills',
284
235
  isUniversal: false,
285
- showInUniversalList: false,
286
- detectInstalled: async () => exists(home, '.kilocode'),
287
- parentCompany: 'Kilo Code',
288
- featureSupport: { ...DEFAULT_FEATURES },
236
+ detectInstalled: 'which kilo',
237
+ parentCompany: 'Kilo',
238
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
289
239
  },
290
240
  {
291
241
  id: 'kiro-cli',
292
242
  displayName: 'Kiro CLI',
293
243
  localSkillsDir: '.kiro/skills',
294
- globalSkillsDir: join(home, '.kiro/skills'),
244
+ globalSkillsDir: '~/.kiro/skills',
295
245
  isUniversal: false,
296
- showInUniversalList: false,
297
- detectInstalled: async () => exists(home, '.kiro'),
298
- parentCompany: 'Amazon (AWS)',
299
- featureSupport: { basicSkills: true, allowedTools: false, contextFork: false, hooks: false },
300
- notes: 'Does NOT support allowed-tools. Requires manual registration.',
246
+ detectInstalled: 'which kiro',
247
+ parentCompany: 'Amazon',
248
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
301
249
  },
302
250
  {
303
251
  id: 'kode',
304
252
  displayName: 'Kode',
305
253
  localSkillsDir: '.kode/skills',
306
- globalSkillsDir: join(home, '.kode/skills'),
254
+ globalSkillsDir: '~/.kode/skills',
307
255
  isUniversal: false,
308
- showInUniversalList: false,
309
- detectInstalled: async () => exists(home, '.kode'),
256
+ detectInstalled: 'which kode',
310
257
  parentCompany: 'Kode',
311
- featureSupport: { ...DEFAULT_FEATURES },
258
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
312
259
  },
313
260
  {
314
261
  id: 'mcpjam',
315
262
  displayName: 'MCPJam',
316
263
  localSkillsDir: '.mcpjam/skills',
317
- globalSkillsDir: join(home, '.mcpjam/skills'),
264
+ globalSkillsDir: '~/.mcpjam/skills',
318
265
  isUniversal: false,
319
- showInUniversalList: false,
320
- detectInstalled: async () => exists(home, '.mcpjam'),
266
+ detectInstalled: 'which mcpjam',
321
267
  parentCompany: 'MCPJam',
322
- featureSupport: { ...DEFAULT_FEATURES },
268
+ featureSupport: { slashCommands: false, hooks: false, mcp: true, customSystemPrompt: false },
323
269
  },
324
270
  {
325
271
  id: 'mistral-vibe',
326
272
  displayName: 'Mistral Vibe',
327
- localSkillsDir: '.vibe/skills',
328
- globalSkillsDir: join(home, '.vibe/skills'),
273
+ localSkillsDir: '.mistral/skills',
274
+ globalSkillsDir: '~/.mistral/skills',
329
275
  isUniversal: false,
330
- showInUniversalList: false,
331
- detectInstalled: async () => exists(home, '.vibe'),
276
+ detectInstalled: 'which mistral-vibe',
332
277
  parentCompany: 'Mistral AI',
333
- featureSupport: { ...DEFAULT_FEATURES },
334
- notes: 'Dir is .vibe/ not .mistral-vibe/',
278
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
335
279
  },
336
280
  {
337
281
  id: 'mux',
338
282
  displayName: 'Mux',
339
283
  localSkillsDir: '.mux/skills',
340
- globalSkillsDir: join(home, '.mux/skills'),
284
+ globalSkillsDir: '~/.mux/skills',
341
285
  isUniversal: false,
342
- showInUniversalList: false,
343
- detectInstalled: async () => exists(home, '.mux'),
286
+ detectInstalled: 'which mux',
344
287
  parentCompany: 'Mux',
345
- featureSupport: { ...DEFAULT_FEATURES },
288
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
346
289
  },
347
290
  {
348
291
  id: 'openhands',
349
292
  displayName: 'OpenHands',
350
293
  localSkillsDir: '.openhands/skills',
351
- globalSkillsDir: join(home, '.openhands/skills'),
294
+ globalSkillsDir: '~/.openhands/skills',
352
295
  isUniversal: false,
353
- showInUniversalList: false,
354
- detectInstalled: async () => exists(home, '.openhands'),
355
- parentCompany: 'All Hands AI (open source)',
356
- featureSupport: { ...DEFAULT_FEATURES },
296
+ detectInstalled: 'which openhands',
297
+ parentCompany: 'All Hands AI',
298
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
357
299
  },
358
300
  {
359
301
  id: 'pi',
360
302
  displayName: 'Pi',
361
303
  localSkillsDir: '.pi/skills',
362
- globalSkillsDir: join(home, '.pi/agent/skills'),
304
+ globalSkillsDir: '~/.pi/skills',
363
305
  isUniversal: false,
364
- showInUniversalList: false,
365
- detectInstalled: async () => exists(home, '.pi/agent'),
306
+ detectInstalled: 'which pi',
366
307
  parentCompany: 'Pi',
367
- featureSupport: { ...DEFAULT_FEATURES },
368
- notes: 'Nested global path: ~/.pi/agent/skills',
308
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
369
309
  },
370
310
  {
371
311
  id: 'qoder',
372
312
  displayName: 'Qoder',
373
313
  localSkillsDir: '.qoder/skills',
374
- globalSkillsDir: join(home, '.qoder/skills'),
314
+ globalSkillsDir: '~/.qoder/skills',
375
315
  isUniversal: false,
376
- showInUniversalList: false,
377
- detectInstalled: async () => exists(home, '.qoder'),
316
+ detectInstalled: 'which qoder',
378
317
  parentCompany: 'Qoder',
379
- featureSupport: { ...DEFAULT_FEATURES },
318
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
380
319
  },
381
320
  {
382
321
  id: 'qwen-code',
383
322
  displayName: 'Qwen Code',
384
323
  localSkillsDir: '.qwen/skills',
385
- globalSkillsDir: join(home, '.qwen/skills'),
324
+ globalSkillsDir: '~/.qwen/skills',
386
325
  isUniversal: false,
387
- showInUniversalList: false,
388
- detectInstalled: async () => exists(home, '.qwen'),
326
+ detectInstalled: 'which qwen-code',
389
327
  parentCompany: 'Alibaba',
390
- featureSupport: { ...DEFAULT_FEATURES },
391
- notes: 'Dir is .qwen/ not .qwen-code/',
328
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
392
329
  },
393
330
  {
394
331
  id: 'roo',
395
332
  displayName: 'Roo Code',
396
333
  localSkillsDir: '.roo/skills',
397
- globalSkillsDir: join(home, '.roo/skills'),
334
+ globalSkillsDir: '~/.roo/skills',
398
335
  isUniversal: false,
399
- showInUniversalList: false,
400
- detectInstalled: async () => exists(home, '.roo'),
401
- parentCompany: 'Roo Code',
402
- featureSupport: { ...DEFAULT_FEATURES },
336
+ detectInstalled: 'which roo',
337
+ parentCompany: 'Roo',
338
+ featureSupport: { slashCommands: true, hooks: false, mcp: true, customSystemPrompt: true },
403
339
  },
404
340
  {
405
341
  id: 'trae',
406
342
  displayName: 'Trae',
407
343
  localSkillsDir: '.trae/skills',
408
- globalSkillsDir: join(home, '.trae/skills'),
344
+ globalSkillsDir: '~/.trae/skills',
409
345
  isUniversal: false,
410
- showInUniversalList: false,
411
- detectInstalled: async () => exists(home, '.trae'),
346
+ detectInstalled: 'which trae',
412
347
  parentCompany: 'ByteDance',
413
- featureSupport: { ...DEFAULT_FEATURES },
414
- notes: 'Shares localSkillsDir with Trae CN',
348
+ featureSupport: { slashCommands: false, hooks: false, mcp: true, customSystemPrompt: true },
415
349
  },
416
350
  {
417
351
  id: 'trae-cn',
418
352
  displayName: 'Trae CN',
419
- localSkillsDir: '.trae/skills',
420
- globalSkillsDir: join(home, '.trae-cn/skills'),
353
+ localSkillsDir: '.trae-cn/skills',
354
+ globalSkillsDir: '~/.trae-cn/skills',
421
355
  isUniversal: false,
422
- showInUniversalList: false,
423
- detectInstalled: async () => exists(home, '.trae-cn'),
356
+ detectInstalled: 'which trae-cn',
424
357
  parentCompany: 'ByteDance',
425
- featureSupport: { ...DEFAULT_FEATURES },
426
- notes: 'China variant. Shares localSkillsDir with Trae.',
358
+ featureSupport: { slashCommands: false, hooks: false, mcp: true, customSystemPrompt: true },
427
359
  },
428
360
  {
429
361
  id: 'windsurf',
430
362
  displayName: 'Windsurf',
431
363
  localSkillsDir: '.windsurf/skills',
432
- globalSkillsDir: join(home, '.codeium/windsurf/skills'),
364
+ globalSkillsDir: '~/.windsurf/skills',
433
365
  isUniversal: false,
434
- showInUniversalList: false,
435
- detectInstalled: async () => exists(home, '.codeium/windsurf'),
366
+ detectInstalled: 'which windsurf',
436
367
  parentCompany: 'Codeium',
437
- featureSupport: { ...DEFAULT_FEATURES },
438
- notes: 'Global path under ~/.codeium/windsurf/',
368
+ featureSupport: { slashCommands: true, hooks: false, mcp: true, customSystemPrompt: true },
439
369
  },
440
370
  {
441
371
  id: 'zencoder',
442
- displayName: 'Zencoder',
372
+ displayName: 'ZenCoder',
443
373
  localSkillsDir: '.zencoder/skills',
444
- globalSkillsDir: join(home, '.zencoder/skills'),
374
+ globalSkillsDir: '~/.zencoder/skills',
445
375
  isUniversal: false,
446
- showInUniversalList: false,
447
- detectInstalled: async () => exists(home, '.zencoder'),
448
- parentCompany: 'Zencoder',
449
- featureSupport: { basicSkills: true, allowedTools: false, contextFork: false, hooks: false },
450
- notes: 'Does NOT support allowed-tools',
376
+ detectInstalled: 'which zencoder',
377
+ parentCompany: 'ZenCoder',
378
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
451
379
  },
452
380
  {
453
381
  id: 'neovate',
454
382
  displayName: 'Neovate',
455
383
  localSkillsDir: '.neovate/skills',
456
- globalSkillsDir: join(home, '.neovate/skills'),
384
+ globalSkillsDir: '~/.neovate/skills',
457
385
  isUniversal: false,
458
- showInUniversalList: false,
459
- detectInstalled: async () => exists(home, '.neovate'),
386
+ detectInstalled: 'which neovate',
460
387
  parentCompany: 'Neovate',
461
- featureSupport: { ...DEFAULT_FEATURES },
388
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
462
389
  },
463
390
  {
464
391
  id: 'pochi',
465
392
  displayName: 'Pochi',
466
393
  localSkillsDir: '.pochi/skills',
467
- globalSkillsDir: join(home, '.pochi/skills'),
394
+ globalSkillsDir: '~/.pochi/skills',
468
395
  isUniversal: false,
469
- showInUniversalList: false,
470
- detectInstalled: async () => exists(home, '.pochi'),
396
+ detectInstalled: 'which pochi',
471
397
  parentCompany: 'Pochi',
472
- featureSupport: { ...DEFAULT_FEATURES },
398
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
473
399
  },
474
400
  {
475
401
  id: 'adal',
476
- displayName: 'AdaL',
402
+ displayName: 'Adal',
477
403
  localSkillsDir: '.adal/skills',
478
- globalSkillsDir: join(home, '.adal/skills'),
404
+ globalSkillsDir: '~/.adal/skills',
479
405
  isUniversal: false,
480
- showInUniversalList: false,
481
- detectInstalled: async () => exists(home, '.adal'),
482
- parentCompany: 'AdaL',
483
- featureSupport: { ...DEFAULT_FEATURES },
406
+ detectInstalled: 'which adal',
407
+ parentCompany: 'Adal',
408
+ featureSupport: { slashCommands: false, hooks: false, mcp: false, customSystemPrompt: true },
484
409
  },
485
410
  ];
486
- // ---------------------------------------------------------------------------
487
- // Utility Functions
488
- // ---------------------------------------------------------------------------
489
- /** Get all universal agents */
411
+ /** Total number of registered agents */
412
+ export const TOTAL_AGENTS = AGENTS_REGISTRY.length;
413
+ /**
414
+ * Returns all universal agents (support the universal skill format).
415
+ */
490
416
  export function getUniversalAgents() {
491
- return AGENTS_REGISTRY.filter(a => a.isUniversal);
417
+ return AGENTS_REGISTRY.filter((a) => a.isUniversal);
492
418
  }
493
- /** Get all non-universal agents */
419
+ /**
420
+ * Returns all non-universal agents.
421
+ */
494
422
  export function getNonUniversalAgents() {
495
- return AGENTS_REGISTRY.filter(a => !a.isUniversal);
423
+ return AGENTS_REGISTRY.filter((a) => !a.isUniversal);
496
424
  }
497
- /** Find an agent by ID */
425
+ /**
426
+ * Gets a single agent by ID.
427
+ *
428
+ * @param id - Agent identifier
429
+ * @returns The agent definition, or undefined if not found
430
+ */
498
431
  export function getAgent(id) {
499
- return AGENTS_REGISTRY.find(a => a.id === id);
432
+ return AGENTS_REGISTRY.find((a) => a.id === id);
500
433
  }
501
- /** Detect all installed agents */
434
+ /**
435
+ * Detects which agents are installed on the current system
436
+ * by running each agent's detectInstalled command.
437
+ *
438
+ * @returns Array of installed agent definitions
439
+ */
502
440
  export async function detectInstalledAgents() {
503
- const results = await Promise.all(AGENTS_REGISTRY.map(async (agent) => ({
504
- agent,
505
- installed: await agent.detectInstalled(),
506
- })));
507
- return results.filter(r => r.installed).map(r => r.agent);
441
+ const { exec } = await import('node:child_process');
442
+ const { promisify } = await import('node:util');
443
+ const execAsync = promisify(exec);
444
+ const results = [];
445
+ await Promise.allSettled(AGENTS_REGISTRY.map(async (agent) => {
446
+ try {
447
+ await execAsync(agent.detectInstalled);
448
+ results.push(agent);
449
+ }
450
+ catch {
451
+ // Not installed — skip
452
+ }
453
+ }));
454
+ return results.sort((a, b) => a.id.localeCompare(b.id));
508
455
  }
509
- /** Total agent count */
510
- export const TOTAL_AGENTS = AGENTS_REGISTRY.length; // 39
511
456
  //# sourceMappingURL=agents-registry.js.map