allagents 1.0.4 → 1.0.7

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 +4 -4
  2. package/dist/index.js +269 -60
  3. package/package.json +3 -2
package/README.md CHANGED
@@ -44,11 +44,11 @@ CLI tool for managing multi-repo AI agent workspaces with plugin synchronization
44
44
  ## Installation
45
45
 
46
46
  ```bash
47
- # Using bun
48
- bun install -g allagents
47
+ # Using npm
48
+ npm install -g allagents
49
49
 
50
- # Or run directly
51
- bunx allagents
50
+ # Or run directly without installing
51
+ npx allagents
52
52
  ```
53
53
 
54
54
  ## Quick Start
package/dist/index.js CHANGED
@@ -6378,7 +6378,7 @@ var require_parse = __commonJS((exports, module) => {
6378
6378
  var token;
6379
6379
  var key;
6380
6380
  var root;
6381
- module.exports = function parse2(text, reviver) {
6381
+ module.exports = function parse(text, reviver) {
6382
6382
  source = String(text);
6383
6383
  parseState = "start";
6384
6384
  stack = [];
@@ -13446,7 +13446,7 @@ function gitInstanceFactory(baseDir, options2) {
13446
13446
  }
13447
13447
  var import_file_exists, import_debug, import_promise_deferred, import_promise_deferred2, __defProp2, __getOwnPropDesc2, __getOwnPropNames2, __hasOwnProp2, __esm2 = (fn, res) => function __init() {
13448
13448
  return fn && (res = (0, fn[__getOwnPropNames2(fn)[0]])(fn = 0)), res;
13449
- }, __commonJS2 = (cb, mod) => function __require2() {
13449
+ }, __commonJS2 = (cb, mod) => function __require() {
13450
13450
  return mod || (0, cb[__getOwnPropNames2(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
13451
13451
  }, __export2 = (target, all) => {
13452
13452
  for (var name in all)
@@ -21933,7 +21933,7 @@ var require_is_extendable = __commonJS((exports, module) => {
21933
21933
  // node_modules/extend-shallow/index.js
21934
21934
  var require_extend_shallow = __commonJS((exports, module) => {
21935
21935
  var isObject2 = require_is_extendable();
21936
- module.exports = function extend3(o) {
21936
+ module.exports = function extend(o) {
21937
21937
  if (!isObject2(o)) {
21938
21938
  o = {};
21939
21939
  }
@@ -22127,7 +22127,7 @@ var require_exception = __commonJS((exports, module) => {
22127
22127
  }
22128
22128
  YAMLException2.prototype = Object.create(Error.prototype);
22129
22129
  YAMLException2.prototype.constructor = YAMLException2;
22130
- YAMLException2.prototype.toString = function toString2(compact) {
22130
+ YAMLException2.prototype.toString = function toString(compact) {
22131
22131
  var result = this.name + ": ";
22132
22132
  result += this.reason || "(unknown reason)";
22133
22133
  if (!compact && this.mark) {
@@ -22180,7 +22180,7 @@ var require_mark = __commonJS((exports, module) => {
22180
22180
  return common2.repeat(" ", indent) + head + snippet2 + tail + `
22181
22181
  ` + common2.repeat(" ", indent + this.position - start + head.length) + "^";
22182
22182
  };
22183
- Mark.prototype.toString = function toString2(compact) {
22183
+ Mark.prototype.toString = function toString(compact) {
22184
22184
  var snippet2, where = "";
22185
22185
  if (this.name) {
22186
22186
  where += 'in "' + this.name + '" ';
@@ -23275,7 +23275,7 @@ var require_loader = __commonJS((exports, module) => {
23275
23275
  }
23276
23276
  }
23277
23277
  var directiveHandlers2 = {
23278
- YAML: function handleYamlDirective2(state, name, args) {
23278
+ YAML: function handleYamlDirective(state, name, args) {
23279
23279
  var match, major, minor;
23280
23280
  if (state.version !== null) {
23281
23281
  throwError2(state, "duplication of %YAML directive");
@@ -23298,7 +23298,7 @@ var require_loader = __commonJS((exports, module) => {
23298
23298
  throwWarning2(state, "unsupported YAML version of the document");
23299
23299
  }
23300
23300
  },
23301
- TAG: function handleTagDirective2(state, name, args) {
23301
+ TAG: function handleTagDirective(state, name, args) {
23302
23302
  var handle, prefix;
23303
23303
  if (args.length !== 2) {
23304
23304
  throwError2(state, "TAG directive accepts exactly two arguments");
@@ -33416,7 +33416,7 @@ var package_default;
33416
33416
  var init_package = __esm(() => {
33417
33417
  package_default = {
33418
33418
  name: "allagents",
33419
- version: "1.0.4",
33419
+ version: "1.0.7",
33420
33420
  description: "CLI tool for managing multi-repo AI agent workspaces with plugin synchronization",
33421
33421
  type: "module",
33422
33422
  bin: {
@@ -33443,7 +33443,8 @@ var init_package = __esm(() => {
33443
33443
  prepare: "bun run build && (test -d .git && bunx prek install -t pre-push || true)",
33444
33444
  release: "bun run scripts/release.ts",
33445
33445
  "release:next": "bun run scripts/release.ts next",
33446
- "publish:next": "bun run build && bun publish --tag next"
33446
+ "publish:next": "bun run build && bun publish --tag next",
33447
+ "promote:latest": "bun scripts/tag-channel.ts latest"
33447
33448
  },
33448
33449
  keywords: [
33449
33450
  "cli",
@@ -33489,13 +33490,13 @@ var init_package = __esm(() => {
33489
33490
  });
33490
33491
 
33491
33492
  // src/cli/update-check.ts
33492
- import { readFile as readFile14 } from "node:fs/promises";
33493
+ import { readFile as readFile15 } from "node:fs/promises";
33493
33494
  import { join as join24 } from "node:path";
33494
33495
  import { spawn as spawn3 } from "node:child_process";
33495
33496
  async function getCachedUpdateInfo(path3) {
33496
33497
  const filePath = path3 ?? join24(getHomeDir(), CONFIG_DIR, CACHE_FILE);
33497
33498
  try {
33498
- const raw = await readFile14(filePath, "utf-8");
33499
+ const raw = await readFile15(filePath, "utf-8");
33499
33500
  const data = JSON.parse(raw);
33500
33501
  if (typeof data.latestVersion === "string" && typeof data.lastCheckedAt === "string") {
33501
33502
  return data;
@@ -36002,6 +36003,7 @@ init_user_workspace();
36002
36003
  init_skills();
36003
36004
  var import_cmd_ts3 = __toESM(require_cjs(), 1);
36004
36005
  import { existsSync as existsSync19 } from "node:fs";
36006
+ import { readFile as readFile13 } from "node:fs/promises";
36005
36007
  import { join as join22 } from "node:path";
36006
36008
 
36007
36009
  // src/cli/metadata/plugin-skills.ts
@@ -36046,19 +36048,37 @@ var skillsRemoveMeta = {
36046
36048
  };
36047
36049
  var skillsAddMeta = {
36048
36050
  command: "plugin skills add",
36049
- description: "Re-enable a previously disabled skill",
36050
- whenToUse: "To re-enable a skill that was previously disabled",
36051
+ description: "Add a skill from a plugin, or re-enable a previously disabled skill",
36052
+ whenToUse: "To add a skill from a GitHub repo or marketplace plugin, or to re-enable a skill that was previously disabled",
36051
36053
  examples: [
36052
- "allagents plugin skills add brainstorming",
36053
- "allagents plugin skills add brainstorming --plugin superpowers"
36054
+ "allagents skills add reddit --from ReScienceLab/opc-skills",
36055
+ "allagents skills add https://github.com/owner/repo/tree/main/skills/my-skill",
36056
+ "allagents skills add brainstorming",
36057
+ "allagents skills add brainstorming --plugin superpowers"
36054
36058
  ],
36055
36059
  expectedOutput: "Confirms skill was enabled and runs sync",
36056
36060
  positionals: [
36057
- { name: "skill", type: "string", required: true, description: "Skill name to enable" }
36061
+ {
36062
+ name: "skill",
36063
+ type: "string",
36064
+ required: true,
36065
+ description: "Skill name to add, or a GitHub URL pointing to a skill"
36066
+ }
36058
36067
  ],
36059
36068
  options: [
36060
36069
  { flag: "--scope", short: "-s", type: "string", description: 'Scope: "project" (default) or "user"' },
36061
- { flag: "--plugin", short: "-p", type: "string", description: "Plugin name (required if skill exists in multiple plugins)" }
36070
+ {
36071
+ flag: "--plugin",
36072
+ short: "-p",
36073
+ type: "string",
36074
+ description: "Plugin name (required if skill exists in multiple plugins)"
36075
+ },
36076
+ {
36077
+ flag: "--from",
36078
+ short: "-f",
36079
+ type: "string",
36080
+ description: "Plugin source (GitHub URL, owner/repo, or plugin@marketplace) to install if the skill is not already available"
36081
+ }
36062
36082
  ],
36063
36083
  outputSchema: {
36064
36084
  skill: "string",
@@ -36069,6 +36089,11 @@ var skillsAddMeta = {
36069
36089
 
36070
36090
  // src/cli/commands/plugin-skills.ts
36071
36091
  init_constants();
36092
+ init_plugin_path();
36093
+ init_plugin();
36094
+ init_skill();
36095
+ init_marketplace();
36096
+ init_marketplace_manifest_parser();
36072
36097
  function hasProjectConfig(dir) {
36073
36098
  return existsSync19(join22(dir, CONFIG_DIR, WORKSPACE_CONFIG_FILE));
36074
36099
  }
@@ -36079,6 +36104,35 @@ function resolveScope(cwd) {
36079
36104
  return "project";
36080
36105
  return "user";
36081
36106
  }
36107
+ function resolveSkillFromUrl(skill) {
36108
+ if (!isGitHubUrl(skill))
36109
+ return null;
36110
+ const parsed = parseGitHubUrl(skill);
36111
+ if (!parsed)
36112
+ return null;
36113
+ if (parsed.subpath) {
36114
+ const segments = parsed.subpath.split("/").filter(Boolean);
36115
+ const name = segments[segments.length - 1];
36116
+ if (!name)
36117
+ return null;
36118
+ return { skill: name, from: skill, parsed };
36119
+ }
36120
+ return { skill: parsed.repo, from: skill, parsed };
36121
+ }
36122
+ async function resolveSkillNameFromRepo(url, parsed, fallbackName, fetchFn = fetchPlugin) {
36123
+ const fetchResult = await fetchFn(url, {
36124
+ ...parsed.branch && { branch: parsed.branch }
36125
+ });
36126
+ if (!fetchResult.success)
36127
+ return fallbackName;
36128
+ try {
36129
+ const skillMd = await readFile13(join22(fetchResult.cachePath, "SKILL.md"), "utf-8");
36130
+ const metadata = parseSkillMetadata(skillMd);
36131
+ return metadata?.name ?? fallbackName;
36132
+ } catch {
36133
+ return fallbackName;
36134
+ }
36135
+ }
36082
36136
  function groupSkillsByPlugin(skills) {
36083
36137
  const grouped = new Map;
36084
36138
  for (const skill of skills) {
@@ -36303,6 +36357,148 @@ Syncing workspace...
36303
36357
  }
36304
36358
  }
36305
36359
  });
36360
+ async function installSkillFromSource(opts) {
36361
+ const { skill, from, isUser, workspacePath } = opts;
36362
+ if (!isJsonMode()) {
36363
+ console.log(`Skill '${skill}' not found. Installing from: ${from}...`);
36364
+ }
36365
+ const parsed = isGitHubUrl(from) ? parseGitHubUrl(from) : null;
36366
+ const fetchResult = await fetchPlugin(from, {
36367
+ ...parsed?.branch && { branch: parsed.branch }
36368
+ });
36369
+ if (!fetchResult.success) {
36370
+ return { success: false, error: `Failed to fetch '${from}': ${fetchResult.error ?? "Unknown error"}` };
36371
+ }
36372
+ const manifestResult = await parseMarketplaceManifest(fetchResult.cachePath);
36373
+ if (manifestResult.success) {
36374
+ return installSkillViaMarketplace({ skill, from, isUser, workspacePath });
36375
+ }
36376
+ return installSkillDirect({ skill, from, isUser, workspacePath, cachePath: fetchResult.cachePath });
36377
+ }
36378
+ async function installSkillViaMarketplace(opts) {
36379
+ const { skill, from, isUser, workspacePath } = opts;
36380
+ if (!isJsonMode()) {
36381
+ console.log("Detected marketplace. Registering...");
36382
+ }
36383
+ const parsed = isGitHubUrl(from) ? parseGitHubUrl(from) : null;
36384
+ const scopeOptions = isUser ? undefined : { scope: "project", workspacePath };
36385
+ let marketplaceName;
36386
+ const mktResult = await addMarketplace(from, parsed?.branch ? `${parsed.repo}-${parsed.branch}` : undefined, parsed?.branch ?? undefined, undefined, scopeOptions);
36387
+ if (mktResult.success) {
36388
+ marketplaceName = mktResult.marketplace?.name;
36389
+ } else if (mktResult.error?.includes("already exists") || mktResult.alreadyRegistered) {
36390
+ const sourceLocation = parsed ? `${parsed.owner}/${parsed.repo}` : undefined;
36391
+ const existing = await findMarketplace(parsed?.repo ?? from, sourceLocation, isUser ? undefined : workspacePath);
36392
+ if (existing) {
36393
+ marketplaceName = existing.name;
36394
+ if (!isJsonMode()) {
36395
+ console.log(`Marketplace '${marketplaceName}' already registered. Updating...`);
36396
+ }
36397
+ await updateMarketplace(marketplaceName, isUser ? undefined : workspacePath);
36398
+ }
36399
+ }
36400
+ if (!marketplaceName) {
36401
+ return { success: false, error: `Failed to register marketplace: ${mktResult.error ?? "Unknown error"}` };
36402
+ }
36403
+ const mktPlugins = await listMarketplacePlugins(marketplaceName, isUser ? undefined : workspacePath);
36404
+ if (mktPlugins.plugins.length === 0) {
36405
+ return { success: false, error: `No plugins found in marketplace '${marketplaceName}'.` };
36406
+ }
36407
+ let targetPluginName = null;
36408
+ const allAvailableSkills = [];
36409
+ for (const mktPlugin of mktPlugins.plugins) {
36410
+ const skillNames = await discoverSkillNames(mktPlugin.path);
36411
+ allAvailableSkills.push(...skillNames);
36412
+ if (!targetPluginName && skillNames.includes(skill)) {
36413
+ targetPluginName = mktPlugin.name;
36414
+ }
36415
+ }
36416
+ if (!targetPluginName) {
36417
+ return {
36418
+ success: false,
36419
+ error: `Skill '${skill}' not found in marketplace '${marketplaceName}'.
36420
+
36421
+ Available skills: ${allAvailableSkills.join(", ") || "none"}`
36422
+ };
36423
+ }
36424
+ const pluginSpec = `${targetPluginName}@${marketplaceName}`;
36425
+ if (!isJsonMode()) {
36426
+ console.log(`Found skill '${skill}' in plugin '${targetPluginName}'. Installing ${pluginSpec}...`);
36427
+ }
36428
+ const installResult = isUser ? await addUserPlugin(pluginSpec) : await addPlugin(pluginSpec, workspacePath);
36429
+ if (!installResult.success) {
36430
+ if (!installResult.error?.includes("already exists") && !installResult.error?.includes("duplicates existing")) {
36431
+ return { success: false, error: `Failed to install plugin '${pluginSpec}': ${installResult.error ?? "Unknown error"}` };
36432
+ }
36433
+ if (!isJsonMode()) {
36434
+ console.log(`Plugin '${pluginSpec}' already installed.`);
36435
+ }
36436
+ }
36437
+ return applySkillAllowlist({ skill, pluginName: targetPluginName, isUser, workspacePath });
36438
+ }
36439
+ async function installSkillDirect(opts) {
36440
+ const { skill, from, isUser, workspacePath, cachePath } = opts;
36441
+ const availableSkills = await discoverSkillNames(cachePath);
36442
+ if (!availableSkills.includes(skill)) {
36443
+ return {
36444
+ success: false,
36445
+ error: `Skill '${skill}' not found in plugin '${from}'.
36446
+
36447
+ Available skills: ${availableSkills.join(", ") || "none"}
36448
+
36449
+ Tip: run \`allagents skills list\` to see all installed skills.`
36450
+ };
36451
+ }
36452
+ const installResult = isUser ? await addUserPlugin(from) : await addPlugin(from, workspacePath);
36453
+ if (!installResult.success) {
36454
+ if (!installResult.error?.includes("already exists") && !installResult.error?.includes("duplicates existing")) {
36455
+ return { success: false, error: `Failed to install plugin '${from}': ${installResult.error ?? "Unknown error"}` };
36456
+ }
36457
+ if (!isJsonMode()) {
36458
+ console.log("Plugin already installed.");
36459
+ }
36460
+ }
36461
+ const pluginName = getPluginName(cachePath);
36462
+ return applySkillAllowlist({ skill, pluginName, isUser, workspacePath });
36463
+ }
36464
+ async function applySkillAllowlist(opts) {
36465
+ const { skill, pluginName, isUser, workspacePath } = opts;
36466
+ const allSkills = await getAllSkillsFromPlugins(workspacePath);
36467
+ const pluginSkills = allSkills.filter((s) => s.pluginName === pluginName);
36468
+ const currentMode = pluginSkills[0]?.pluginSkillsMode ?? "none";
36469
+ if (currentMode === "allowlist") {
36470
+ const skillKey = `${pluginName}:${skill}`;
36471
+ const addResult = isUser ? await addUserEnabledSkill(skillKey) : await addEnabledSkill(skillKey, workspacePath);
36472
+ if (!addResult.success) {
36473
+ if (!addResult.error?.includes("already enabled")) {
36474
+ return { success: false, error: `Failed to enable skill: ${addResult.error ?? "Unknown error"}` };
36475
+ }
36476
+ }
36477
+ } else {
36478
+ const setModeResult = isUser ? await setUserPluginSkillsMode(pluginName, "allowlist", [skill]) : await setPluginSkillsMode(pluginName, "allowlist", [skill], workspacePath);
36479
+ if (!setModeResult.success) {
36480
+ return { success: false, error: `Failed to configure skill allowlist: ${setModeResult.error ?? "Unknown error"}` };
36481
+ }
36482
+ }
36483
+ if (!isJsonMode()) {
36484
+ console.log(`✓ Enabled skill: ${skill} (${pluginName})`);
36485
+ console.log(`
36486
+ Syncing workspace...
36487
+ `);
36488
+ }
36489
+ const syncResult = isUser ? await syncUserWorkspace() : await syncWorkspace(workspacePath);
36490
+ if (!syncResult.success) {
36491
+ return { success: false, error: "Sync failed" };
36492
+ }
36493
+ return {
36494
+ success: true,
36495
+ pluginName,
36496
+ syncResult: {
36497
+ copied: syncResult.totalCopied,
36498
+ failed: syncResult.totalFailed
36499
+ }
36500
+ };
36501
+ }
36306
36502
  var addCmd = import_cmd_ts3.command({
36307
36503
  name: "add",
36308
36504
  description: buildDescription(skillsAddMeta),
@@ -36327,60 +36523,73 @@ var addCmd = import_cmd_ts3.command({
36327
36523
  description: "Plugin source to install if the skill is not already available"
36328
36524
  })
36329
36525
  },
36330
- handler: async ({ skill, scope, plugin, from }) => {
36526
+ handler: async ({ skill: skillArg, scope, plugin, from: fromArg }) => {
36331
36527
  try {
36528
+ let skill = skillArg;
36529
+ let from = fromArg;
36332
36530
  const isUser = scope === "user" || !scope && resolveScope(process.cwd()) === "user";
36333
36531
  const workspacePath = isUser ? getHomeDir() : process.cwd();
36334
- let matches = await findSkillByName(skill, workspacePath);
36335
- if (matches.length === 0) {
36532
+ const urlResolved = resolveSkillFromUrl(skill);
36533
+ if (urlResolved) {
36336
36534
  if (from) {
36337
- if (!isJsonMode()) {
36338
- console.log(`Skill '${skill}' not found. Installing plugin: ${from}...`);
36339
- }
36340
- const installResult = isUser ? await addUserPlugin(from) : await addPlugin(from, workspacePath);
36341
- if (!installResult.success) {
36342
- const error = `Failed to install plugin '${from}': ${installResult.error ?? "Unknown error"}`;
36343
- if (isJsonMode()) {
36344
- jsonOutput({ success: false, command: "plugin skills add", error });
36345
- process.exit(1);
36346
- }
36347
- console.error(`Error: ${error}`);
36535
+ const error = "Cannot use --from when the skill argument is a GitHub URL. The URL is used as the plugin source automatically.";
36536
+ if (isJsonMode()) {
36537
+ jsonOutput({ success: false, command: "plugin skills add", error });
36348
36538
  process.exit(1);
36349
36539
  }
36350
- if (!isJsonMode()) {
36351
- console.log(`Running initial sync...
36352
- `);
36353
- }
36354
- await (isUser ? syncUserWorkspace() : syncWorkspace(workspacePath));
36355
- matches = await findSkillByName(skill, workspacePath);
36356
- if (matches.length === 0) {
36357
- const allSkills = await getAllSkillsFromPlugins(workspacePath);
36358
- const skillNames = [...new Set(allSkills.map((s) => s.name))].join(", ");
36359
- const error = `Skill '${skill}' not found in plugin '${from}'.
36360
-
36361
- Available skills: ${skillNames || "none"}
36362
-
36363
- Tip: run \`allagents skills list\` to see all installed skills.`;
36540
+ console.error(`Error: ${error}`);
36541
+ process.exit(1);
36542
+ }
36543
+ from = urlResolved.from;
36544
+ if (urlResolved.parsed && !urlResolved.parsed.subpath) {
36545
+ skill = await resolveSkillNameFromRepo(skill, urlResolved.parsed, urlResolved.skill);
36546
+ } else {
36547
+ skill = urlResolved.skill;
36548
+ }
36549
+ }
36550
+ const matches = await findSkillByName(skill, workspacePath);
36551
+ if (matches.length === 0) {
36552
+ if (from) {
36553
+ const installFromResult = await installSkillFromSource({
36554
+ skill,
36555
+ from,
36556
+ isUser,
36557
+ workspacePath
36558
+ });
36559
+ if (!installFromResult.success) {
36364
36560
  if (isJsonMode()) {
36365
- jsonOutput({ success: false, command: "plugin skills add", error });
36561
+ jsonOutput({ success: false, command: "plugin skills add", error: installFromResult.error });
36366
36562
  process.exit(1);
36367
36563
  }
36368
- console.error(`Error: ${error}`);
36564
+ console.error(`Error: ${installFromResult.error}`);
36369
36565
  process.exit(1);
36370
36566
  }
36371
- } else {
36372
- const allSkills = await getAllSkillsFromPlugins(workspacePath);
36373
- const skillNames = [...new Set(allSkills.map((s) => s.name))].join(", ");
36374
- const error = `Skill '${skill}' not found in any installed plugin.
36375
-
36376
- Available skills: ${skillNames || "none"}`;
36377
36567
  if (isJsonMode()) {
36378
- jsonOutput({ success: false, command: "plugin skills add", error });
36379
- process.exit(1);
36568
+ jsonOutput({
36569
+ success: true,
36570
+ command: "plugin skills add",
36571
+ data: {
36572
+ skill,
36573
+ plugin: installFromResult.pluginName,
36574
+ syncResult: installFromResult.syncResult
36575
+ }
36576
+ });
36577
+ return;
36380
36578
  }
36381
- console.error(`Error: ${error}`);
36579
+ console.log("Sync complete.");
36580
+ return;
36581
+ }
36582
+ const allSkills = await getAllSkillsFromPlugins(workspacePath);
36583
+ const skillNames = [...new Set(allSkills.map((s) => s.name))].join(", ");
36584
+ const error = `Skill '${skill}' not found in any installed plugin.
36585
+
36586
+ Available skills: ${skillNames || "none"}`;
36587
+ if (isJsonMode()) {
36588
+ jsonOutput({ success: false, command: "plugin skills add", error });
36382
36589
  process.exit(1);
36383
36590
  }
36591
+ console.error(`Error: ${error}`);
36592
+ process.exit(1);
36384
36593
  }
36385
36594
  let targetSkill = matches[0];
36386
36595
  if (!targetSkill) {
@@ -36485,7 +36694,7 @@ init_format_sync();
36485
36694
  init_workspace_config();
36486
36695
  init_constants();
36487
36696
  init_js_yaml();
36488
- import { readFile as readFile13 } from "node:fs/promises";
36697
+ import { readFile as readFile14 } from "node:fs/promises";
36489
36698
  import { existsSync as existsSync20 } from "node:fs";
36490
36699
  import { join as join23 } from "node:path";
36491
36700
  async function runSyncAndPrint(options2) {
@@ -37044,7 +37253,7 @@ var pluginListCmd = import_cmd_ts4.command({
37044
37253
  if (!existsSync20(configPath))
37045
37254
  return;
37046
37255
  try {
37047
- const content = await readFile13(configPath, "utf-8");
37256
+ const content = await readFile14(configPath, "utf-8");
37048
37257
  const config = load(content);
37049
37258
  if (!config?.plugins || !config?.clients)
37050
37259
  return;
@@ -37480,13 +37689,13 @@ var pluginUpdateCmd = import_cmd_ts4.command({
37480
37689
  }
37481
37690
  if (updateProject && !isUserConfigPath(process.cwd())) {
37482
37691
  const { existsSync: existsSync21 } = await import("node:fs");
37483
- const { readFile: readFile14 } = await import("node:fs/promises");
37692
+ const { readFile: readFile15 } = await import("node:fs/promises");
37484
37693
  const { join: join24 } = await import("node:path");
37485
37694
  const { load: load2 } = await Promise.resolve().then(() => (init_js_yaml(), exports_js_yaml));
37486
37695
  const { CONFIG_DIR: CONFIG_DIR2, WORKSPACE_CONFIG_FILE: WORKSPACE_CONFIG_FILE2 } = await Promise.resolve().then(() => (init_constants(), exports_constants));
37487
37696
  const configPath = join24(process.cwd(), CONFIG_DIR2, WORKSPACE_CONFIG_FILE2);
37488
37697
  if (existsSync21(configPath)) {
37489
- const content = await readFile14(configPath, "utf-8");
37698
+ const content = await readFile15(configPath, "utf-8");
37490
37699
  const config = load2(content);
37491
37700
  for (const entry of config.plugins ?? []) {
37492
37701
  const p = getPluginSource(entry);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "allagents",
3
- "version": "1.0.4",
3
+ "version": "1.0.7",
4
4
  "description": "CLI tool for managing multi-repo AI agent workspaces with plugin synchronization",
5
5
  "type": "module",
6
6
  "bin": {
@@ -27,7 +27,8 @@
27
27
  "prepare": "bun run build && (test -d .git && bunx prek install -t pre-push || true)",
28
28
  "release": "bun run scripts/release.ts",
29
29
  "release:next": "bun run scripts/release.ts next",
30
- "publish:next": "bun run build && bun publish --tag next"
30
+ "publish:next": "bun run build && bun publish --tag next",
31
+ "promote:latest": "bun scripts/tag-channel.ts latest"
31
32
  },
32
33
  "keywords": [
33
34
  "cli",