@rbbtsn0w/adg 0.1.0-alpha.1 → 0.1.0-beta.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 (110) hide show
  1. package/dist/bin/adg.js +703 -0
  2. package/dist/src/adapters/anthropic.js +54 -0
  3. package/dist/src/adapters/index.js +10 -0
  4. package/dist/src/adapters/openai.js +30 -0
  5. package/dist/src/adapters/reverse.js +53 -0
  6. package/dist/src/agents/claude.js +118 -0
  7. package/dist/src/agents/codex.js +61 -0
  8. package/{src/agents/index.ts → dist/src/agents/index.js} +6 -8
  9. package/dist/src/agents/registry.js +24 -0
  10. package/dist/src/agents/types.js +1 -0
  11. package/dist/src/commands/adapt.js +26 -0
  12. package/dist/src/commands/import.js +51 -0
  13. package/dist/src/commands/init.js +104 -0
  14. package/dist/src/commands/install.js +257 -0
  15. package/dist/src/commands/link.js +34 -0
  16. package/dist/src/commands/list.js +19 -0
  17. package/dist/src/commands/marketplace.js +124 -0
  18. package/dist/src/commands/migrate.js +60 -0
  19. package/dist/src/commands/multiselect-skills.js +103 -0
  20. package/dist/src/commands/remove.js +102 -0
  21. package/dist/src/commands/select-agents.js +40 -0
  22. package/dist/src/commands/select-components.js +61 -0
  23. package/dist/src/commands/select-plugins.js +25 -0
  24. package/dist/src/commands/select-scope.js +20 -0
  25. package/dist/src/commands/update.js +50 -0
  26. package/dist/src/commands/validate.js +50 -0
  27. package/dist/src/components.js +90 -0
  28. package/dist/src/deps.js +46 -0
  29. package/dist/src/fsutil.js +32 -0
  30. package/dist/src/hash.js +51 -0
  31. package/dist/src/lock.js +51 -0
  32. package/dist/src/manifest.js +110 -0
  33. package/dist/src/marketplace.js +39 -0
  34. package/{src/package.ts → dist/src/package.js} +37 -42
  35. package/{src/paths.ts → dist/src/paths.js} +54 -60
  36. package/dist/src/semver.js +55 -0
  37. package/dist/src/skills.js +79 -0
  38. package/dist/src/sources.js +122 -0
  39. package/dist/src/types.js +19 -0
  40. package/dist/vendor/skills/package.json +143 -0
  41. package/dist/vendor/skills/src/add.js +1663 -0
  42. package/dist/vendor/skills/src/agents.js +729 -0
  43. package/dist/vendor/skills/src/blob.js +436 -0
  44. package/dist/vendor/skills/src/cli.js +340 -0
  45. package/dist/vendor/skills/src/constants.js +3 -0
  46. package/dist/vendor/skills/src/detect-agent.js +56 -0
  47. package/dist/vendor/skills/src/find.js +294 -0
  48. package/dist/vendor/skills/src/frontmatter.js +13 -0
  49. package/dist/vendor/skills/src/git-tree.js +32 -0
  50. package/dist/vendor/skills/src/git.js +235 -0
  51. package/dist/vendor/skills/src/install.js +75 -0
  52. package/dist/vendor/skills/src/installer.js +924 -0
  53. package/dist/vendor/skills/src/list.js +201 -0
  54. package/dist/vendor/skills/src/local-lock.js +109 -0
  55. package/dist/vendor/skills/src/plugin-manifest.js +152 -0
  56. package/dist/vendor/skills/src/prompts/search-multiselect.js +312 -0
  57. package/dist/vendor/skills/src/providers/index.js +4 -0
  58. package/dist/vendor/skills/src/providers/registry.js +42 -0
  59. package/dist/vendor/skills/src/providers/types.js +1 -0
  60. package/dist/vendor/skills/src/providers/wellknown.js +625 -0
  61. package/dist/vendor/skills/src/remove.js +263 -0
  62. package/dist/vendor/skills/src/sanitize.js +57 -0
  63. package/dist/vendor/skills/src/self-cli.js +15 -0
  64. package/dist/vendor/skills/src/skill-lock.js +237 -0
  65. package/dist/vendor/skills/src/skills.js +264 -0
  66. package/dist/vendor/skills/src/source-parser.js +367 -0
  67. package/dist/vendor/skills/src/sync.js +404 -0
  68. package/dist/vendor/skills/src/telemetry.js +101 -0
  69. package/dist/vendor/skills/src/test-utils.js +59 -0
  70. package/dist/vendor/skills/src/types.js +1 -0
  71. package/dist/vendor/skills/src/update-source.js +76 -0
  72. package/dist/vendor/skills/src/update.js +590 -0
  73. package/dist/vendor/skills/src/use.js +505 -0
  74. package/package.json +15 -7
  75. package/bin/adg.ts +0 -758
  76. package/src/adapters/anthropic.ts +0 -54
  77. package/src/adapters/index.ts +0 -24
  78. package/src/adapters/openai.ts +0 -37
  79. package/src/adapters/reverse.ts +0 -60
  80. package/src/agents/claude.ts +0 -124
  81. package/src/agents/codex.ts +0 -67
  82. package/src/agents/registry.ts +0 -30
  83. package/src/agents/types.ts +0 -47
  84. package/src/commands/adapt.ts +0 -36
  85. package/src/commands/import.ts +0 -69
  86. package/src/commands/init.ts +0 -146
  87. package/src/commands/install.ts +0 -411
  88. package/src/commands/link.ts +0 -61
  89. package/src/commands/list.ts +0 -28
  90. package/src/commands/marketplace.ts +0 -198
  91. package/src/commands/migrate.ts +0 -84
  92. package/src/commands/multiselect-skills.ts +0 -137
  93. package/src/commands/remove.ts +0 -136
  94. package/src/commands/select-agents.ts +0 -45
  95. package/src/commands/select-components.ts +0 -66
  96. package/src/commands/select-plugins.ts +0 -28
  97. package/src/commands/select-scope.ts +0 -21
  98. package/src/commands/update.ts +0 -85
  99. package/src/commands/validate.ts +0 -57
  100. package/src/components.ts +0 -90
  101. package/src/deps.ts +0 -64
  102. package/src/fsutil.ts +0 -38
  103. package/src/hash.ts +0 -61
  104. package/src/lock.ts +0 -57
  105. package/src/manifest.ts +0 -113
  106. package/src/marketplace.ts +0 -41
  107. package/src/semver.ts +0 -67
  108. package/src/skills.ts +0 -88
  109. package/src/sources.ts +0 -159
  110. package/src/types.ts +0 -140
