allagents 1.0.4 → 1.0.6

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 +87 -15
  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
@@ -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.6",
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,9 @@ 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();
36072
36095
  function hasProjectConfig(dir) {
36073
36096
  return existsSync19(join22(dir, CONFIG_DIR, WORKSPACE_CONFIG_FILE));
36074
36097
  }
@@ -36079,6 +36102,35 @@ function resolveScope(cwd) {
36079
36102
  return "project";
36080
36103
  return "user";
36081
36104
  }
36105
+ function resolveSkillFromUrl(skill) {
36106
+ if (!isGitHubUrl(skill))
36107
+ return null;
36108
+ const parsed = parseGitHubUrl(skill);
36109
+ if (!parsed)
36110
+ return null;
36111
+ if (parsed.subpath) {
36112
+ const segments = parsed.subpath.split("/").filter(Boolean);
36113
+ const name = segments[segments.length - 1];
36114
+ if (!name)
36115
+ return null;
36116
+ return { skill: name, from: skill, parsed };
36117
+ }
36118
+ return { skill: parsed.repo, from: skill, parsed };
36119
+ }
36120
+ async function resolveSkillNameFromRepo(url, parsed, fallbackName, fetchFn = fetchPlugin) {
36121
+ const fetchResult = await fetchFn(url, {
36122
+ ...parsed.branch && { branch: parsed.branch }
36123
+ });
36124
+ if (!fetchResult.success)
36125
+ return fallbackName;
36126
+ try {
36127
+ const skillMd = await readFile13(join22(fetchResult.cachePath, "SKILL.md"), "utf-8");
36128
+ const metadata = parseSkillMetadata(skillMd);
36129
+ return metadata?.name ?? fallbackName;
36130
+ } catch {
36131
+ return fallbackName;
36132
+ }
36133
+ }
36082
36134
  function groupSkillsByPlugin(skills) {
36083
36135
  const grouped = new Map;
36084
36136
  for (const skill of skills) {
@@ -36327,10 +36379,30 @@ var addCmd = import_cmd_ts3.command({
36327
36379
  description: "Plugin source to install if the skill is not already available"
36328
36380
  })
36329
36381
  },
36330
- handler: async ({ skill, scope, plugin, from }) => {
36382
+ handler: async ({ skill: skillArg, scope, plugin, from: fromArg }) => {
36331
36383
  try {
36384
+ let skill = skillArg;
36385
+ let from = fromArg;
36332
36386
  const isUser = scope === "user" || !scope && resolveScope(process.cwd()) === "user";
36333
36387
  const workspacePath = isUser ? getHomeDir() : process.cwd();
36388
+ const urlResolved = resolveSkillFromUrl(skill);
36389
+ if (urlResolved) {
36390
+ if (from) {
36391
+ const error = "Cannot use --from when the skill argument is a GitHub URL. The URL is used as the plugin source automatically.";
36392
+ if (isJsonMode()) {
36393
+ jsonOutput({ success: false, command: "plugin skills add", error });
36394
+ process.exit(1);
36395
+ }
36396
+ console.error(`Error: ${error}`);
36397
+ process.exit(1);
36398
+ }
36399
+ from = urlResolved.from;
36400
+ if (urlResolved.parsed && !urlResolved.parsed.subpath) {
36401
+ skill = await resolveSkillNameFromRepo(skill, urlResolved.parsed, urlResolved.skill);
36402
+ } else {
36403
+ skill = urlResolved.skill;
36404
+ }
36405
+ }
36334
36406
  let matches = await findSkillByName(skill, workspacePath);
36335
36407
  if (matches.length === 0) {
36336
36408
  if (from) {
@@ -36485,7 +36557,7 @@ init_format_sync();
36485
36557
  init_workspace_config();
36486
36558
  init_constants();
36487
36559
  init_js_yaml();
36488
- import { readFile as readFile13 } from "node:fs/promises";
36560
+ import { readFile as readFile14 } from "node:fs/promises";
36489
36561
  import { existsSync as existsSync20 } from "node:fs";
36490
36562
  import { join as join23 } from "node:path";
36491
36563
  async function runSyncAndPrint(options2) {
@@ -37044,7 +37116,7 @@ var pluginListCmd = import_cmd_ts4.command({
37044
37116
  if (!existsSync20(configPath))
37045
37117
  return;
37046
37118
  try {
37047
- const content = await readFile13(configPath, "utf-8");
37119
+ const content = await readFile14(configPath, "utf-8");
37048
37120
  const config = load(content);
37049
37121
  if (!config?.plugins || !config?.clients)
37050
37122
  return;
@@ -37480,13 +37552,13 @@ var pluginUpdateCmd = import_cmd_ts4.command({
37480
37552
  }
37481
37553
  if (updateProject && !isUserConfigPath(process.cwd())) {
37482
37554
  const { existsSync: existsSync21 } = await import("node:fs");
37483
- const { readFile: readFile14 } = await import("node:fs/promises");
37555
+ const { readFile: readFile15 } = await import("node:fs/promises");
37484
37556
  const { join: join24 } = await import("node:path");
37485
37557
  const { load: load2 } = await Promise.resolve().then(() => (init_js_yaml(), exports_js_yaml));
37486
37558
  const { CONFIG_DIR: CONFIG_DIR2, WORKSPACE_CONFIG_FILE: WORKSPACE_CONFIG_FILE2 } = await Promise.resolve().then(() => (init_constants(), exports_constants));
37487
37559
  const configPath = join24(process.cwd(), CONFIG_DIR2, WORKSPACE_CONFIG_FILE2);
37488
37560
  if (existsSync21(configPath)) {
37489
- const content = await readFile14(configPath, "utf-8");
37561
+ const content = await readFile15(configPath, "utf-8");
37490
37562
  const config = load2(content);
37491
37563
  for (const entry of config.plugins ?? []) {
37492
37564
  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.6",
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",