allagents 0.22.2 → 0.23.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.
Files changed (3) hide show
  1. package/README.md +36 -9
  2. package/dist/index.js +356 -85
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -11,7 +11,7 @@ CLI tool for managing multi-repo AI agent workspaces with plugin synchronization
11
11
  | Feature | Claude Code Plugins | AllAgents |
12
12
  |---------|--------------------|-----------|
13
13
  | Scope | Single project | Multi-repo workspace |
14
- | Client support | Claude only | 8 AI clients |
14
+ | Client support | Claude only | 23 AI clients |
15
15
  | File location | Runtime lookup from cache | Copied to workspace (git-versioned) |
16
16
  | Project structure | AI config mixed with code | Separate workspace repo |
17
17
 
@@ -298,18 +298,42 @@ These marketplace names auto-resolve to their GitHub repos:
298
298
 
299
299
  ### Supported Clients
300
300
 
301
+ AllAgents supports 23 AI coding assistants:
302
+
303
+ #### Universal Clients (share `.agents/skills/`)
304
+
305
+ | Client | Skills | Agent File | Hooks | Commands | GitHub Overrides |
306
+ |--------|--------|------------|-------|----------|------------------|
307
+ | copilot | `.agents/skills/` | `AGENTS.md` | No | No | `.github/` |
308
+ | codex | `.agents/skills/` | `AGENTS.md` | No | No | No |
309
+ | opencode | `.agents/skills/` | `AGENTS.md` | No | `.opencode/commands/` | No |
310
+ | gemini | `.agents/skills/` | `GEMINI.md` | No | No | No |
311
+ | ampcode | `.agents/skills/` | `AGENTS.md` | No | No | No |
312
+ | vscode | `.agents/skills/` | `AGENTS.md` | No | No | `.github/` |
313
+ | replit | `.agents/skills/` | `AGENTS.md` | No | No | No |
314
+ | kimi | `.agents/skills/` | `AGENTS.md` | No | No | No |
315
+
316
+ #### Provider-Specific Clients
317
+
301
318
  | Client | Skills | Agent File | Hooks | Commands |
302
319
  |--------|--------|------------|-------|----------|
303
320
  | claude | `.claude/skills/` | `CLAUDE.md` | `.claude/hooks/` | `.claude/commands/` |
304
- | copilot | `.agents/skills/` | `AGENTS.md` | No | No |
305
- | codex | `.agents/skills/` | `AGENTS.md` | No | No |
306
321
  | cursor | `.cursor/skills/` | `AGENTS.md` | No | No |
307
- | opencode | `.agents/skills/` | `AGENTS.md` | No | No |
308
- | gemini | `.agents/skills/` | `GEMINI.md` | No | No |
309
322
  | factory | `.factory/skills/` | `AGENTS.md` | `.factory/hooks/` | No |
310
- | ampcode | `.agents/skills/` | `AGENTS.md` | No | No |
311
-
312
- > **Note:** Clients supporting the universal `.agents/` folder (copilot, codex, opencode, gemini, ampcode) share the same skills directory. Commands are a Claude-specific feature.
323
+ | openclaw | `skills/` | `AGENTS.md` | No | No |
324
+ | windsurf | `.windsurf/skills/` | `AGENTS.md` | No | No |
325
+ | cline | `.cline/skills/` | `AGENTS.md` | No | No |
326
+ | continue | `.continue/skills/` | `AGENTS.md` | No | No |
327
+ | roo | `.roo/skills/` | `AGENTS.md` | No | No |
328
+ | kilo | `.kilocode/skills/` | `AGENTS.md` | No | No |
329
+ | trae | `.trae/skills/` | `AGENTS.md` | No | No |
330
+ | augment | `.augment/skills/` | `AGENTS.md` | No | No |
331
+ | zencoder | `.zencoder/skills/` | `AGENTS.md` | No | No |
332
+ | junie | `.junie/skills/` | `AGENTS.md` | No | No |
333
+ | openhands | `.openhands/skills/` | `AGENTS.md` | No | No |
334
+ | kiro | `.kiro/skills/` | `AGENTS.md` | No | No |
335
+
336
+ > **Note:** Universal clients share the same `.agents/skills/` directory. GitHub overrides (`.github/prompts/`, `copilot-instructions.md`) are copied to Copilot/VSCode's `.github/` folder.
313
337
 
