@danieldeusing/seedr 0.1.108 → 0.1.110
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/dist/{chunk-3KPB5CCX.js → chunk-USS5HTCG.js} +1 -0
- package/dist/cli.js +154 -33
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
info,
|
|
38
38
|
installFile,
|
|
39
39
|
intro,
|
|
40
|
+
isFirstParty,
|
|
40
41
|
isInteractive,
|
|
41
42
|
isLegacyAgent,
|
|
42
43
|
isTypeSupported,
|
|
@@ -67,7 +68,7 @@ import {
|
|
|
67
68
|
writeFileAtomic,
|
|
68
69
|
writeJson,
|
|
69
70
|
writeTextFile
|
|
70
|
-
} from "./chunk-
|
|
71
|
+
} from "./chunk-USS5HTCG.js";
|
|
71
72
|
|
|
72
73
|
// src/cli.ts
|
|
73
74
|
import { Command as Command5 } from "commander";
|
|
@@ -147,7 +148,7 @@ function isTelemetryDisabled(env = process.env) {
|
|
|
147
148
|
return env[TELEMETRY_OPT_OUT_VARIABLE] !== void 0;
|
|
148
149
|
}
|
|
149
150
|
function cliVersion() {
|
|
150
|
-
return true ? "0.1.
|
|
151
|
+
return true ? "0.1.110" : "dev";
|
|
151
152
|
}
|
|
152
153
|
async function sendEvent(event) {
|
|
153
154
|
try {
|
|
@@ -1219,13 +1220,13 @@ var settingsHandler = {
|
|
|
1219
1220
|
|
|
1220
1221
|
// src/handlers/plugin.ts
|
|
1221
1222
|
import { join as join5, relative as relative3 } from "path";
|
|
1222
|
-
import { mkdir as mkdir3, mkdtemp as mkdtemp2, rm as rm2 } from "fs/promises";
|
|
1223
|
+
import { mkdir as mkdir3, mkdtemp as mkdtemp2, rm as rm2, stat } from "fs/promises";
|
|
1223
1224
|
import chalk7 from "chalk";
|
|
1224
1225
|
import ora6 from "ora";
|
|
1225
1226
|
|
|
1226
1227
|
// src/handlers/pluginStores.ts
|
|
1227
1228
|
import { homedir as homedir4 } from "os";
|
|
1228
|
-
import { join as join4 } from "path";
|
|
1229
|
+
import { basename as basename2, isAbsolute, join as join4 } from "path";
|
|
1229
1230
|
import { mkdir as mkdir2, readFile as readFile3, writeFile } from "fs/promises";
|
|
1230
1231
|
import { execFile } from "child_process";
|
|
1231
1232
|
import { promisify } from "util";
|
|
@@ -1253,6 +1254,23 @@ function splitPluginId(pluginId) {
|
|
|
1253
1254
|
function manifestsFor(ownManifest) {
|
|
1254
1255
|
return ownManifest ? [ownManifest, CLAUDE_MANIFEST] : [CLAUDE_MANIFEST];
|
|
1255
1256
|
}
|
|
1257
|
+
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1258
|
+
async function ensureSelfMarketplace(contentPath, marketplace, name, item) {
|
|
1259
|
+
const dir = join4(contentPath, ".claude-plugin");
|
|
1260
|
+
const path = join4(dir, "marketplace.json");
|
|
1261
|
+
const existing = await exists(path) ? await readJson(path) : {};
|
|
1262
|
+
const plugins = Array.isArray(existing.plugins) ? existing.plugins : [];
|
|
1263
|
+
const listed = plugins.some((entry) => isRecord(entry) && entry.name === name);
|
|
1264
|
+
const description = item.description ? { description: item.description } : {};
|
|
1265
|
+
await mkdir2(dir, { recursive: true });
|
|
1266
|
+
await writeJson(path, {
|
|
1267
|
+
...existing,
|
|
1268
|
+
name: marketplace,
|
|
1269
|
+
owner: existing.owner ?? { name: item.author?.name ?? "seedr" },
|
|
1270
|
+
...existing.description === void 0 ? description : {},
|
|
1271
|
+
plugins: listed ? plugins : [...plugins, { name, source: "./", ...description }]
|
|
1272
|
+
});
|
|
1273
|
+
}
|
|
1256
1274
|
var CLAUDE_PLUGINS_DIR = join4(claudeUserRoot(), "plugins");
|
|
1257
1275
|
var CLAUDE_CACHE_DIR = join4(CLAUDE_PLUGINS_DIR, "cache");
|
|
1258
1276
|
var CLAUDE_INSTALLED_PATH = join4(CLAUDE_PLUGINS_DIR, "installed_plugins.json");
|
|
@@ -1277,14 +1295,41 @@ async function disableInJsonSettings(path, pluginId) {
|
|
|
1277
1295
|
var claudeStore = {
|
|
1278
1296
|
manifestPaths: manifestsFor(),
|
|
1279
1297
|
userGlobal: false,
|
|
1298
|
+
firstParty: true,
|
|
1280
1299
|
cacheRoot: CLAUDE_CACHE_DIR,
|
|
1281
1300
|
cachePath: (marketplace, name, version) => resolveContained(CLAUDE_CACHE_DIR, marketplace, name, version),
|
|
1301
|
+
async prepareTree(contentPath, { name, marketplace, item }) {
|
|
1302
|
+
if (isFirstParty(item.sourceType)) await ensureSelfMarketplace(contentPath, marketplace, name, item);
|
|
1303
|
+
},
|
|
1282
1304
|
/**
|
|
1283
1305
|
* Claude Code reports a plugin as "orphaned" unless its marketplace is both
|
|
1284
1306
|
* recorded and cloned, so this is the one store that fetches a second
|
|
1285
1307
|
* repository. The other agents only record the source.
|
|
1308
|
+
*
|
|
1309
|
+
* A first-party plugin has no repository: its installed tree is the
|
|
1310
|
+
* marketplace (see `ensureSelfMarketplace`), recorded as the `directory`
|
|
1311
|
+
* source Claude writes for `claude plugin marketplace add <dir>`. Always
|
|
1312
|
+
* upserted, because the path carries the version and moves with it.
|
|
1286
1313
|
*/
|
|
1287
|
-
async ensureMarketplace(marketplace, item) {
|
|
1314
|
+
async ensureMarketplace(marketplace, item, cachePath) {
|
|
1315
|
+
if (isFirstParty(item.sourceType)) {
|
|
1316
|
+
if (!cachePath) return [];
|
|
1317
|
+
return [
|
|
1318
|
+
{
|
|
1319
|
+
path: CLAUDE_KNOWN_MARKETPLACES_PATH,
|
|
1320
|
+
detail: `marketplace "${marketplace}" from directory ${cachePath}`,
|
|
1321
|
+
apply: async () => {
|
|
1322
|
+
const current = await readJson(CLAUDE_KNOWN_MARKETPLACES_PATH);
|
|
1323
|
+
current[marketplace] = {
|
|
1324
|
+
source: { source: "directory", path: cachePath },
|
|
1325
|
+
installLocation: cachePath,
|
|
1326
|
+
lastUpdated: (/* @__PURE__ */ new Date()).toISOString()
|
|
1327
|
+
};
|
|
1328
|
+
await writeJson(CLAUDE_KNOWN_MARKETPLACES_PATH, current);
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
];
|
|
1332
|
+
}
|
|
1288
1333
|
const known = await readJson(CLAUDE_KNOWN_MARKETPLACES_PATH);
|
|
1289
1334
|
if (known[marketplace]) return [];
|
|
1290
1335
|
const repo = marketplaceRepo(item);
|
|
@@ -1341,7 +1386,7 @@ var claudeStore = {
|
|
|
1341
1386
|
version: context.version,
|
|
1342
1387
|
installedAt: now,
|
|
1343
1388
|
lastUpdated: now,
|
|
1344
|
-
gitCommitSha: context.gitCommitSha
|
|
1389
|
+
...context.gitCommitSha !== void 0 ? { gitCommitSha: context.gitCommitSha } : {}
|
|
1345
1390
|
};
|
|
1346
1391
|
const existing = registry.plugins[context.pluginId] || [];
|
|
1347
1392
|
registry.plugins[context.pluginId] = [
|
|
@@ -1381,6 +1426,13 @@ var claudeStore = {
|
|
|
1381
1426
|
try {
|
|
1382
1427
|
await removePathEntry(await resolveContained(CLAUDE_CACHE_DIR, installPath));
|
|
1383
1428
|
} catch {
|
|
1429
|
+
continue;
|
|
1430
|
+
}
|
|
1431
|
+
const marketplace = splitPluginId(pluginId)?.marketplace;
|
|
1432
|
+
const known = await readJson(CLAUDE_KNOWN_MARKETPLACES_PATH);
|
|
1433
|
+
if (marketplace && known[marketplace]?.source.source === "directory" && known[marketplace].source.path === installPath) {
|
|
1434
|
+
delete known[marketplace];
|
|
1435
|
+
await writeJson(CLAUDE_KNOWN_MARKETPLACES_PATH, known);
|
|
1384
1436
|
}
|
|
1385
1437
|
}
|
|
1386
1438
|
return true;
|
|
@@ -1392,9 +1444,34 @@ var COPILOT_PLUGINS_DIR = join4(COPILOT_DIR, "installed-plugins");
|
|
|
1392
1444
|
var copilotStore = {
|
|
1393
1445
|
manifestPaths: manifestsFor(),
|
|
1394
1446
|
userGlobal: true,
|
|
1447
|
+
firstParty: true,
|
|
1395
1448
|
cacheRoot: COPILOT_PLUGINS_DIR,
|
|
1396
1449
|
cachePath: (marketplace, name) => resolveContained(COPILOT_PLUGINS_DIR, marketplace, name),
|
|
1397
|
-
async
|
|
1450
|
+
async prepareTree(contentPath, { name, marketplace, item }) {
|
|
1451
|
+
if (isFirstParty(item.sourceType)) await ensureSelfMarketplace(contentPath, marketplace, name, item);
|
|
1452
|
+
},
|
|
1453
|
+
/**
|
|
1454
|
+
* A first-party plugin's installed tree is its marketplace, recorded the way
|
|
1455
|
+
* `copilot plugin marketplace add <dir>` records one: a `directory` source.
|
|
1456
|
+
* Direct installs from a path exist too, but Copilot 1.0.80 announces them
|
|
1457
|
+
* as deprecated in favour of `plugin@marketplace`, which this is.
|
|
1458
|
+
*/
|
|
1459
|
+
async ensureMarketplace(marketplace, item, cachePath) {
|
|
1460
|
+
if (isFirstParty(item.sourceType)) {
|
|
1461
|
+
if (!cachePath) return [];
|
|
1462
|
+
return [
|
|
1463
|
+
{
|
|
1464
|
+
path: COPILOT_SETTINGS_PATH,
|
|
1465
|
+
detail: `extraKnownMarketplaces["${marketplace}"] = directory ${cachePath}`,
|
|
1466
|
+
apply: async () => {
|
|
1467
|
+
const current = await readJson(COPILOT_SETTINGS_PATH);
|
|
1468
|
+
current.extraKnownMarketplaces = current.extraKnownMarketplaces || {};
|
|
1469
|
+
current.extraKnownMarketplaces[marketplace] = { source: { source: "directory", path: cachePath } };
|
|
1470
|
+
await writeJson(COPILOT_SETTINGS_PATH, current);
|
|
1471
|
+
}
|
|
1472
|
+
}
|
|
1473
|
+
];
|
|
1474
|
+
}
|
|
1398
1475
|
const repo = marketplaceRepo(item);
|
|
1399
1476
|
if (!repo) return [];
|
|
1400
1477
|
const settings = await readJson(COPILOT_SETTINGS_PATH);
|
|
@@ -1428,9 +1505,18 @@ var copilotStore = {
|
|
|
1428
1505
|
if (!disabled) return false;
|
|
1429
1506
|
const split = splitPluginId(pluginId);
|
|
1430
1507
|
if (split) {
|
|
1508
|
+
let tree;
|
|
1431
1509
|
try {
|
|
1432
|
-
|
|
1510
|
+
tree = await resolveContained(COPILOT_PLUGINS_DIR, split.marketplace, split.name);
|
|
1511
|
+
await removePathEntry(tree);
|
|
1433
1512
|
} catch {
|
|
1513
|
+
return true;
|
|
1514
|
+
}
|
|
1515
|
+
const settings = await readJson(COPILOT_SETTINGS_PATH);
|
|
1516
|
+
const marketplace = settings.extraKnownMarketplaces?.[split.marketplace];
|
|
1517
|
+
if (marketplace?.source.source === "directory" && marketplace.source.path === tree) {
|
|
1518
|
+
delete settings.extraKnownMarketplaces[split.marketplace];
|
|
1519
|
+
await writeJson(COPILOT_SETTINGS_PATH, settings);
|
|
1434
1520
|
}
|
|
1435
1521
|
}
|
|
1436
1522
|
return true;
|
|
@@ -1460,6 +1546,8 @@ async function upsertCodex(table) {
|
|
|
1460
1546
|
var codexStore = {
|
|
1461
1547
|
manifestPaths: manifestsFor(".codex-plugin/plugin.json"),
|
|
1462
1548
|
userGlobal: true,
|
|
1549
|
+
// `[marketplaces.<name>]` is git-sourced and nothing else has been observed.
|
|
1550
|
+
firstParty: false,
|
|
1463
1551
|
cacheRoot: CODEX_CACHE_DIR,
|
|
1464
1552
|
// Real cache entries on disk are <marketplace>/<name>/<version> — e.g.
|
|
1465
1553
|
// claude-plugins-official/claude-code-setup/1.0.0. Dropping the version
|
|
@@ -1510,7 +1598,12 @@ var codexStore = {
|
|
|
1510
1598
|
function openCodeConfigPath(scope, cwd) {
|
|
1511
1599
|
return scope === "user" ? join4(openCodeUserConfigDir(), "opencode.json") : join4(cwd, "opencode.json");
|
|
1512
1600
|
}
|
|
1513
|
-
|
|
1601
|
+
var OPENCODE_PLUGINS_DIR = join4(openCodeUserConfigDir(), "plugins");
|
|
1602
|
+
function toOpenCodePluginSpec(item, name, cachePath) {
|
|
1603
|
+
if (isFirstParty(item.sourceType)) {
|
|
1604
|
+
if (!cachePath) throw new Error(`OpenCode cannot install "${name}": a first-party plugin needs a directory to load from`);
|
|
1605
|
+
return cachePath;
|
|
1606
|
+
}
|
|
1514
1607
|
const source = item.pluginSource;
|
|
1515
1608
|
if (source?.path) {
|
|
1516
1609
|
throw new Error(
|
|
@@ -1522,19 +1615,25 @@ function toOpenCodePluginSpec(item, name) {
|
|
|
1522
1615
|
const pinned = source?.sha ?? item.sourceRevision;
|
|
1523
1616
|
return `${name}@git+https://github.com/${repo}.git${pinned ? `#${pinned}` : ""}`;
|
|
1524
1617
|
}
|
|
1618
|
+
var isPathSpec = (spec) => isAbsolute(spec) || spec.startsWith("~") || spec.startsWith(".");
|
|
1525
1619
|
function specName(spec) {
|
|
1620
|
+
if (isPathSpec(spec)) return basename2(spec);
|
|
1526
1621
|
const at = spec.indexOf("@", 1);
|
|
1527
1622
|
return at > 0 ? spec.slice(0, at) : spec;
|
|
1528
1623
|
}
|
|
1529
1624
|
var openCodeStore = {
|
|
1530
1625
|
manifestPaths: manifestsFor(),
|
|
1531
1626
|
userGlobal: false,
|
|
1627
|
+
firstParty: true,
|
|
1532
1628
|
cacheRoot: null,
|
|
1533
|
-
|
|
1534
|
-
|
|
1629
|
+
firstPartyCacheRoot: OPENCODE_PLUGINS_DIR,
|
|
1630
|
+
// OpenCode installs a remote module from its spec, so seedr writes no tree;
|
|
1631
|
+
// only a first-party plugin, which has no spec, is copied to a directory
|
|
1632
|
+
// OpenCode can load by path.
|
|
1633
|
+
cachePath: (_marketplace, name, _version, item) => isFirstParty(item.sourceType) ? resolveContained(OPENCODE_PLUGINS_DIR, name) : Promise.resolve(null),
|
|
1535
1634
|
mutations: (context) => {
|
|
1536
1635
|
const path = openCodeConfigPath(context.scope, context.cwd);
|
|
1537
|
-
const spec = toOpenCodePluginSpec(context.item, context.name);
|
|
1636
|
+
const spec = toOpenCodePluginSpec(context.item, context.name, context.cachePath);
|
|
1538
1637
|
return [
|
|
1539
1638
|
{
|
|
1540
1639
|
path,
|
|
@@ -1562,6 +1661,12 @@ var openCodeStore = {
|
|
|
1562
1661
|
if (remaining.length === plugins.length) return false;
|
|
1563
1662
|
config.plugin = remaining;
|
|
1564
1663
|
await writeJson(path, config);
|
|
1664
|
+
if (plugins.some((entry) => specName(entry) === name && isPathSpec(entry))) {
|
|
1665
|
+
try {
|
|
1666
|
+
await removePathEntry(await resolveContained(OPENCODE_PLUGINS_DIR, name));
|
|
1667
|
+
} catch {
|
|
1668
|
+
}
|
|
1669
|
+
}
|
|
1565
1670
|
return true;
|
|
1566
1671
|
}
|
|
1567
1672
|
};
|
|
@@ -1571,6 +1676,8 @@ var GEMINI_IMPORT_MANIFEST_PATH = join4(GEMINI_CONFIG_DIR, "import_manifest.json
|
|
|
1571
1676
|
var antigravityStore = {
|
|
1572
1677
|
manifestPaths: manifestsFor(),
|
|
1573
1678
|
userGlobal: true,
|
|
1679
|
+
// Filed by name from a tree, so a first-party copy is as good as any other.
|
|
1680
|
+
firstParty: true,
|
|
1574
1681
|
cacheRoot: GEMINI_PLUGINS_DIR,
|
|
1575
1682
|
// Antigravity files plugins by name only — it has no marketplace dimension.
|
|
1576
1683
|
cachePath: (_marketplace, name) => resolveContained(GEMINI_PLUGINS_DIR, name),
|
|
@@ -1665,10 +1772,18 @@ function pluginStoreFor(agent) {
|
|
|
1665
1772
|
// src/handlers/plugin.ts
|
|
1666
1773
|
var SLUG_LABEL3 = "plugin slug";
|
|
1667
1774
|
function resolveMarketplaceName(item) {
|
|
1668
|
-
const
|
|
1775
|
+
const fallback = isFirstParty(item.sourceType) ? item.slug : item.author?.name;
|
|
1776
|
+
const marketplace = item.marketplace || fallback || "seedr";
|
|
1669
1777
|
assertSafePathSegment(marketplace, "plugin marketplace");
|
|
1670
1778
|
return marketplace;
|
|
1671
1779
|
}
|
|
1780
|
+
function assertStoreAccepts(store, item, agent) {
|
|
1781
|
+
if (isFirstParty(item.sourceType) && !store.firstParty) {
|
|
1782
|
+
throw new Error(
|
|
1783
|
+
`${CODING_AGENTS[agent].name} installs plugins only from a git marketplace, and a first-party plugin has none \u2014 it lives in the registry itself`
|
|
1784
|
+
);
|
|
1785
|
+
}
|
|
1786
|
+
}
|
|
1672
1787
|
function resolvePluginIdentity(item, pluginJson) {
|
|
1673
1788
|
const name = pluginJson.name || item.slug;
|
|
1674
1789
|
const version = pluginJson.version || "1.0.0";
|
|
@@ -1702,20 +1817,26 @@ async function createStagingDir(cacheRoot, slug) {
|
|
|
1702
1817
|
}
|
|
1703
1818
|
async function stageContent(item, contentPath) {
|
|
1704
1819
|
const sourcePath = getItemSourcePath(item);
|
|
1705
|
-
if (sourcePath) {
|
|
1820
|
+
if (sourcePath && await isDirectory(sourcePath)) {
|
|
1706
1821
|
await copyDirectory(sourcePath, contentPath);
|
|
1707
1822
|
return null;
|
|
1708
1823
|
}
|
|
1709
1824
|
return fetchItemToDestination(item, contentPath);
|
|
1710
1825
|
}
|
|
1826
|
+
async function isDirectory(path) {
|
|
1827
|
+
try {
|
|
1828
|
+
return (await stat(path)).isDirectory();
|
|
1829
|
+
} catch {
|
|
1830
|
+
return false;
|
|
1831
|
+
}
|
|
1832
|
+
}
|
|
1711
1833
|
function resolveGitCommitSha(item, fetched) {
|
|
1712
1834
|
const sha = fetched?.sourceRevision ?? getEffectiveSourceRevision(item);
|
|
1713
|
-
if (
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
return sha;
|
|
1835
|
+
if (sha) return sha;
|
|
1836
|
+
if (isFirstParty(item.sourceType)) return void 0;
|
|
1837
|
+
throw new Error(
|
|
1838
|
+
`Cannot record a source revision for "${item.slug}": the registry entry has neither sourceRevision nor pluginSource.sha`
|
|
1839
|
+
);
|
|
1719
1840
|
}
|
|
1720
1841
|
async function rollback(undo, error2) {
|
|
1721
1842
|
const failures = [];
|
|
@@ -1754,8 +1875,9 @@ async function installPluginForAgent(item, agent, scope, _method, force, cwd) {
|
|
|
1754
1875
|
try {
|
|
1755
1876
|
const store = pluginStoreFor(agent);
|
|
1756
1877
|
assertValidSlug(item.slug, SLUG_LABEL3);
|
|
1878
|
+
assertStoreAccepts(store, item, agent);
|
|
1757
1879
|
const marketplace = resolveMarketplaceName(item);
|
|
1758
|
-
const cacheRoot = store.cacheRoot;
|
|
1880
|
+
const cacheRoot = store.cacheRoot ?? (isFirstParty(item.sourceType) ? store.firstPartyCacheRoot ?? null : null);
|
|
1759
1881
|
const staging = cacheRoot ? await createStagingDir(cacheRoot, item.slug) : null;
|
|
1760
1882
|
try {
|
|
1761
1883
|
const contentPath = staging ? join5(staging, "content") : null;
|
|
@@ -1763,12 +1885,12 @@ async function installPluginForAgent(item, agent, scope, _method, force, cwd) {
|
|
|
1763
1885
|
const pluginJson = contentPath ? await readManifestFromDir(contentPath, store.manifestPaths) : await readManifestForPlan(item, store.manifestPaths);
|
|
1764
1886
|
const { name, version } = resolvePluginIdentity(item, pluginJson);
|
|
1765
1887
|
if (contentPath && store.prepareTree) {
|
|
1766
|
-
await store.prepareTree(contentPath, { name, version, item });
|
|
1888
|
+
await store.prepareTree(contentPath, { name, version, marketplace, item });
|
|
1767
1889
|
}
|
|
1768
1890
|
const gitCommitSha = resolveGitCommitSha(item, fetched);
|
|
1769
1891
|
const pluginId = getPluginId(name, marketplace);
|
|
1770
|
-
const cachePath = await store.cachePath(marketplace, name, version);
|
|
1771
|
-
const marketplaceMutations = store.ensureMarketplace ? await store.ensureMarketplace(marketplace, item) : [];
|
|
1892
|
+
const cachePath = await store.cachePath(marketplace, name, version, item);
|
|
1893
|
+
const marketplaceMutations = store.ensureMarketplace ? await store.ensureMarketplace(marketplace, item, cachePath) : [];
|
|
1772
1894
|
const context = {
|
|
1773
1895
|
item,
|
|
1774
1896
|
marketplace,
|
|
@@ -1845,28 +1967,27 @@ async function getInstalledPlugins(agent, scope, cwd = process.cwd()) {
|
|
|
1845
1967
|
async function kindFor(path) {
|
|
1846
1968
|
return await exists(path) ? "modify" : "create";
|
|
1847
1969
|
}
|
|
1970
|
+
function treeDetail(item) {
|
|
1971
|
+
return isFirstParty(item.sourceType) ? "plugin files (copied from the registry, listed as their own marketplace)" : "plugin files (digest-verified download)";
|
|
1972
|
+
}
|
|
1848
1973
|
async function planPlugin(item, agents, scope, _method, cwd) {
|
|
1849
1974
|
const changes = [];
|
|
1850
1975
|
for (const agent of agents) {
|
|
1851
1976
|
const store = pluginStoreFor(agent);
|
|
1852
1977
|
assertValidSlug(item.slug, SLUG_LABEL3);
|
|
1978
|
+
assertStoreAccepts(store, item, agent);
|
|
1853
1979
|
const marketplace = resolveMarketplaceName(item);
|
|
1854
1980
|
const { name, version } = resolvePluginIdentity(
|
|
1855
1981
|
item,
|
|
1856
1982
|
await readManifestForPlan(item, store.manifestPaths)
|
|
1857
1983
|
);
|
|
1858
1984
|
const pluginId = getPluginId(name, marketplace);
|
|
1859
|
-
const cachePath = await store.cachePath(marketplace, name, version);
|
|
1985
|
+
const cachePath = await store.cachePath(marketplace, name, version, item);
|
|
1860
1986
|
resolveGitCommitSha(item, null);
|
|
1861
1987
|
if (cachePath) {
|
|
1862
|
-
changes.push({
|
|
1863
|
-
agent,
|
|
1864
|
-
kind: await kindFor(cachePath),
|
|
1865
|
-
path: cachePath,
|
|
1866
|
-
detail: "plugin files (digest-verified download)"
|
|
1867
|
-
});
|
|
1988
|
+
changes.push({ agent, kind: await kindFor(cachePath), path: cachePath, detail: treeDetail(item) });
|
|
1868
1989
|
}
|
|
1869
|
-
const marketplaceMutations = store.ensureMarketplace ? await store.ensureMarketplace(marketplace, item) : [];
|
|
1990
|
+
const marketplaceMutations = store.ensureMarketplace ? await store.ensureMarketplace(marketplace, item, cachePath) : [];
|
|
1870
1991
|
const context = {
|
|
1871
1992
|
item,
|
|
1872
1993
|
marketplace,
|
|
@@ -2752,7 +2873,7 @@ var initCommand = new Command4("init").description("Initialize coding agent conf
|
|
|
2752
2873
|
// package.json
|
|
2753
2874
|
var package_default = {
|
|
2754
2875
|
name: "@danieldeusing/seedr",
|
|
2755
|
-
version: "0.1.
|
|
2876
|
+
version: "0.1.110",
|
|
2756
2877
|
description: "Seed your projects with AI configurations",
|
|
2757
2878
|
type: "module",
|
|
2758
2879
|
bin: {
|
package/dist/index.js
CHANGED