agents-pkg 0.2.1
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 +178 -0
- package/bin/agents-pkg.mjs +3 -0
- package/dist/add-plugin.d.ts +14 -0
- package/dist/add-plugin.d.ts.map +1 -0
- package/dist/add-plugin.js +171 -0
- package/dist/add-plugin.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +74 -0
- package/dist/cli.js.map +1 -0
- package/dist/del-plugin.d.ts +5 -0
- package/dist/del-plugin.d.ts.map +1 -0
- package/dist/del-plugin.js +38 -0
- package/dist/del-plugin.js.map +1 -0
- package/dist/lib/constants.d.ts +17 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +17 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/errors.d.ts +5 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +8 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/hooks.d.ts +28 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/hooks.js +85 -0
- package/dist/lib/hooks.js.map +1 -0
- package/dist/lib/lock.d.ts +19 -0
- package/dist/lib/lock.d.ts.map +1 -0
- package/dist/lib/lock.js +59 -0
- package/dist/lib/lock.js.map +1 -0
- package/dist/lib/marketplace.d.ts +33 -0
- package/dist/lib/marketplace.d.ts.map +1 -0
- package/dist/lib/marketplace.js +60 -0
- package/dist/lib/marketplace.js.map +1 -0
- package/dist/lib/paths.d.ts +14 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +38 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/source-dir.d.ts +15 -0
- package/dist/lib/source-dir.d.ts.map +1 -0
- package/dist/lib/source-dir.js +99 -0
- package/dist/lib/source-dir.js.map +1 -0
- package/dist/lib/symlink.d.ts +16 -0
- package/dist/lib/symlink.d.ts.map +1 -0
- package/dist/lib/symlink.js +68 -0
- package/dist/lib/symlink.js.map +1 -0
- package/dist/lib/types.d.ts +17 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +5 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/update.d.ts +5 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +60 -0
- package/dist/update.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hooks = Cursor .cursor/hooks.json only.
|
|
3
|
+
* Claude uses a different setup (.claude/settings.json, different format); not managed here.
|
|
4
|
+
* Format: { "version": 1, "hooks": { "hookName": [ { "command": "path/to/script" } ] } }
|
|
5
|
+
*/
|
|
6
|
+
import { readFile, writeFile, mkdir } from 'fs/promises';
|
|
7
|
+
import { dirname } from 'path';
|
|
8
|
+
import { getCursorHooksPath } from './paths.js';
|
|
9
|
+
const DEFAULT_HOOKS = { version: 1, hooks: {} };
|
|
10
|
+
async function readHooksJson(path) {
|
|
11
|
+
try {
|
|
12
|
+
const raw = await readFile(path, 'utf-8');
|
|
13
|
+
const parsed = JSON.parse(raw);
|
|
14
|
+
if (parsed.hooks && typeof parsed.hooks === 'object') {
|
|
15
|
+
return { version: parsed.version ?? 1, hooks: parsed.hooks };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// missing or invalid
|
|
20
|
+
}
|
|
21
|
+
return { ...DEFAULT_HOOKS };
|
|
22
|
+
}
|
|
23
|
+
async function writeHooksJson(path, data) {
|
|
24
|
+
await mkdir(dirname(path), { recursive: true });
|
|
25
|
+
await writeFile(path, JSON.stringify({ version: data.version ?? 1, hooks: data.hooks }, null, 2), 'utf-8');
|
|
26
|
+
}
|
|
27
|
+
export async function listHooks(options = {}) {
|
|
28
|
+
const cwd = options.cwd ?? process.cwd();
|
|
29
|
+
const projectPath = getCursorHooksPath(false, cwd);
|
|
30
|
+
const globalPath = getCursorHooksPath(true, cwd);
|
|
31
|
+
const [projectData, globalData] = await Promise.all([
|
|
32
|
+
readHooksJson(projectPath),
|
|
33
|
+
readHooksJson(globalPath),
|
|
34
|
+
]);
|
|
35
|
+
const project = Object.keys(projectData.hooks);
|
|
36
|
+
const global = Object.keys(globalData.hooks);
|
|
37
|
+
const all = [...new Set([...project, ...global])];
|
|
38
|
+
return { project, global, all };
|
|
39
|
+
}
|
|
40
|
+
export async function addHook(hookName, command, options = {}) {
|
|
41
|
+
const cwd = options.cwd ?? process.cwd();
|
|
42
|
+
const includeGlobal = options.global ?? false;
|
|
43
|
+
const path = getCursorHooksPath(includeGlobal, cwd);
|
|
44
|
+
const data = await readHooksJson(path);
|
|
45
|
+
const entries = data.hooks[hookName] ?? [];
|
|
46
|
+
if (!entries.some((e) => e.command === command)) {
|
|
47
|
+
entries.push({ command });
|
|
48
|
+
}
|
|
49
|
+
data.hooks[hookName] = entries;
|
|
50
|
+
await writeHooksJson(path, data);
|
|
51
|
+
}
|
|
52
|
+
export async function removeHook(hookName, options = {}) {
|
|
53
|
+
const cwd = options.cwd ?? process.cwd();
|
|
54
|
+
let removed = false;
|
|
55
|
+
for (const global of [false, true]) {
|
|
56
|
+
const path = getCursorHooksPath(global, cwd);
|
|
57
|
+
const data = await readHooksJson(path);
|
|
58
|
+
if (hookName in data.hooks) {
|
|
59
|
+
delete data.hooks[hookName];
|
|
60
|
+
await writeHooksJson(path, data);
|
|
61
|
+
removed = true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return removed;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Merge repo hooks into project .cursor/hooks.json (Cursor only).
|
|
68
|
+
*/
|
|
69
|
+
export async function mergeHooksIntoProject(repoHooks, cwd) {
|
|
70
|
+
const path = getCursorHooksPath(false, cwd);
|
|
71
|
+
const existing = await readHooksJson(path);
|
|
72
|
+
for (const [name, entries] of Object.entries(repoHooks.hooks ?? {})) {
|
|
73
|
+
const existingEntries = existing.hooks[name] ?? [];
|
|
74
|
+
const seen = new Set(existingEntries.map((e) => e.command));
|
|
75
|
+
for (const e of entries) {
|
|
76
|
+
if (!seen.has(e.command)) {
|
|
77
|
+
existingEntries.push(e);
|
|
78
|
+
seen.add(e.command);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
existing.hooks[name] = existingEntries;
|
|
82
|
+
}
|
|
83
|
+
await writeHooksJson(path, existing);
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAkBhD,MAAM,aAAa,GAAc,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAE3D,KAAK,UAAU,aAAa,CAAC,IAAY;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;QAC5C,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC/D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IACD,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,IAAe;IACzD,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC7G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAwB,EAAE;IACxD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACjD,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAClD,aAAa,CAAC,WAAW,CAAC;QAC1B,aAAa,CAAC,UAAU,CAAC;KAC1B,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAClD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,QAAgB,EAChB,OAAe,EACf,UAAwB,EAAE;IAE1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;IAC9C,MAAM,IAAI,GAAG,kBAAkB,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;IAC/B,MAAM,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,UAAwB,EAAE;IAC3E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC5B,MAAM,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACjC,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,SAAoB,EAAE,GAAW;IAC3E,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;QACpE,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACxB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QACD,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC;IACzC,CAAC;IACD,MAAM,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agents-pkg lock file: ~/.agents/.agents-pkg-lock.json
|
|
3
|
+
* Marketplace-only: tracks installed marketplaces by name.
|
|
4
|
+
*/
|
|
5
|
+
import type { LockFile } from './types.js';
|
|
6
|
+
export declare function getHome(): string;
|
|
7
|
+
export declare function getLockPath(): string;
|
|
8
|
+
export declare function getAgentsDir(): string;
|
|
9
|
+
/**
|
|
10
|
+
* Read the agents-pkg lock file.
|
|
11
|
+
* Returns empty lock if missing or invalid.
|
|
12
|
+
*/
|
|
13
|
+
export declare function readLock(): Promise<LockFile>;
|
|
14
|
+
/**
|
|
15
|
+
* Write the lock file. Creates ~/.agents if needed.
|
|
16
|
+
*/
|
|
17
|
+
export declare function writeLock(lock: LockFile): Promise<void>;
|
|
18
|
+
export type { LockFile, MarketplaceEntry } from './types.js';
|
|
19
|
+
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/lib/lock.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,wBAAgB,OAAO,IAAI,MAAM,CAIhC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AASD;;;GAGG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,CAclD;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAS7D;AAED,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/lib/lock.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agents-pkg lock file: ~/.agents/.agents-pkg-lock.json
|
|
3
|
+
* Marketplace-only: tracks installed marketplaces by name.
|
|
4
|
+
*/
|
|
5
|
+
import { readFile, writeFile, mkdir } from 'fs/promises';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { homedir } from 'os';
|
|
8
|
+
import { AGENTS_DIR, LOCK_FILE, CURRENT_LOCK_VERSION, } from './constants.js';
|
|
9
|
+
export function getHome() {
|
|
10
|
+
const env = process.env.AGENTS_PKG_HOME;
|
|
11
|
+
if (env && typeof env === 'string' && env.trim())
|
|
12
|
+
return env.trim();
|
|
13
|
+
return homedir();
|
|
14
|
+
}
|
|
15
|
+
export function getLockPath() {
|
|
16
|
+
return join(getHome(), AGENTS_DIR, LOCK_FILE);
|
|
17
|
+
}
|
|
18
|
+
export function getAgentsDir() {
|
|
19
|
+
return join(getHome(), AGENTS_DIR);
|
|
20
|
+
}
|
|
21
|
+
function createEmptyLock() {
|
|
22
|
+
return {
|
|
23
|
+
version: CURRENT_LOCK_VERSION,
|
|
24
|
+
marketplaces: {},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Read the agents-pkg lock file.
|
|
29
|
+
* Returns empty lock if missing or invalid.
|
|
30
|
+
*/
|
|
31
|
+
export async function readLock() {
|
|
32
|
+
const lockPath = getLockPath();
|
|
33
|
+
try {
|
|
34
|
+
const content = await readFile(lockPath, 'utf-8');
|
|
35
|
+
const parsed = JSON.parse(content);
|
|
36
|
+
if (typeof parsed.version !== 'number' || parsed.version !== CURRENT_LOCK_VERSION) {
|
|
37
|
+
return createEmptyLock();
|
|
38
|
+
}
|
|
39
|
+
const marketplaces = parsed.marketplaces && typeof parsed.marketplaces === 'object' ? parsed.marketplaces : {};
|
|
40
|
+
return { version: parsed.version, marketplaces };
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return createEmptyLock();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Write the lock file. Creates ~/.agents if needed.
|
|
48
|
+
*/
|
|
49
|
+
export async function writeLock(lock) {
|
|
50
|
+
const lockPath = getLockPath();
|
|
51
|
+
const dir = getAgentsDir();
|
|
52
|
+
await mkdir(dir, { recursive: true });
|
|
53
|
+
const out = {
|
|
54
|
+
version: lock.version,
|
|
55
|
+
marketplaces: lock.marketplaces ?? {},
|
|
56
|
+
};
|
|
57
|
+
await writeFile(lockPath, JSON.stringify(out, null, 2), 'utf-8');
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/lib/lock.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EACL,UAAU,EACV,SAAS,EACT,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAGxB,MAAM,UAAU,OAAO;IACrB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACxC,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;IACpE,OAAO,OAAO,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,eAAe;IACtB,OAAO;QACL,OAAO,EAAE,oBAAoB;QAC7B,YAAY,EAAE,EAAE;KACjB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA0E,CAAC;QAC5G,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,KAAK,oBAAoB,EAAE,CAAC;YAClF,OAAO,eAAe,EAAE,CAAC;QAC3B,CAAC;QACD,MAAM,YAAY,GAChB,MAAM,CAAC,YAAY,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,eAAe,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc;IAC5C,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,GAAG,GAAa;QACpB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE;KACtC,CAAC;IACF,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marketplace manifest (.cursor-plugin/marketplace.json inside source) and store paths.
|
|
3
|
+
*/
|
|
4
|
+
export interface MarketplacePlugin {
|
|
5
|
+
name: string;
|
|
6
|
+
source: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface MarketplaceManifest {
|
|
10
|
+
name: string;
|
|
11
|
+
owner?: {
|
|
12
|
+
name?: string;
|
|
13
|
+
};
|
|
14
|
+
metadata?: {
|
|
15
|
+
description?: string;
|
|
16
|
+
version?: string;
|
|
17
|
+
};
|
|
18
|
+
plugins: MarketplacePlugin[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Read marketplace manifest from resolved source dir.
|
|
22
|
+
* Path: join(sourceDir, '.cursor-plugin', 'marketplace.json')
|
|
23
|
+
*/
|
|
24
|
+
export declare function readMarketplaceManifest(sourceDir: string): Promise<MarketplaceManifest>;
|
|
25
|
+
/**
|
|
26
|
+
* Store path for a marketplace: ~/.agents/agents-pkg/marketplace/<name>
|
|
27
|
+
*/
|
|
28
|
+
export declare function getMarketplaceStorePath(name: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Store path for a plugin: ~/.agents/agents-pkg/marketplace/<marketplaceName>/<pluginName>
|
|
31
|
+
*/
|
|
32
|
+
export declare function getPluginStorePath(marketplaceName: string, pluginName: string): string;
|
|
33
|
+
//# sourceMappingURL=marketplace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace.d.ts","sourceRoot":"","sources":["../../src/lib/marketplace.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAkC7F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEtF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marketplace manifest (.cursor-plugin/marketplace.json inside source) and store paths.
|
|
3
|
+
*/
|
|
4
|
+
import { readFile } from 'fs/promises';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { getHome } from './lock.js';
|
|
7
|
+
import { AGENTS_DIR, MARKETPLACE_DIR, MARKETPLACE_JSON } from './constants.js';
|
|
8
|
+
/**
|
|
9
|
+
* Read marketplace manifest from resolved source dir.
|
|
10
|
+
* Path: join(sourceDir, '.cursor-plugin', 'marketplace.json')
|
|
11
|
+
*/
|
|
12
|
+
export async function readMarketplaceManifest(sourceDir) {
|
|
13
|
+
const path = join(sourceDir, MARKETPLACE_JSON);
|
|
14
|
+
let raw;
|
|
15
|
+
try {
|
|
16
|
+
raw = await readFile(path, 'utf-8');
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
throw new Error(`No marketplace manifest at ${path}. Expected .cursor-plugin/marketplace.json in the source.`);
|
|
20
|
+
}
|
|
21
|
+
const manifest = JSON.parse(raw);
|
|
22
|
+
if (typeof manifest.name !== 'string' || !manifest.name.trim()) {
|
|
23
|
+
throw new Error('marketplace.json must contain a "name" field (string).');
|
|
24
|
+
}
|
|
25
|
+
if (!Array.isArray(manifest.plugins)) {
|
|
26
|
+
throw new Error('marketplace.json must contain a "plugins" array.');
|
|
27
|
+
}
|
|
28
|
+
const plugins = [];
|
|
29
|
+
for (const p of manifest.plugins) {
|
|
30
|
+
if (typeof p !== 'object' || p === null)
|
|
31
|
+
continue;
|
|
32
|
+
const o = p;
|
|
33
|
+
if (typeof o.name !== 'string' || typeof o.source !== 'string')
|
|
34
|
+
continue;
|
|
35
|
+
plugins.push({
|
|
36
|
+
name: o.name.trim(),
|
|
37
|
+
source: o.source.trim(),
|
|
38
|
+
description: o.description != null ? String(o.description) : undefined,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
name: String(manifest.name).trim(),
|
|
43
|
+
owner: manifest.owner && typeof manifest.owner === 'object' ? manifest.owner : undefined,
|
|
44
|
+
metadata: manifest.metadata && typeof manifest.metadata === 'object' ? manifest.metadata : undefined,
|
|
45
|
+
plugins,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Store path for a marketplace: ~/.agents/agents-pkg/marketplace/<name>
|
|
50
|
+
*/
|
|
51
|
+
export function getMarketplaceStorePath(name) {
|
|
52
|
+
return join(getHome(), AGENTS_DIR, MARKETPLACE_DIR, name);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Store path for a plugin: ~/.agents/agents-pkg/marketplace/<marketplaceName>/<pluginName>
|
|
56
|
+
*/
|
|
57
|
+
export function getPluginStorePath(marketplaceName, pluginName) {
|
|
58
|
+
return join(getMarketplaceStorePath(marketplaceName), pluginName);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=marketplace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace.js","sourceRoot":"","sources":["../../src/lib/marketplace.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAe/E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,SAAiB;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAC/C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,8BAA8B,IAAI,2DAA2D,CAC9F,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IAC5D,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,OAAO,GAAwB,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,SAAS;QAClD,MAAM,CAAC,GAAG,CAA4B,CAAC;QACvC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;YAAE,SAAS;QACzE,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;YACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;YACvB,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;SACvE,CAAC,CAAC;IACL,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;QAClC,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAE,QAAQ,CAAC,KAA2B,CAAC,CAAC,CAAC,SAAS;QAC/G,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAE,QAAQ,CAAC,QAAuD,CAAC,CAAC,CAAC,SAAS;QACpJ,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,eAAuB,EAAE,UAAkB;IAC5E,OAAO,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paths for Cursor and Claude (project and global).
|
|
3
|
+
* Subagents = .cursor/agents, .claude/agents (both support them).
|
|
4
|
+
* Commands = .cursor/commands, .claude/commands.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getCursorAgentsDir(global: boolean, cwd?: string): string;
|
|
7
|
+
export declare function getClaudeAgentsDir(global: boolean, cwd?: string): string;
|
|
8
|
+
export declare function getCursorCommandsDir(global: boolean, cwd?: string): string;
|
|
9
|
+
export declare function getClaudeCommandsDir(global: boolean, cwd?: string): string;
|
|
10
|
+
/** Cursor only: path to .cursor/hooks.json */
|
|
11
|
+
export declare function getCursorHooksPath(global: boolean, cwd?: string): string;
|
|
12
|
+
/** Cursor only: path to .cursor/skills (global = ~/.cursor/skills) */
|
|
13
|
+
export declare function getCursorSkillsDir(global: boolean, cwd?: string): string;
|
|
14
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAKxE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAG1E;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAK1E;AAED,8CAA8C;AAC9C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxE;AAED,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paths for Cursor and Claude (project and global).
|
|
3
|
+
* Subagents = .cursor/agents, .claude/agents (both support them).
|
|
4
|
+
* Commands = .cursor/commands, .claude/commands.
|
|
5
|
+
*/
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { homedir } from 'os';
|
|
8
|
+
export function getCursorAgentsDir(global, cwd) {
|
|
9
|
+
const base = global ? homedir() : (cwd || process.cwd());
|
|
10
|
+
return join(base, '.cursor', 'agents');
|
|
11
|
+
}
|
|
12
|
+
export function getClaudeAgentsDir(global, cwd) {
|
|
13
|
+
const home = homedir();
|
|
14
|
+
const claudeHome = process.env.CLAUDE_CONFIG_DIR?.trim() || join(home, '.claude');
|
|
15
|
+
const base = global ? claudeHome : (cwd || process.cwd());
|
|
16
|
+
return join(base, '.claude', 'agents');
|
|
17
|
+
}
|
|
18
|
+
export function getCursorCommandsDir(global, cwd) {
|
|
19
|
+
const base = global ? homedir() : (cwd || process.cwd());
|
|
20
|
+
return join(base, '.cursor', 'commands');
|
|
21
|
+
}
|
|
22
|
+
export function getClaudeCommandsDir(global, cwd) {
|
|
23
|
+
const home = homedir();
|
|
24
|
+
const claudeHome = process.env.CLAUDE_CONFIG_DIR?.trim() || join(home, '.claude');
|
|
25
|
+
const base = global ? claudeHome : (cwd || process.cwd());
|
|
26
|
+
return join(base, '.claude', 'commands');
|
|
27
|
+
}
|
|
28
|
+
/** Cursor only: path to .cursor/hooks.json */
|
|
29
|
+
export function getCursorHooksPath(global, cwd) {
|
|
30
|
+
const base = global ? homedir() : (cwd || process.cwd());
|
|
31
|
+
return join(base, '.cursor', 'hooks.json');
|
|
32
|
+
}
|
|
33
|
+
/** Cursor only: path to .cursor/skills (global = ~/.cursor/skills) */
|
|
34
|
+
export function getCursorSkillsDir(global, cwd) {
|
|
35
|
+
const base = global ? homedir() : (cwd || process.cwd());
|
|
36
|
+
return join(base, '.cursor', 'skills');
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,MAAM,UAAU,kBAAkB,CAAC,MAAe,EAAE,GAAY;IAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAe,EAAE,GAAY;IAC9D,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAe,EAAE,GAAY;IAChE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAe,EAAE,GAAY;IAChE,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAC3C,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,kBAAkB,CAAC,MAAe,EAAE,GAAY;IAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AAC7C,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,kBAAkB,CAAC,MAAe,EAAE,GAAY;IAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a source (GitHub owner/repo, git URL, or local path) to a local directory path.
|
|
3
|
+
* For remote sources, clones to a temp directory; caller must call cleanup() when done.
|
|
4
|
+
*/
|
|
5
|
+
export interface ResolveSourceToDirResult {
|
|
6
|
+
path: string;
|
|
7
|
+
/** Call when done to remove temp dir (only set when we cloned). */
|
|
8
|
+
cleanup?: () => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Resolve source to a local directory. For remote sources, clones to a temp dir.
|
|
12
|
+
* Call cleanup() when finished to remove the temp dir.
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveSourceToDir(source: string): Promise<ResolveSourceToDirResult>;
|
|
15
|
+
//# sourceMappingURL=source-dir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-dir.d.ts","sourceRoot":"","sources":["../../src/lib/source-dir.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA+CH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAkD1F"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a source (GitHub owner/repo, git URL, or local path) to a local directory path.
|
|
3
|
+
* For remote sources, clones to a temp directory; caller must call cleanup() when done.
|
|
4
|
+
*/
|
|
5
|
+
import { resolve } from 'path';
|
|
6
|
+
import { mkdtemp, rm, stat } from 'fs/promises';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { tmpdir } from 'os';
|
|
9
|
+
import { spawnSync } from 'child_process';
|
|
10
|
+
function isLocalPath(input) {
|
|
11
|
+
const t = input.trim();
|
|
12
|
+
return (t.startsWith('./') ||
|
|
13
|
+
t.startsWith('../') ||
|
|
14
|
+
t === '.' ||
|
|
15
|
+
t === '..' ||
|
|
16
|
+
t.startsWith('/') ||
|
|
17
|
+
/^[a-zA-Z]:[/\\]/.test(t));
|
|
18
|
+
}
|
|
19
|
+
function isGitUrl(input) {
|
|
20
|
+
const t = input.trim();
|
|
21
|
+
return t.startsWith('http://') || t.startsWith('https://') || t.startsWith('git@');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Convert shorthand to HTTPS clone URL.
|
|
25
|
+
* owner/repo -> https://github.com/owner/repo.git
|
|
26
|
+
* gitlab.com/owner/repo -> https://gitlab.com/owner/repo.git
|
|
27
|
+
* Other hosts require a full git URL.
|
|
28
|
+
*/
|
|
29
|
+
function ownerRepoToUrl(ownerRepo) {
|
|
30
|
+
const trimmed = ownerRepo.trim();
|
|
31
|
+
if (trimmed.includes(':'))
|
|
32
|
+
return '';
|
|
33
|
+
const parts = trimmed.split('/').filter(Boolean);
|
|
34
|
+
if (parts.length === 2) {
|
|
35
|
+
const [owner, repo] = parts;
|
|
36
|
+
if (owner.includes('.'))
|
|
37
|
+
return '';
|
|
38
|
+
return `https://github.com/${owner}/${(repo ?? '').replace(/\.git$/, '')}.git`;
|
|
39
|
+
}
|
|
40
|
+
if (parts.length === 3 && (parts[0] === 'github.com' || parts[0] === 'gitlab.com')) {
|
|
41
|
+
const [host, owner, repo] = parts;
|
|
42
|
+
return `https://${host}/${owner}/${(repo ?? '').replace(/\.git$/, '')}.git`;
|
|
43
|
+
}
|
|
44
|
+
return '';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolve source to a local directory. For remote sources, clones to a temp dir.
|
|
48
|
+
* Call cleanup() when finished to remove the temp dir.
|
|
49
|
+
*/
|
|
50
|
+
export async function resolveSourceToDir(source) {
|
|
51
|
+
const trimmed = source.trim();
|
|
52
|
+
if (!trimmed) {
|
|
53
|
+
throw new Error('Source is required');
|
|
54
|
+
}
|
|
55
|
+
// Local path
|
|
56
|
+
if (isLocalPath(trimmed)) {
|
|
57
|
+
const abs = resolve(trimmed);
|
|
58
|
+
try {
|
|
59
|
+
const st = await stat(abs);
|
|
60
|
+
if (!st.isDirectory()) {
|
|
61
|
+
throw new Error(`Not a directory: ${abs}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
if (e instanceof Error && e.message.startsWith('Not a directory'))
|
|
66
|
+
throw e;
|
|
67
|
+
throw new Error(`Path not found or not a directory: ${trimmed}`);
|
|
68
|
+
}
|
|
69
|
+
return { path: abs };
|
|
70
|
+
}
|
|
71
|
+
// Remote: git URL or owner/repo
|
|
72
|
+
let cloneUrl;
|
|
73
|
+
if (isGitUrl(trimmed)) {
|
|
74
|
+
cloneUrl = trimmed;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
cloneUrl = ownerRepoToUrl(trimmed);
|
|
78
|
+
if (!cloneUrl) {
|
|
79
|
+
throw new Error(`Invalid source: ${trimmed}. Use a local path, owner/repo, or a git URL.`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const tempDir = await mkdtemp(join(tmpdir(), 'agents-pkg-'));
|
|
83
|
+
const result = spawnSync('git', ['clone', '--depth', '1', cloneUrl, tempDir], {
|
|
84
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
85
|
+
encoding: 'utf-8',
|
|
86
|
+
});
|
|
87
|
+
if (result.status !== 0) {
|
|
88
|
+
await rm(tempDir, { recursive: true, force: true }).catch(() => { });
|
|
89
|
+
const stderr = (result.stderr || '').trim();
|
|
90
|
+
throw new Error(`Failed to clone ${cloneUrl}: ${stderr || result.error?.message || 'unknown error'}`);
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
path: tempDir,
|
|
94
|
+
cleanup: async () => {
|
|
95
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=source-dir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-dir.js","sourceRoot":"","sources":["../../src/lib/source-dir.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACvB,OAAO,CACL,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QAClB,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;QACnB,CAAC,KAAK,GAAG;QACT,CAAC,KAAK,IAAI;QACV,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QACjB,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAC1B,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACvB,OAAO,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACrF,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,SAAiB;IACvC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;QAC5B,IAAI,KAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QACpC,OAAO,sBAAsB,KAAK,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC;IACjF,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,EAAE,CAAC;QACnF,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;QAClC,OAAO,WAAW,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAQD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAc;IACrD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,aAAa;IACb,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC;gBAAE,MAAM,CAAC,CAAC;YAC3E,MAAM,IAAI,KAAK,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,gCAAgC;IAChC,IAAI,QAAgB,CAAC;IACrB,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACtB,QAAQ,GAAG,OAAO,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,+CAA+C,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE;QAC5E,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;QACjC,QAAQ,EAAE,OAAO;KAClB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,KAAK,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC;IACxG,CAAC;IAED,OAAO;QACL,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symlink helpers for marketplace install: create symlinks, remove symlinks pointing into store.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Create a symlink at linkPath pointing to target.
|
|
6
|
+
* Ensures parent dir exists. Uses relative path when possible.
|
|
7
|
+
* If linkPath already exists and points to the same target, no-op.
|
|
8
|
+
* On Windows uses 'junction' for directory symlinks.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createSymlink(target: string, linkPath: string): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Remove symlinks in dir that point to a path under storePathRoot.
|
|
13
|
+
* Scans one directory level (does not recurse into subdirs).
|
|
14
|
+
*/
|
|
15
|
+
export declare function removeSymlinksInDirPointingUnder(dir: string, storePathRoot: string): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=symlink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symlink.d.ts","sourceRoot":"","sources":["../../src/lib/symlink.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBnF;AAED;;;GAGG;AACH,wBAAsB,gCAAgC,CACpD,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAuBf"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symlink helpers for marketplace install: create symlinks, remove symlinks pointing into store.
|
|
3
|
+
*/
|
|
4
|
+
import { symlink, readlink, lstat, rm, mkdir } from 'fs/promises';
|
|
5
|
+
import { dirname, resolve, relative, join, sep } from 'path';
|
|
6
|
+
import { platform } from 'os';
|
|
7
|
+
/**
|
|
8
|
+
* Create a symlink at linkPath pointing to target.
|
|
9
|
+
* Ensures parent dir exists. Uses relative path when possible.
|
|
10
|
+
* If linkPath already exists and points to the same target, no-op.
|
|
11
|
+
* On Windows uses 'junction' for directory symlinks.
|
|
12
|
+
*/
|
|
13
|
+
export async function createSymlink(target, linkPath) {
|
|
14
|
+
const resolvedTarget = resolve(target);
|
|
15
|
+
const linkDir = dirname(linkPath);
|
|
16
|
+
await mkdir(linkDir, { recursive: true });
|
|
17
|
+
try {
|
|
18
|
+
const stats = await lstat(linkPath);
|
|
19
|
+
if (stats.isSymbolicLink()) {
|
|
20
|
+
const existing = await readlink(linkPath);
|
|
21
|
+
const resolvedExisting = resolve(linkDir, existing);
|
|
22
|
+
if (resolve(resolvedExisting) === resolvedTarget)
|
|
23
|
+
return;
|
|
24
|
+
await rm(linkPath);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
await rm(linkPath, { recursive: true, force: true });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// ENOENT or other: proceed to create
|
|
32
|
+
}
|
|
33
|
+
const relativePath = relative(linkDir, resolvedTarget);
|
|
34
|
+
const symlinkType = platform() === 'win32' ? 'junction' : undefined;
|
|
35
|
+
await symlink(relativePath, linkPath, symlinkType);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Remove symlinks in dir that point to a path under storePathRoot.
|
|
39
|
+
* Scans one directory level (does not recurse into subdirs).
|
|
40
|
+
*/
|
|
41
|
+
export async function removeSymlinksInDirPointingUnder(dir, storePathRoot) {
|
|
42
|
+
const normalizedStore = resolve(storePathRoot);
|
|
43
|
+
try {
|
|
44
|
+
const { readdir } = await import('fs/promises');
|
|
45
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
46
|
+
for (const e of entries) {
|
|
47
|
+
const linkPath = join(dir, e.name);
|
|
48
|
+
try {
|
|
49
|
+
const st = await lstat(linkPath);
|
|
50
|
+
if (!st.isSymbolicLink())
|
|
51
|
+
continue;
|
|
52
|
+
const target = await readlink(linkPath);
|
|
53
|
+
const resolvedTarget = resolve(dirname(linkPath), target);
|
|
54
|
+
const normalizedTarget = resolve(resolvedTarget);
|
|
55
|
+
if (normalizedTarget === normalizedStore || normalizedTarget.startsWith(normalizedStore + sep)) {
|
|
56
|
+
await rm(linkPath);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// ignore per-entry errors
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// dir does not exist or not readable
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=symlink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symlink.js","sourceRoot":"","sources":["../../src/lib/symlink.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for agents-pkg (marketplace-only).
|
|
3
|
+
*/
|
|
4
|
+
/** Tracked marketplace: name, source (user-passed), version from manifest, installed plugin names. */
|
|
5
|
+
export interface MarketplaceEntry {
|
|
6
|
+
name: string;
|
|
7
|
+
source: string;
|
|
8
|
+
version: string;
|
|
9
|
+
pluginNames: string[];
|
|
10
|
+
updatedAt: string;
|
|
11
|
+
}
|
|
12
|
+
export interface LockFile {
|
|
13
|
+
version: number;
|
|
14
|
+
/** Marketplaces tracked for update (key = marketplace name). */
|
|
15
|
+
marketplaces: Record<string, MarketplaceEntry>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,sGAAsG;AACtG,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAChD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/update.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAgD/C"}
|