314
338
  ## Marketplace Structure
315
339
 
@@ -337,9 +361,12 @@ my-plugin/
337
361
  ├── skills/ # Skill directories with SKILL.md (all clients)
338
362
  │ └── debugging/
339
363
  │ └── SKILL.md
340
- ├── commands/ # Command files (.md) - Claude only
364
+ ├── commands/ # Command files (.md) - Claude, OpenCode
341
365
  │ ├── build.md
342
366
  │ └── deploy.md
367
+ ├── .github/ # GitHub overrides (Copilot, VSCode)
368
+ │ └── prompts/
369
+ │ └── review.md
343
370
  ├── hooks/ # Hook files (Claude/Factory only)
344
371
  │ └── pre-commit.md
345
372
  └── AGENTS.md # Agent configuration (optional)
package/dist/index.js CHANGED
@@ -11483,7 +11483,21 @@ var init_workspace_config = __esm(() => {
11483
11483
  "gemini",
11484
11484
  "factory",
11485
11485
  "ampcode",
11486
- "vscode"
11486
+ "vscode",
11487
+ "openclaw",
11488
+ "windsurf",
11489
+ "cline",
11490
+ "continue",
11491
+ "roo",
11492
+ "kilo",
11493
+ "trae",
11494
+ "augment",
11495
+ "zencoder",
11496
+ "junie",
11497
+ "openhands",
11498
+ "kiro",
11499
+ "replit",
11500
+ "kimi"
11487
11501
  ]);