@@ -0,0 +1,729 @@
1
+ import { homedir } from 'os';
2
+ import { join } from 'path';
3
+ import { existsSync } from 'fs';
4
+ import { xdgConfig } from 'xdg-basedir';
5
+ const home = homedir();
6
+ // Use xdg-basedir (not env-paths) to match OpenCode/Amp/Goose behavior on all platforms.
7
+ const configHome = xdgConfig ?? join(home, '.config');
8
+ // ADG patch: the universal `.agents/` home. Mirrors getSkillLockPath() and ADG's
9
+ // globalPluginsDir() so the skills domain, its lock, and plugins all share one
10
+ // root: `$XDG_STATE_HOME/.agents` if set, else `~/.agents`. Upstream pointed the
11
+ // universal *global* dir at `$XDG_CONFIG_HOME/agents/skills`, which split the
12
+ // root from its own project dir (`.agents/skills`). See vendor/skills/PROVENANCE.md.
13
+ const agentsHome = join(process.env.XDG_STATE_HOME ?? home, '.agents');
14
+ const codexHome = process.env.CODEX_HOME?.trim() || join(home, '.codex');
15
+ const claudeHome = process.env.CLAUDE_CONFIG_DIR?.trim() || join(home, '.claude');
16
+ const vibeHome = process.env.VIBE_HOME?.trim() || join(home, '.vibe');
17
+ const hermesHome = process.env.HERMES_HOME?.trim() || join(home, '.hermes');
18
+ const autohandHome = process.env.AUTOHAND_HOME?.trim() || join(home, '.autohand');
19
+ const zedAppDataHome = process.env.APPDATA?.trim();
20
+ const zedFlatpakConfigHome = process.env.FLATPAK_XDG_CONFIG_HOME?.trim();
21
+ export function getOpenClawGlobalSkillsDir(homeDir = home, pathExists = existsSync) {
22
+ if (pathExists(join(homeDir, '.openclaw'))) {
23
+ return join(homeDir, '.openclaw/skills');
24
+ }
25
+ if (pathExists(join(homeDir, '.clawdbot'))) {
26
+ return join(homeDir, '.clawdbot/skills');
27
+ }
28
+ if (pathExists(join(homeDir, '.moltbot'))) {
29
+ return join(homeDir, '.moltbot/skills');
30
+ }
31
+ return join(homeDir, '.openclaw/skills');
32
+ }
33
+ export const agents = {
34
+ 'aider-desk': {
35
+ name: 'aider-desk',
36
+ displayName: 'AiderDesk',
37
+ skillsDir: '.aider-desk/skills',
38
+ globalSkillsDir: join(home, '.aider-desk/skills'),
39
+ detectInstalled: async () => {
40
+ return existsSync(join(home, '.aider-desk'));
41
+ },
42
+ },
43
+ amp: {
44
+ name: 'amp',
45
+ displayName: 'Amp',
46
+ skillsDir: '.agents/skills',
47
+ globalSkillsDir: join(configHome, 'agents/skills'),
48
+ detectInstalled: async () => {
49
+ return existsSync(join(configHome, 'amp'));
50
+ },
51
+ },
52
+ antigravity: {
53
+ name: 'antigravity',
54
+ displayName: 'Antigravity',
55
+ skillsDir: '.agents/skills',
56
+ globalSkillsDir: join(home, '.gemini/antigravity/skills'),
57
+ detectInstalled: async () => {
58
+ return existsSync(join(home, '.gemini/antigravity'));
59
+ },
60
+ },
61
+ 'antigravity-cli': {
62
+ name: 'antigravity-cli',
63
+ displayName: 'Antigravity CLI',
64
+ skillsDir: '.agents/skills',
65
+ globalSkillsDir: join(home, '.gemini/antigravity-cli/skills'),
66
+ detectInstalled: async () => {
67
+ return existsSync(join(home, '.gemini/antigravity-cli'));
68
+ },
69
+ },
70
+ astrbot: {
71
+ name: 'astrbot',
72
+ displayName: 'AstrBot',
73
+ skillsDir: 'data/skills',
74
+ globalSkillsDir: join(home, '.astrbot/data/skills'),
75
+ detectInstalled: async () => {
76
+ return existsSync(join(process.cwd(), 'data/skills')) || existsSync(join(home, '.astrbot'));
77
+ },
78
+ },
79
+ 'autohand-code': {
80
+ name: 'autohand-code',
81
+ displayName: 'Autohand Code CLI',
82
+ skillsDir: '.autohand/skills',
83
+ globalSkillsDir: join(autohandHome, 'skills'),
84
+ detectInstalled: async () => {
85
+ return existsSync(autohandHome);
86
+ },
87
+ },
88
+ augment: {
89
+ name: 'augment',
90
+ displayName: 'Augment',
91
+ skillsDir: '.augment/skills',
92
+ globalSkillsDir: join(home, '.augment/skills'),
93
+ detectInstalled: async () => {
94
+ return existsSync(join(home, '.augment'));
95
+ },
96
+ },
97
+ bob: {
98
+ name: 'bob',
99
+ displayName: 'IBM Bob',
100
+ skillsDir: '.bob/skills',
101
+ globalSkillsDir: join(home, '.bob/skills'),
102
+ detectInstalled: async () => {
103
+ return existsSync(join(home, '.bob'));
104
+ },
105
+ },
106
+ 'claude-code': {
107
+ name: 'claude-code',
108
+ displayName: 'Claude Code',
109
+ skillsDir: '.claude/skills',
110
+ globalSkillsDir: join(claudeHome, 'skills'),
111
+ detectInstalled: async () => {
112
+ return existsSync(claudeHome);
113
+ },
114
+ },
115
+ openclaw: {
116
+ name: 'openclaw',
117
+ displayName: 'OpenClaw',
118
+ skillsDir: 'skills',
119
+ globalSkillsDir: getOpenClawGlobalSkillsDir(),
120
+ detectInstalled: async () => {
121
+ return (existsSync(join(home, '.openclaw')) ||
122
+ existsSync(join(home, '.clawdbot')) ||
123
+ existsSync(join(home, '.moltbot')));
124
+ },
125
+ },
126
+ cline: {
127
+ name: 'cline',
128
+ displayName: 'Cline',
129
+ skillsDir: '.agents/skills',
130
+ globalSkillsDir: join(home, '.agents', 'skills'),
131
+ detectInstalled: async () => {
132
+ return existsSync(join(home, '.cline'));
133
+ },
134
+ },
135
+ 'codearts-agent': {
136
+ name: 'codearts-agent',
137
+ displayName: 'CodeArts Agent',
138
+ skillsDir: '.codeartsdoer/skills',
139
+ globalSkillsDir: join(home, '.codeartsdoer/skills'),
140
+ detectInstalled: async () => {
141
+ return existsSync(join(home, '.codeartsdoer'));
142
+ },
143
+ },
144
+ codebuddy: {
145
+ name: 'codebuddy',
146
+ displayName: 'CodeBuddy',
147
+ skillsDir: '.codebuddy/skills',
148
+ globalSkillsDir: join(home, '.codebuddy/skills'),
149
+ detectInstalled: async () => {
150
+ return existsSync(join(process.cwd(), '.codebuddy')) || existsSync(join(home, '.codebuddy'));
151
+ },
152
+ },
153
+ codemaker: {
154
+ name: 'codemaker',
155
+ displayName: 'Codemaker',
156
+ skillsDir: '.codemaker/skills',
157
+ globalSkillsDir: join(home, '.codemaker/skills'),
158
+ detectInstalled: async () => {
159
+ return existsSync(join(home, '.codemaker'));
160
+ },
161
+ },
162
+ codestudio: {
163
+ name: 'codestudio',
164
+ displayName: 'Code Studio',
165
+ skillsDir: '.codestudio/skills',
166
+ globalSkillsDir: join(home, '.codestudio/skills'),
167
+ detectInstalled: async () => {
168
+ return existsSync(join(home, '.codestudio'));
169
+ },
170
+ },
171
+ codex: {
172
+ name: 'codex',
173
+ displayName: 'Codex',
174
+ skillsDir: '.agents/skills',
175
+ globalSkillsDir: join(codexHome, 'skills'),
176
+ detectInstalled: async () => {
177
+ return existsSync(codexHome) || existsSync('/etc/codex');
178
+ },
179
+ },
180
+ 'command-code': {
181
+ name: 'command-code',
182
+ displayName: 'Command Code',
183
+ skillsDir: '.commandcode/skills',
184
+ globalSkillsDir: join(home, '.commandcode/skills'),
185
+ detectInstalled: async () => {
186
+ return existsSync(join(home, '.commandcode'));
187
+ },
188
+ },
189
+ continue: {
190
+ name: 'continue',
191
+ displayName: 'Continue',
192
+ skillsDir: '.continue/skills',
193
+ globalSkillsDir: join(home, '.continue/skills'),
194
+ detectInstalled: async () => {
195
+ return existsSync(join(process.cwd(), '.continue')) || existsSync(join(home, '.continue'));
196
+ },
197
+ },
198
+ cortex: {
199
+ name: 'cortex',
200
+ displayName: 'Cortex Code',
201
+ skillsDir: '.cortex/skills',
202
+ globalSkillsDir: join(home, '.snowflake/cortex/skills'),
203
+ detectInstalled: async () => {
204
+ return existsSync(join(home, '.snowflake/cortex'));
205
+ },
206
+ },
207
+ crush: {
208
+ name: 'crush',
209
+ displayName: 'Crush',
210
+ skillsDir: '.crush/skills',
211
+ globalSkillsDir: join(home, '.config/crush/skills'),
212
+ detectInstalled: async () => {
213
+ return existsSync(join(home, '.config/crush'));
214
+ },
215
+ },
216
+ cursor: {
217
+ name: 'cursor',
218
+ displayName: 'Cursor',
219
+ skillsDir: '.agents/skills',
220
+ globalSkillsDir: join(home, '.cursor/skills'),
221
+ detectInstalled: async () => {
222
+ return existsSync(join(home, '.cursor'));
223
+ },
224
+ },
225
+ deepagents: {
226
+ name: 'deepagents',
227
+ displayName: 'Deep Agents',
228
+ skillsDir: '.agents/skills',
229
+ globalSkillsDir: join(home, '.deepagents/agent/skills'),
230
+ detectInstalled: async () => {
231
+ return existsSync(join(home, '.deepagents'));
232
+ },
233
+ },
234
+ devin: {
235
+ name: 'devin',
236
+ displayName: 'Devin for Terminal',
237
+ skillsDir: '.devin/skills',
238
+ globalSkillsDir: join(configHome, 'devin/skills'),
239
+ detectInstalled: async () => {
240
+ return existsSync(join(configHome, 'devin'));
241
+ },
242
+ },
243
+ dexto: {
244
+ name: 'dexto',
245
+ displayName: 'Dexto',
246
+ skillsDir: '.agents/skills',
247
+ globalSkillsDir: join(home, '.agents/skills'),
248
+ showInUniversalPrompt: false,
249
+ detectInstalled: async () => {
250
+ return existsSync(join(home, '.dexto'));
251
+ },
252
+ },
253
+ droid: {
254
+ name: 'droid',
255
+ displayName: 'Droid',
256
+ skillsDir: '.factory/skills',
257
+ globalSkillsDir: join(home, '.factory/skills'),
258
+ detectInstalled: async () => {
259
+ return existsSync(join(home, '.factory'));
260
+ },
261
+ },
262
+ firebender: {
263
+ name: 'firebender',
264
+ displayName: 'Firebender',
265
+ skillsDir: '.agents/skills',
266
+ globalSkillsDir: join(home, '.firebender/skills'),
267
+ showInUniversalPrompt: false,
268
+ detectInstalled: async () => {
269
+ return existsSync(join(home, '.firebender'));
270
+ },
271
+ },
272
+ forgecode: {
273
+ name: 'forgecode',
274
+ displayName: 'ForgeCode',
275
+ skillsDir: '.forge/skills',
276
+ globalSkillsDir: join(home, '.forge/skills'),
277
+ detectInstalled: async () => {
278
+ return existsSync(join(home, '.forge'));
279
+ },
280
+ },
281
+ 'gemini-cli': {
282
+ name: 'gemini-cli',
283
+ displayName: 'Gemini CLI',
284
+ skillsDir: '.agents/skills',
285
+ globalSkillsDir: join(home, '.gemini/skills'),
286
+ detectInstalled: async () => {
287
+ return existsSync(join(home, '.gemini'));
288
+ },
289
+ },
290
+ 'github-copilot': {
291
+ name: 'github-copilot',
292
+ displayName: 'GitHub Copilot',
293
+ skillsDir: '.agents/skills',
294
+ globalSkillsDir: join(home, '.copilot/skills'),
295
+ detectInstalled: async () => {
296
+ return existsSync(join(home, '.copilot'));
297
+ },
298
+ },
299
+ goose: {
300
+ name: 'goose',
301
+ displayName: 'Goose',
302
+ skillsDir: '.goose/skills',
303
+ globalSkillsDir: join(configHome, 'goose/skills'),
304
+ detectInstalled: async () => {
305
+ return existsSync(join(configHome, 'goose'));
306
+ },
307
+ },
308
+ 'hermes-agent': {
309
+ name: 'hermes-agent',
310
+ displayName: 'Hermes Agent',
311
+ skillsDir: '.hermes/skills',
312
+ globalSkillsDir: join(hermesHome, 'skills'),
313
+ detectInstalled: async () => {
314
+ return existsSync(hermesHome);
315
+ },
316
+ },
317
+ 'inference-sh': {
318
+ name: 'inference-sh',
319
+ displayName: 'inference.sh',
320
+ skillsDir: '.inferencesh/skills',
321
+ globalSkillsDir: join(home, '.inferencesh/skills'),
322
+ detectInstalled: async () => {
323
+ return existsSync(join(home, '.inferencesh'));
324
+ },
325
+ },
326
+ jazz: {
327
+ name: 'jazz',
328
+ displayName: 'Jazz',
329
+ skillsDir: '.jazz/skills',
330
+ globalSkillsDir: join(home, '.jazz/skills'),
331
+ detectInstalled: async () => {
332
+ return existsSync(join(home, '.jazz')) || existsSync(join(process.cwd(), '.jazz'));
333
+ },
334
+ },
335
+ junie: {
336
+ name: 'junie',
337
+ displayName: 'Junie',
338
+ skillsDir: '.junie/skills',
339
+ globalSkillsDir: join(home, '.junie/skills'),
340
+ detectInstalled: async () => {
341
+ return existsSync(join(home, '.junie'));
342
+ },
343
+ },
344
+ 'iflow-cli': {
345
+ name: 'iflow-cli',
346
+ displayName: 'iFlow CLI',
347
+ skillsDir: '.iflow/skills',
348
+ globalSkillsDir: join(home, '.iflow/skills'),
349
+ detectInstalled: async () => {
350
+ return existsSync(join(home, '.iflow'));
351
+ },
352
+ },
353
+ kilo: {
354
+ name: 'kilo',
355
+ displayName: 'Kilo Code',
356
+ skillsDir: '.kilocode/skills',
357
+ globalSkillsDir: join(home, '.kilocode/skills'),
358
+ detectInstalled: async () => {
359
+ return existsSync(join(home, '.kilocode'));
360
+ },
361
+ },
362
+ 'kimi-code-cli': {
363
+ name: 'kimi-code-cli',
364
+ displayName: 'Kimi Code CLI',
365
+ skillsDir: '.agents/skills',
366
+ globalSkillsDir: join(home, '.agents/skills'),
367
+ detectInstalled: async () => {
368
+ return existsSync(join(home, '.kimi-code')) || existsSync(join(home, '.kimi'));
369
+ },
370
+ },
371
+ 'kiro-cli': {
372
+ name: 'kiro-cli',
373
+ displayName: 'Kiro CLI',
374
+ skillsDir: '.kiro/skills',
375
+ globalSkillsDir: join(home, '.kiro/skills'),
376
+ detectInstalled: async () => {
377
+ return existsSync(join(home, '.kiro'));
378
+ },
379
+ },
380
+ kode: {
381
+ name: 'kode',
382
+ displayName: 'Kode',
383
+ skillsDir: '.kode/skills',
384
+ globalSkillsDir: join(home, '.kode/skills'),
385
+ detectInstalled: async () => {
386
+ return existsSync(join(home, '.kode'));
387
+ },
388
+ },
389
+ lingma: {
390
+ name: 'lingma',
391
+ displayName: 'Lingma',
392
+ skillsDir: '.lingma/skills',
393
+ globalSkillsDir: join(home, '.lingma/skills'),
394
+ detectInstalled: async () => {
395
+ return existsSync(join(home, '.lingma'));
396
+ },
397
+ },
398
+ loaf: {
399
+ name: 'loaf',
400
+ displayName: 'Loaf',
401
+ skillsDir: '.agents/skills',
402
+ globalSkillsDir: join(home, '.agents/skills'),
403
+ showInUniversalPrompt: false,
404
+ detectInstalled: async () => {
405
+ return existsSync(join(home, '.loaf'));
406
+ },
407
+ },
408
+ mcpjam: {
409
+ name: 'mcpjam',
410
+ displayName: 'MCPJam',
411
+ skillsDir: '.mcpjam/skills',
412
+ globalSkillsDir: join(home, '.mcpjam/skills'),
413
+ detectInstalled: async () => {
414
+ return existsSync(join(home, '.mcpjam'));
415
+ },
416
+ },
417
+ 'mistral-vibe': {
418
+ name: 'mistral-vibe',
419
+ displayName: 'Mistral Vibe',
420
+ skillsDir: '.vibe/skills',
421
+ globalSkillsDir: join(vibeHome, 'skills'),
422
+ detectInstalled: async () => {
423
+ return existsSync(vibeHome);
424
+ },
425
+ },
426
+ moxby: {
427
+ name: 'moxby',
428
+ displayName: 'Moxby',
429
+ skillsDir: '.moxby/skills',
430
+ globalSkillsDir: join(home, '.moxby/skills'),
431
+ detectInstalled: async () => {
432
+ return existsSync(join(home, '.moxby'));
433
+ },
434
+ },
435
+ mux: {
436
+ name: 'mux',
437
+ displayName: 'Mux',
438
+ skillsDir: '.mux/skills',
439
+ globalSkillsDir: join(home, '.mux/skills'),
440
+ detectInstalled: async () => {
441
+ return existsSync(join(home, '.mux'));
442
+ },
443
+ },
444
+ opencode: {
445
+ name: 'opencode',
446
+ displayName: 'OpenCode',
447
+ skillsDir: '.agents/skills',
448
+ globalSkillsDir: join(configHome, 'opencode/skills'),
449
+ detectInstalled: async () => {
450
+ return existsSync(join(configHome, 'opencode'));
451
+ },
452
+ },
453
+ openhands: {
454
+ name: 'openhands',
455
+ displayName: 'OpenHands',
456
+ skillsDir: '.openhands/skills',
457
+ globalSkillsDir: join(home, '.openhands/skills'),
458
+ detectInstalled: async () => {
459
+ return existsSync(join(home, '.openhands'));
460
+ },
461
+ },
462
+ ona: {
463
+ name: 'ona',
464
+ displayName: 'Ona',
465
+ skillsDir: '.ona/skills',
466
+ globalSkillsDir: join(home, '.ona/skills'),
467
+ detectInstalled: async () => {
468
+ return existsSync(join(home, '.ona'));
469
+ },
470
+ },
471
+ pi: {
472
+ name: 'pi',
473
+ displayName: 'Pi',
474
+ skillsDir: '.pi/skills',
475
+ globalSkillsDir: join(home, '.pi/agent/skills'),
476
+ detectInstalled: async () => {
477
+ return existsSync(join(home, '.pi/agent'));
478
+ },
479
+ },
480
+ qoder: {
481
+ name: 'qoder',
482
+ displayName: 'Qoder',
483
+ skillsDir: '.qoder/skills',
484
+ globalSkillsDir: join(home, '.qoder/skills'),
485
+ detectInstalled: async () => {
486
+ return existsSync(join(home, '.qoder'));
487
+ },
488
+ },
489
+ 'qoder-cn': {
490
+ name: 'qoder-cn',
491
+ displayName: 'Qoder CN',
492
+ skillsDir: '.qoder/skills',
493
+ globalSkillsDir: join(home, '.qoder-cn/skills'),
494
+ detectInstalled: async () => {
495
+ return existsSync(join(home, '.qoder-cn'));
496
+ },
497
+ },
498
+ 'qwen-code': {
499
+ name: 'qwen-code',
500
+ displayName: 'Qwen Code',
501
+ skillsDir: '.qwen/skills',
502
+ globalSkillsDir: join(home, '.qwen/skills'),
503
+ detectInstalled: async () => {
504
+ return existsSync(join(home, '.qwen'));
505
+ },
506
+ },
507
+ replit: {
508
+ name: 'replit',
509
+ displayName: 'Replit',
510
+ skillsDir: '.agents/skills',
511
+ globalSkillsDir: join(configHome, 'agents/skills'),
512
+ showInUniversalList: false,
513
+ detectInstalled: async () => {
514
+ return existsSync(join(process.cwd(), '.replit'));
515
+ },
516
+ },
517
+ reasonix: {
518
+ name: 'reasonix',
519
+ displayName: 'Reasonix',
520
+ skillsDir: '.reasonix/skills',
521
+ globalSkillsDir: join(home, '.reasonix/skills'),
522
+ detectInstalled: async () => {
523
+ return existsSync(join(home, '.reasonix'));
524
+ },
525
+ },
526
+ rovodev: {
527
+ name: 'rovodev',
528
+ displayName: 'Rovo Dev',
529
+ skillsDir: '.rovodev/skills',
530
+ globalSkillsDir: join(home, '.rovodev/skills'),
531
+ detectInstalled: async () => {
532
+ return existsSync(join(home, '.rovodev'));
533
+ },
534
+ },
535
+ roo: {
536
+ name: 'roo',
537
+ displayName: 'Roo Code',
538
+ skillsDir: '.roo/skills',
539
+ globalSkillsDir: join(home, '.roo/skills'),
540
+ detectInstalled: async () => {
541
+ return existsSync(join(home, '.roo'));
542
+ },
543
+ },
544
+ 'tabnine-cli': {
545
+ name: 'tabnine-cli',
546
+ displayName: 'Tabnine CLI',
547
+ skillsDir: '.tabnine/agent/skills',
548
+ globalSkillsDir: join(home, '.tabnine/agent/skills'),
549
+ detectInstalled: async () => {
550
+ return existsSync(join(home, '.tabnine'));
551
+ },
552
+ },
553
+ terramind: {
554
+ name: 'terramind',
555
+ displayName: 'Terramind',
556
+ skillsDir: '.terramind/skills',
557
+ globalSkillsDir: join(home, '.terramind/skills'),
558
+ detectInstalled: async () => {
559
+ return existsSync(join(home, '.terramind'));
560
+ },
561
+ },
562
+ tinycloud: {
563
+ name: 'tinycloud',
564
+ displayName: 'Tinycloud',
565
+ skillsDir: '.tinycloud/skills',
566
+ globalSkillsDir: join(home, '.tinycloud/skills'),
567
+ detectInstalled: async () => {
568
+ return existsSync(join(home, '.tinycloud'));
569
+ },
570
+ },
571
+ trae: {
572
+ name: 'trae',
573
+ displayName: 'Trae',
574
+ skillsDir: '.trae/skills',
575
+ globalSkillsDir: join(home, '.trae/skills'),
576
+ detectInstalled: async () => {
577
+ return existsSync(join(home, '.trae'));
578
+ },
579
+ },
580
+ 'trae-cn': {
581
+ name: 'trae-cn',
582
+ displayName: 'Trae CN',
583
+ skillsDir: '.trae/skills',
584
+ globalSkillsDir: join(home, '.trae-cn/skills'),
585
+ detectInstalled: async () => {
586
+ return existsSync(join(home, '.trae-cn'));
587
+ },
588
+ },
589
+ warp: {
590
+ name: 'warp',
591
+ displayName: 'Warp',
592
+ skillsDir: '.agents/skills',
593
+ globalSkillsDir: join(home, '.agents/skills'),
594
+ detectInstalled: async () => {
595
+ return existsSync(join(home, '.warp'));
596
+ },
597
+ },
598
+ windsurf: {
599
+ name: 'windsurf',
600
+ displayName: 'Windsurf',
601
+ skillsDir: '.windsurf/skills',
602
+ globalSkillsDir: join(home, '.codeium/windsurf/skills'),
603
+ detectInstalled: async () => {
604
+ return existsSync(join(home, '.codeium/windsurf'));
605
+ },
606
+ },
607
+ zed: {
608
+ name: 'zed',
609
+ displayName: 'Zed',
610
+ skillsDir: '.agents/skills',
611
+ globalSkillsDir: join(home, '.agents/skills'),
612
+ detectInstalled: async () => {
613
+ // Per Zed's config_dir() in crates/paths/src/paths.rs.
614
+ return (existsSync(join(configHome, 'zed')) ||
615
+ (!!zedAppDataHome && existsSync(join(zedAppDataHome, 'Zed'))) ||
616
+ (!!zedFlatpakConfigHome && existsSync(join(zedFlatpakConfigHome, 'zed'))));
617
+ },
618
+ },
619
+ zencoder: {
620
+ name: 'zencoder',
621
+ displayName: 'Zencoder',
622
+ skillsDir: '.zencoder/skills',
623
+ globalSkillsDir: join(home, '.zencoder/skills'),
624
+ detectInstalled: async () => {
625
+ return existsSync(join(home, '.zencoder'));
626
+ },
627
+ },
628
+ zenflow: {
629
+ name: 'zenflow',
630
+ displayName: 'Zenflow',
631
+ skillsDir: '.zencoder/skills',
632
+ globalSkillsDir: join(home, '.zencoder/skills'),
633
+ detectInstalled: async () => {
634
+ return existsSync(join(home, '.zencoder'));
635
+ },
636
+ },
637
+ neovate: {
638
+ name: 'neovate',
639
+ displayName: 'Neovate',
640
+ skillsDir: '.neovate/skills',
641
+ globalSkillsDir: join(home, '.neovate/skills'),
642
+ detectInstalled: async () => {
643
+ return existsSync(join(home, '.neovate'));
644
+ },
645
+ },
646
+ pochi: {
647
+ name: 'pochi',
648
+ displayName: 'Pochi',
649
+ skillsDir: '.pochi/skills',
650
+ globalSkillsDir: join(home, '.pochi/skills'),
651
+ detectInstalled: async () => {
652
+ return existsSync(join(home, '.pochi'));
653
+ },
654
+ },
655
+ promptscript: {
656
+ name: 'promptscript',
657
+ displayName: 'PromptScript',
658
+ skillsDir: '.agents/skills',
659
+ globalSkillsDir: undefined,
660
+ showInUniversalPrompt: false,
661
+ detectInstalled: async () => {
662
+ return (existsSync(join(process.cwd(), '.promptscript')) ||
663
+ existsSync(join(process.cwd(), 'promptscript.yaml')));
664
+ },
665
+ },
666
+ adal: {
667
+ name: 'adal',
668
+ displayName: 'AdaL',
669
+ skillsDir: '.adal/skills',
670
+ globalSkillsDir: join(home, '.adal/skills'),
671
+ detectInstalled: async () => {
672
+ return existsSync(join(home, '.adal'));
673
+ },
674
+ },
675
+ universal: {
676
+ name: 'universal',
677
+ displayName: 'Universal',
678
+ skillsDir: '.agents/skills',
679
+ globalSkillsDir: join(agentsHome, 'skills'), // ADG patch: was join(configHome, 'agents/skills')
680
+ showInUniversalList: false,
681
+ detectInstalled: async () => false,
682
+ },
683
+ };
684
+ export async function detectInstalledAgents() {
685
+ const results = await Promise.all(Object.entries(agents).map(async ([type, config]) => ({
686
+ type: type,
687
+ installed: await config.detectInstalled(),
688
+ })));
689
+ return results.filter((r) => r.installed).map((r) => r.type);
690
+ }
691
+ export function getAgentConfig(type) {
692
+ return agents[type];
693
+ }
694
+ /**
695
+ * Returns agents that use the universal .agents/skills directory.
696
+ * These agents share a common skill location and don't need symlinks.
697
+ * Agents with showInUniversalList: false are excluded.
698
+ */
699
+ export function getUniversalAgents() {
700
+ return Object.entries(agents)
701
+ .filter(([_, config]) => config.skillsDir === '.agents/skills' && config.showInUniversalList !== false)
702
+ .map(([type]) => type);
703
+ }
704
+ /**
705
+ * Returns the subset of universal agents shown in the interactive locked section.
706
+ * All universal agents are still installed; this only keeps the prompt readable.
707
+ */
708
+ export function getVisibleUniversalAgents() {
709
+ return Object.entries(agents)
710
+ .filter(([_, config]) => config.skillsDir === '.agents/skills' &&
711
+ config.showInUniversalList !== false &&
712
+ config.showInUniversalPrompt !== false)
713
+ .map(([type]) => type);
714
+ }
715
+ /**
716
+ * Returns agents that use agent-specific skill directories (not universal).
717
+ * These agents need symlinks from the canonical .agents/skills location.
718
+ */
719
+ export function getNonUniversalAgents() {
720
+ return Object.entries(agents)
721
+ .filter(([_, config]) => config.skillsDir !== '.agents/skills')
722
+ .map(([type]) => type);
723
+ }
724
+ /**
725
+ * Check if an agent uses the universal .agents/skills directory.
726
+ */
727
+ export function isUniversalAgent(type) {
728
+ return agents[type].skillsDir === '.agents/skills';
729
+ }