bfi-cli 0.1.29 → 0.1.36

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