11488
11502
  VscodeConfigSchema = exports_external.object({
11489
11503
  output: exports_external.string().optional()
@@ -16000,7 +16014,8 @@ async function updatePlugin(pluginSpec, deps) {
16000
16014
  action: "skipped"
16001
16015
  };
16002
16016
  }
16003
- const marketplace = await deps.getMarketplace(parsed.marketplaceName);
16017
+ const sourceLocation = parsed.owner && parsed.repo ? `${parsed.owner}/${parsed.repo}` : undefined;
16018
+ const marketplace = await deps.getMarketplace(parsed.marketplaceName, sourceLocation);
16004
16019
  if (!marketplace) {
16005
16020
  return {
16006
16021
  plugin: pluginSpec,
@@ -16009,9 +16024,10 @@ async function updatePlugin(pluginSpec, deps) {
16009
16024
  error: `Marketplace not found: ${parsed.marketplaceName}`
16010
16025
  };
16011
16026
  }
16027
+ const marketplaceName = marketplace.name;
16012
16028
  const manifestResult = await deps.parseMarketplaceManifest(marketplace.path);
16013
16029
  if (!manifestResult.success || !manifestResult.data) {
16014
- const updateResults = await deps.updateMarketplace(parsed.marketplaceName);
16030
+ const updateResults = await deps.updateMarketplace(marketplaceName);
16015
16031
  const result = updateResults[0];
16016
16032
  return {
16017
16033
  plugin: pluginSpec,
@@ -16022,7 +16038,7 @@ async function updatePlugin(pluginSpec, deps) {
16022
16038
  }
16023
16039
  const pluginEntry = manifestResult.data.plugins.find((p) => p.name === parsed.plugin);
16024
16040
  if (!pluginEntry) {
16025
- const updateResults = await deps.updateMarketplace(parsed.marketplaceName);
16041
+ const updateResults = await deps.updateMarketplace(marketplaceName);
16026
16042
  const result = updateResults[0];
16027
16043
  return {
16028
16044
  plugin: pluginSpec,
@@ -16032,7 +16048,7 @@ async function updatePlugin(pluginSpec, deps) {
16032
16048
  };
16033
16049
  }
16034
16050
  if (typeof pluginEntry.source === "string") {
16035
- const updateResults = await deps.updateMarketplace(parsed.marketplaceName);
16051
+ const updateResults = await deps.updateMarketplace(marketplaceName);
16036
16052
  const result = updateResults[0];
16037
16053
  return {
16038
16054
  plugin: pluginSpec,
@@ -16043,7 +16059,7 @@ async function updatePlugin(pluginSpec, deps) {
16043
16059
  }
16044
16060
  const url = pluginEntry.source.url;
16045
16061
  if (marketplace.source.type === "github") {
16046
- await deps.updateMarketplace(parsed.marketplaceName);
16062
+ await deps.updateMarketplace(marketplaceName);
16047
16063
  }
16048
16064
  const fetchResult = await fetchFn(url);
16049
16065
  return {
@@ -21397,6 +21413,7 @@ var init_client_mapping = __esm(() => {
21397
21413
  agentFile: "AGENTS.md"
21398
21414
  },
21399
21415
  opencode: {
21416
+ commandsPath: ".opencode/commands/",
21400
21417
  skillsPath: ".agents/skills/",
21401
21418
  agentFile: "AGENTS.md"
21402
21419
  },
@@ -21418,6 +21435,62 @@ var init_client_mapping = __esm(() => {
21418
21435
  skillsPath: ".agents/skills/",
21419
21436
  agentFile: "AGENTS.md",
21420
21437
  githubPath: ".github/"
21438
+ },
21439
+ openclaw: {
21440
+ skillsPath: "skills/",
21441
+ agentFile: "AGENTS.md"
21442
+ },
21443
+ windsurf: {
21444
+ skillsPath: ".windsurf/skills/",
21445
+ agentFile: "AGENTS.md"
21446
+ },
21447
+ cline: {
21448
+ skillsPath: ".cline/skills/",
21449
+ agentFile: "AGENTS.md"
21450
+ },
21451
+ continue: {
21452
+ skillsPath: ".continue/skills/",
21453
+ agentFile: "AGENTS.md"
21454
+ },
21455
+ roo: {
21456
+ skillsPath: ".roo/skills/",
21457
+ agentFile: "AGENTS.md"
21458
+ },
21459
+ kilo: {
21460
+ skillsPath: ".kilocode/skills/",
21461
+ agentFile: "AGENTS.md"
21462
+ },
21463
+ trae: {
21464
+ skillsPath: ".trae/skills/",
21465
+ agentFile: "AGENTS.md"
21466
+ },
21467
+ augment: {
21468
+ skillsPath: ".augment/skills/",
21469
+ agentFile: "AGENTS.md"
21470
+ },
21471
+ zencoder: {
21472
+ skillsPath: ".zencoder/skills/",
21473
+ agentFile: "AGENTS.md"
21474
+ },
21475
+ junie: {
21476
+ skillsPath: ".junie/skills/",
21477
+ agentFile: "AGENTS.md"
21478
+ },
21479
+ openhands: {
21480
+ skillsPath: ".openhands/skills/",
21481
+ agentFile: "AGENTS.md"
21482
+ },
21483
+ kiro: {
21484
+ skillsPath: ".kiro/skills/",
21485
+ agentFile: "AGENTS.md"
21486
+ },
21487
+ replit: {
21488
+ skillsPath: ".agents/skills/",
21489
+ agentFile: "AGENTS.md"
21490
+ },
21491
+ kimi: {
21492
+ skillsPath: ".agents/skills/",
21493
+ agentFile: "AGENTS.md"
21421
21494
  }
21422
21495
  };
21423
21496
  USER_CLIENT_MAPPINGS = {
@@ -21443,6 +21516,7 @@ var init_client_mapping = __esm(() => {
21443
21516
  agentFile: "AGENTS.md"
21444
21517
  },
21445
21518
  opencode: {
21519
+ commandsPath: ".opencode/commands/",
21446
21520
  skillsPath: ".agents/skills/",
21447
21521
  agentFile: "AGENTS.md"
21448
21522
  },
@@ -21464,6 +21538,62 @@ var init_client_mapping = __esm(() => {
21464
21538
  skillsPath: ".agents/skills/",
21465
21539
  agentFile: "AGENTS.md",
21466
21540
  githubPath: ".copilot/"
21541
+ },
21542
+ openclaw: {
21543
+ skillsPath: "skills/",
21544
+ agentFile: "AGENTS.md"
21545
+ },
21546
+ windsurf: {
21547
+ skillsPath: ".codeium/windsurf/skills/",
21548
+ agentFile: "AGENTS.md"
21549
+ },
21550
+ cline: {
21551
+ skillsPath: ".cline/skills/",
21552
+ agentFile: "AGENTS.md"
21553
+ },
21554
+ continue: {
21555
+ skillsPath: ".continue/skills/",
21556
+ agentFile: "AGENTS.md"
21557
+ },
21558
+ roo: {
21559
+ skillsPath: ".roo/skills/",
21560
+ agentFile: "AGENTS.md"
21561
+ },
21562
+ kilo: {
21563
+ skillsPath: ".kilocode/skills/",
21564
+ agentFile: "AGENTS.md"
21565
+ },
21566
+ trae: {
21567
+ skillsPath: ".trae/skills/",
21568
+ agentFile: "AGENTS.md"
21569
+ },
21570
+ augment: {
21571
+ skillsPath: ".augment/skills/",
21572
+ agentFile: "AGENTS.md"
21573
+ },
21574
+ zencoder: {
21575
+ skillsPath: ".zencoder/skills/",
21576
+ agentFile: "AGENTS.md"
21577
+ },
21578
+ junie: {
21579
+ skillsPath: ".junie/skills/",
21580
+ agentFile: "AGENTS.md"
21581
+ },
21582
+ openhands: {
21583
+ skillsPath: ".openhands/skills/",
21584
+ agentFile: "AGENTS.md"
21585
+ },
21586
+ kiro: {
21587
+ skillsPath: ".kiro/skills/",
21588
+ agentFile: "AGENTS.md"
21589
+ },
21590
+ replit: {
21591
+ skillsPath: ".agents/skills/",
21592
+ agentFile: "AGENTS.md"
21593
+ },
21594
+ kimi: {
21595
+ skillsPath: ".agents/skills/",
21596
+ agentFile: "AGENTS.md"
21467
21597
  }
21468
21598
  };
21469
21599
  });
@@ -29472,7 +29602,7 @@ var package_default;
29472
29602
  var init_package = __esm(() => {
29473
29603
  package_default = {
29474
29604
  name: "allagents",
29475
- version: "0.22.2",
29605
+ version: "0.23.0",
29476
29606
  description: "CLI tool for managing multi-repo AI agent workspaces with plugin synchronization",
29477
29607
  type: "module",
29478
29608
  bin: {
@@ -31601,78 +31731,25 @@ var init_init2 = __esm(() => {
31601
31731
  ({ text, multiselect } = exports_dist);
31602
31732
  });
31603
31733
 
31604
- // src/cli/tui/actions/status.ts
31605
- async function runStatus(context, cache2) {
31606
- try {
31607
- let status = cache2?.getStatus();
31608
- if (!status) {
31609
- status = await getWorkspaceStatus(context.workspacePath ?? undefined);
31610
- cache2?.setStatus(status);
31611
- }
31612
- if (!status.success) {
31613
- kt2(status.error ?? "Unknown error", "Status Error");
31614
- return;
31615
- }
31616
- const lines = [];
31617
- if (context.hasWorkspace) {
31618
- lines.push(`Workspace: ${context.workspacePath}`);
31619
- } else {
31620
- lines.push("No workspace detected");
31621
- }
31622
- lines.push("");
31623
- const userPlugins = status.userPlugins ?? [];
31624
- const hasProjectPlugins = status.plugins.length > 0;
31625
- const hasUserPlugins = userPlugins.length > 0;
31626
- if (!hasProjectPlugins && !hasUserPlugins) {
31627
- lines.push("No plugins configured");
31628
- }
31629
- if (hasProjectPlugins) {
31630
- lines.push("Project plugins:");
31631
- for (const plugin of status.plugins) {
31632
- const icon = plugin.available ? "✓" : "✗";
31633
- lines.push(` ${icon} ${plugin.source} (${plugin.type})`);
31634
- }
31635
- }
31636
- if (hasUserPlugins) {
31637
- if (hasProjectPlugins)
31638
- lines.push("");
31639
- lines.push("User plugins:");
31640
- for (const plugin of userPlugins) {
31641
- const icon = plugin.available ? "✓" : "✗";
31642
- lines.push(` ${icon} ${plugin.source} (${plugin.type})`);
31734
+ // src/cli/tui/actions/plugins.ts
31735
+ function createUpdateDeps() {
31736
+ const updatedMarketplaces = new Set;
31737
+ return {
31738
+ parsePluginSpec,
31739
+ getMarketplace: (name, sourceLocation) => findMarketplace(name, sourceLocation),
31740
+ parseMarketplaceManifest,
31741
+ updateMarketplace: async (name) => {
31742
+ if (updatedMarketplaces.has(name)) {
31743
+ return [{ name, success: true }];
31643
31744
  }
31644
- }
31645
- lines.push("");
31646
- lines.push(`Clients: ${status.clients.length > 0 ? status.clients.join(", ") : "none"}`);
31647
- kt2(lines.join(`
31648
- `), "Status");
31649
- if (!context.hasWorkspace) {
31650
- const action = await select({
31651
- message: "Options",
31652
- options: [
31653
- { label: "Add workspace", value: "init" },
31654
- { label: "Back", value: "back" }
31655
- ]
31656
- });
31657
- if (!Ct(action) && action === "init") {
31658
- await runInit();
31659
- cache2?.invalidate();
31745
+ const result = await updateMarketplace(name);
31746
+ if (result[0]?.success) {
31747
+ updatedMarketplaces.add(name);
31660
31748
  }
31749
+ return result;
31661
31750
  }
31662
- } catch (error) {
31663
- const message = error instanceof Error ? error.message : String(error);
31664
- kt2(message, "Error");
31665
- }
31751
+ };
31666
31752
  }
31667
- var select;
31668
- var init_status3 = __esm(() => {
31669
- init_dist2();
31670
- init_status2();
31671
- init_init2();
31672
- ({ select } = exports_dist);
31673
- });
31674
-
31675
- // src/cli/tui/actions/plugins.ts
31676
31753
  async function getCachedMarketplaces(cache2) {
31677
31754
  const cached = cache2?.getMarketplaces();
31678
31755
  if (cached)
@@ -31690,7 +31767,7 @@ async function getCachedMarketplacePlugins(name, cache2) {
31690
31767
  return result;
31691
31768
  }
31692
31769
  async function installSelectedPlugin(pluginRef, context, cache2) {
31693
- const scopeChoice = await select2({
31770
+ const scopeChoice = await select({
31694
31771
  message: "Install scope",
31695
31772
  options: [
31696
31773
  { label: "Project (this workspace)", value: "project" },
@@ -31733,6 +31810,102 @@ async function installSelectedPlugin(pluginRef, context, cache2) {
31733
31810
  kt2(`Installed: ${pluginRef}`, "Success");
31734
31811
  return true;
31735
31812
  }
31813
+ async function runUpdatePlugin(pluginSource, scope, context, cache2) {
31814
+ const s = Ie();
31815
+ s.start("Updating plugin...");
31816
+ const result = await updatePlugin(pluginSource, createUpdateDeps());
31817
+ if (!result.success) {
31818
+ s.stop("Update failed");
31819
+ kt2(result.error ?? "Unknown error", "Error");
31820
+ return;
31821
+ }
31822
+ s.stop(result.action === "updated" ? "Plugin updated" : "Already up to date");
31823
+ if (result.action === "updated") {
31824
+ const syncS = Ie();
31825
+ syncS.start("Syncing...");
31826
+ if (scope === "project" && context.workspacePath) {
31827
+ await syncWorkspace(context.workspacePath);
31828
+ } else {
31829
+ await syncUserWorkspace();
31830
+ }
31831
+ syncS.stop("Sync complete");
31832
+ cache2?.invalidate();
31833
+ }
31834
+ const icon = result.action === "updated" ? "✓" : "-";
31835
+ kt2(`${icon} ${pluginSource} (${result.action})`, "Update");
31836
+ }
31837
+ async function runUpdateAllPlugins(context, cache2) {
31838
+ const s = Ie();
31839
+ s.start("Gathering plugins...");
31840
+ const pluginsToUpdate = [];
31841
+ if (context.workspacePath) {
31842
+ const projectPlugins = await getInstalledProjectPlugins(context.workspacePath);
31843
+ for (const plugin of projectPlugins) {
31844
+ pluginsToUpdate.push({ spec: plugin.spec, scope: "project" });
31845
+ }
31846
+ }
31847
+ const userPlugins = await getInstalledUserPlugins();
31848
+ for (const plugin of userPlugins) {
31849
+ if (!pluginsToUpdate.some((existing) => existing.spec === plugin.spec)) {
31850
+ pluginsToUpdate.push({ spec: plugin.spec, scope: "user" });
31851
+ }
31852
+ }
31853
+ if (pluginsToUpdate.length === 0) {
31854
+ s.stop("No plugins to update");
31855
+ return;
31856
+ }
31857
+ s.stop(`Found ${pluginsToUpdate.length} plugin(s)`);
31858
+ const deps = createUpdateDeps();
31859
+ const updateS = Ie();
31860
+ updateS.start("Updating plugins...");
31861
+ const results = [];
31862
+ let needsProjectSync = false;
31863
+ let needsUserSync = false;
31864
+ for (const { spec, scope } of pluginsToUpdate) {
31865
+ const result = await updatePlugin(spec, deps);
31866
+ const entry = {
31867
+ plugin: spec,
31868
+ action: result.action
31869
+ };
31870
+ if (result.error) {
31871
+ entry.error = result.error;
31872
+ }
31873
+ results.push(entry);
31874
+ if (result.action === "updated") {
31875
+ if (scope === "project")
31876
+ needsProjectSync = true;
31877
+ else
31878
+ needsUserSync = true;
31879
+ }
31880
+ }
31881
+ updateS.stop("Update complete");
31882
+ if (needsProjectSync && context.workspacePath) {
31883
+ const syncS = Ie();
31884
+ syncS.start("Syncing project...");
31885
+ await syncWorkspace(context.workspacePath);
31886
+ syncS.stop("Project sync complete");
31887
+ }
31888
+ if (needsUserSync) {
31889
+ const syncS = Ie();
31890
+ syncS.start("Syncing user...");
31891
+ await syncUserWorkspace();
31892
+ syncS.stop("User sync complete");
31893
+ }
31894
+ if (needsProjectSync || needsUserSync) {
31895
+ cache2?.invalidate();
31896
+ }
31897
+ const updated = results.filter((r) => r.action === "updated").length;
31898
+ const skipped = results.filter((r) => r.action === "skipped").length;
31899
+ const failed = results.filter((r) => r.action === "failed").length;
31900
+ const lines = results.map((r) => {
31901
+ const icon = r.action === "updated" ? "✓" : r.action === "skipped" ? "-" : "✗";
31902
+ return `${icon} ${r.plugin} (${r.action})${r.error ? ` - ${r.error}` : ""}`;
31903
+ });
31904
+ lines.push("");
31905
+ lines.push(`Updated: ${updated} Skipped: ${skipped} Failed: ${failed}`);
31906
+ kt2(lines.join(`
31907
+ `), "Update Results");
31908
+ }
31736
31909
  async function runPlugins(context, cache2) {
31737
31910
  try {
31738
31911
  while (true) {
@@ -31744,6 +31917,10 @@ async function runPlugins(context, cache2) {
31744
31917
  status = await getWorkspaceStatus(context.workspacePath ?? undefined);
31745
31918
  cache2?.setStatus(status);
31746
31919
  }
31920
+ const hasPlugins = status.success && ((status.plugins?.length ?? 0) > 0 || (status.userPlugins?.length ?? 0) > 0);
31921
+ if (hasPlugins) {
31922
+ options2.push({ label: "Update all", value: "__update_all__" });
31923
+ }
31747
31924
  if (status.success) {
31748
31925
  for (const plugin of status.plugins) {
31749
31926
  const key = `project:${plugin.source}`;
@@ -31761,7 +31938,7 @@ async function runPlugins(context, cache2) {
31761
31938
  }
31762
31939
  }
31763
31940
  options2.push({ label: "Back", value: "__back__" });
31764
- const selected = await select2({
31941
+ const selected = await select({
31765
31942
  message: "Plugins",
31766
31943
  options: options2
31767
31944
  });
@@ -31772,6 +31949,10 @@ async function runPlugins(context, cache2) {
31772
31949
  await runInstallPlugin(context, cache2);
31773
31950
  continue;
31774
31951
  }
31952
+ if (selected === "__update_all__") {
31953
+ await runUpdateAllPlugins(context, cache2);
31954
+ continue;
31955
+ }
31775
31956
  await runPluginDetail(selected, context, cache2);
31776
31957
  }
31777
31958
  } catch (error) {
@@ -31783,10 +31964,11 @@ async function runPluginDetail(pluginKey, context, cache2) {
31783
31964
  const scope = pluginKey.startsWith("project:") ? "project" : "user";
31784
31965
  const pluginSource = pluginKey.replace(/^(project|user):/, "");
31785
31966
  while (true) {
31786
- const action = await select2({
31967
+ const action = await select({
31787
31968
  message: `Plugin: ${pluginSource} [${scope}]`,
31788
31969
  options: [
31789
31970
  { label: "Browse skills", value: "browse" },
31971
+ { label: "Update", value: "update" },
31790
31972
  { label: "Remove", value: "remove" },
31791
31973
  { label: "Back", value: "back" }
31792
31974
  ]
@@ -31798,6 +31980,10 @@ async function runPluginDetail(pluginKey, context, cache2) {
31798
31980
  await runBrowsePluginSkills(pluginSource, scope, context, cache2);
31799
31981
  continue;
31800
31982
  }
31983
+ if (action === "update") {
31984
+ await runUpdatePlugin(pluginSource, scope, context, cache2);
31985
+ continue;
31986
+ }
31801
31987
  if (action === "remove") {
31802
31988
  const confirmed = await confirm({
31803
31989
  message: `Remove plugin "${pluginSource}"?`
@@ -31934,7 +32120,7 @@ Use "Manage marketplaces" to add one first.`, "Marketplace");
31934
32120
  return;
31935
32121
  }
31936
32122
  allPlugins.push({ label: "Back", value: "__back__" });
31937
- const selected = await select2({
32123
+ const selected = await select({
31938
32124
  message: "Select a plugin to install",
31939
32125
  options: allPlugins
31940
32126
  });
@@ -31959,7 +32145,7 @@ async function runBrowseMarketplaces(context, cache2) {
31959
32145
  })),
31960
32146
  { label: "Back", value: "__back__" }
31961
32147
  ];
31962
- const selected = await select2({
32148
+ const selected = await select({
31963
32149
  message: "Marketplaces",
31964
32150
  options: options2
31965
32151
  });
@@ -31994,7 +32180,7 @@ async function runBrowseMarketplaces(context, cache2) {
31994
32180
  }
31995
32181
  async function runMarketplaceDetail(marketplaceName, context, cache2) {
31996
32182
  while (true) {
31997
- const action = await select2({
32183
+ const action = await select({
31998
32184
  message: `Marketplace: ${marketplaceName}`,
31999
32185
  options: [
32000
32186
  { label: "Browse plugins", value: "browse" },
@@ -32018,7 +32204,7 @@ async function runMarketplaceDetail(marketplaceName, context, cache2) {
32018
32204
  return { label, value: plugin.name };
32019
32205
  });
32020
32206
  pluginOptions.push({ label: "Back", value: "__back__" });
32021
- const selectedPlugin = await select2({
32207
+ const selectedPlugin = await select({
32022
32208
  message: "Select a plugin to install",
32023
32209
  options: pluginOptions
32024
32210
  });
@@ -32074,17 +32260,102 @@ async function runMarketplaceDetail(marketplaceName, context, cache2) {
32074
32260
  }
32075
32261
  }
32076
32262
  }
32077
- var select2, text2, confirm, multiselect2;
32263
+ var select, text2, confirm, multiselect2;
32078
32264
  var init_plugins = __esm(() => {
32079
32265
  init_dist2();
32080
32266
  init_workspace_modify();
32081
32267
  init_user_workspace();
32082
32268
  init_sync();
32083
32269
  init_marketplace();
32270
+ init_plugin();
32271
+ init_marketplace_manifest_parser();
32084
32272
  init_status2();
32085
32273
  init_skills();
32086
32274
  init_constants();
32087
- ({ select: select2, text: text2, confirm, multiselect: multiselect2 } = exports_dist);
32275
+ ({ select, text: text2, confirm, multiselect: multiselect2 } = exports_dist);
32276
+ });
32277
+
32278
+ // src/cli/tui/actions/status.ts
32279
+ async function runStatus(context, cache2) {
32280
+ try {
32281
+ let status = cache2?.getStatus();
32282
+ if (!status) {
32283
+ status = await getWorkspaceStatus(context.workspacePath ?? undefined);
32284
+ cache2?.setStatus(status);
32285
+ }
32286
+ if (!status.success) {
32287
+ kt2(status.error ?? "Unknown error", "Status Error");
32288
+ return;
32289
+ }
32290
+ const lines = [];
32291
+ if (context.hasWorkspace) {
32292
+ lines.push(`Workspace: ${context.workspacePath}`);
32293
+ } else {
32294
+ lines.push("No workspace detected");
32295
+ }
32296
+ lines.push("");
32297
+ const userPlugins = status.userPlugins ?? [];
32298
+ const hasProjectPlugins = status.plugins.length > 0;
32299
+ const hasUserPlugins = userPlugins.length > 0;
32300
+ if (!hasProjectPlugins && !hasUserPlugins) {
32301
+ lines.push("No plugins configured");
32302
+ }
32303
+ if (hasProjectPlugins) {
32304
+ lines.push("Project plugins:");
32305
+ for (const plugin of status.plugins) {
32306
+ const icon = plugin.available ? "✓" : "✗";
32307
+ lines.push(` ${icon} ${plugin.source} (${plugin.type})`);
32308
+ }
32309
+ }
32310
+ if (hasUserPlugins) {
32311
+ if (hasProjectPlugins)
32312
+ lines.push("");
32313
+ lines.push("User plugins:");
32314
+ for (const plugin of userPlugins) {
32315
+ const icon = plugin.available ? "✓" : "✗";
32316
+ lines.push(` ${icon} ${plugin.source} (${plugin.type})`);
32317
+ }
32318
+ }
32319
+ lines.push("");
32320
+ lines.push(`Clients: ${status.clients.length > 0 ? status.clients.join(", ") : "none"}`);
32321
+ kt2(lines.join(`
32322
+ `), "Status");
32323
+ const hasPlugins = context.projectPluginCount > 0 || context.userPluginCount > 0;
32324
+ const options2 = [];
32325
+ if (hasPlugins) {
32326
+ options2.push({ label: "Update all", value: "update_all" });
32327
+ }
32328
+ if (context.hasWorkspace) {
32329
+ options2.push({ label: "Add workspace", value: "init", hint: "in subdirectory" });
32330
+ } else {
32331
+ options2.push({ label: "Add workspace", value: "init" });
32332
+ }
32333
+ options2.push({ label: "Back", value: "back" });
32334
+ const action = await select2({
32335
+ message: "Options",
32336
+ options: options2
32337
+ });
32338
+ if (Ct(action) || action === "back") {
32339
+ return;
32340
+ }
32341
+ if (action === "update_all") {
32342
+ await runUpdateAllPlugins(context, cache2);
32343
+ } else if (action === "init") {
32344
+ await runInit();
32345
+ cache2?.invalidate();
32346
+ }
32347
+ } catch (error) {
32348
+ const message = error instanceof Error ? error.message : String(error);
32349
+ kt2(message, "Error");
32350
+ }
32351
+ }
32352
+ var select2;
32353
+ var init_status3 = __esm(() => {
32354
+ init_dist2();
32355
+ init_status2();
32356
+ init_init2();
32357
+ init_plugins();
32358
+ ({ select: select2 } = exports_dist);
32088
32359
  });
32089
32360
 
32090
32361
  // src/cli/tui/actions/clients.ts
@@ -34587,7 +34858,7 @@ var pluginUpdateCmd = import_cmd_ts4.command({
34587
34858
  const updatedMarketplaces = new Set;
34588
34859
  const deps = {
34589
34860
  parsePluginSpec,
34590
- getMarketplace,
34861
+ getMarketplace: (name, sourceLocation) => findMarketplace(name, sourceLocation),
34591
34862
  parseMarketplaceManifest,
34592
34863
  updateMarketplace: async (name) => {
34593
34864
  if (updatedMarketplaces.has(name)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "allagents",
3
- "version": "0.22.2",
3
+ "version": "0.23.0",
4
4
  "description": "CLI tool for managing multi-repo AI agent workspaces with plugin synchronization",
5
5
  "type": "module",
6
6
  "bin": {