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.
- package/README.md +4 -4
- package/dist/index.js +269 -60
- 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
|
|
48
|
-
|
|
47
|
+
# Using npm
|
|
48
|
+
npm install -g allagents
|
|
49
49
|
|
|
50
|
-
# Or run directly
|
|
51
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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: "
|
|
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
|
|
36053
|
-
"allagents
|
|
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
|
-
{
|
|
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
|
-
{
|
|
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
|
-
|
|
36335
|
-
if (
|
|
36532
|
+
const urlResolved = resolveSkillFromUrl(skill);
|
|
36533
|
+
if (urlResolved) {
|
|
36336
36534
|
if (from) {
|
|
36337
|
-
|
|
36338
|
-
|
|
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
|
-
|
|
36351
|
-
|
|
36352
|
-
|
|
36353
|
-
|
|
36354
|
-
|
|
36355
|
-
|
|
36356
|
-
|
|
36357
|
-
|
|
36358
|
-
|
|
36359
|
-
|
|
36360
|
-
|
|
36361
|
-
|
|
36362
|
-
|
|
36363
|
-
|
|
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({
|
|
36379
|
-
|
|
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.
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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.
|
|
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",
|