@nextclaw/service 0.2.3 → 0.2.5
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/cli/commands/skills/index.d.ts +2 -1
- package/dist/cli/commands/skills/index.d.ts.map +1 -1
- package/dist/cli/commands/skills/index.js +22 -1
- package/dist/cli/commands/skills/index.js.map +1 -1
- package/dist/cli/commands/skills/marketplace-client.d.ts +10 -6
- package/dist/cli/commands/skills/marketplace-client.d.ts.map +1 -1
- package/dist/cli/commands/skills/marketplace-client.js +14 -1
- package/dist/cli/commands/skills/marketplace-client.js.map +1 -1
- package/dist/cli/commands/skills/marketplace.utils.d.ts +2 -15
- package/dist/cli/commands/skills/marketplace.utils.d.ts.map +1 -1
- package/dist/cli/commands/skills/marketplace.utils.js +6 -133
- package/dist/cli/commands/skills/marketplace.utils.js.map +1 -1
- package/dist/cli/commands/skills/stores/marketplace-install-state.store.d.ts +39 -0
- package/dist/cli/commands/skills/stores/marketplace-install-state.store.d.ts.map +1 -0
- package/dist/cli/commands/skills/stores/marketplace-install-state.store.js +60 -0
- package/dist/cli/commands/skills/stores/marketplace-install-state.store.js.map +1 -0
- package/dist/cli/commands/skills/utils/marketplace-skill-lifecycle.utils.d.ts +27 -0
- package/dist/cli/commands/skills/utils/marketplace-skill-lifecycle.utils.d.ts.map +1 -0
- package/dist/cli/commands/skills/utils/marketplace-skill-lifecycle.utils.js +206 -0
- package/dist/cli/commands/skills/utils/marketplace-skill-lifecycle.utils.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/shared/services/marketplace/service-marketplace-installer.service.d.ts +1 -0
- package/dist/shared/services/marketplace/service-marketplace-installer.service.d.ts.map +1 -1
- package/dist/shared/services/marketplace/service-marketplace-installer.service.js +24 -11
- package/dist/shared/services/marketplace/service-marketplace-installer.service.js.map +1 -1
- package/dist/shared/types/cli.types.d.ts +8 -1
- package/dist/shared/types/cli.types.d.ts.map +1 -1
- package/dist/shared/utils/marketplace/service-marketplace-helpers.utils.d.ts +6 -1
- package/dist/shared/utils/marketplace/service-marketplace-helpers.utils.d.ts.map +1 -1
- package/dist/shared/utils/marketplace/service-marketplace-helpers.utils.js +13 -1
- package/dist/shared/utils/marketplace/service-marketplace-helpers.utils.js.map +1 -1
- package/package.json +25 -25
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
//#region src/cli/commands/skills/stores/marketplace-install-state.store.ts
|
|
5
|
+
const MARKETPLACE_INSTALL_STATE_FILE = ".nextclaw-install.json";
|
|
6
|
+
const LEGACY_MARKETPLACE_INSTALL_STATE_FILE = ".nextclaw-marketplace.json";
|
|
7
|
+
function hashMarketplaceFileBytes(bytes) {
|
|
8
|
+
return createHash("sha256").update(bytes).digest("hex");
|
|
9
|
+
}
|
|
10
|
+
function isLocalMarketplaceInstallStateFile(path) {
|
|
11
|
+
const normalized = normalizeMarketplaceRelativePath(path);
|
|
12
|
+
return normalized === ".nextclaw-install.json" || normalized === LEGACY_MARKETPLACE_INSTALL_STATE_FILE;
|
|
13
|
+
}
|
|
14
|
+
function buildMarketplaceSkillInstallState(params) {
|
|
15
|
+
const { apiBase, files, item } = params;
|
|
16
|
+
return {
|
|
17
|
+
schemaVersion: 1,
|
|
18
|
+
type: "skill",
|
|
19
|
+
source: "marketplace",
|
|
20
|
+
slug: item.slug,
|
|
21
|
+
packageName: item.packageName,
|
|
22
|
+
apiBaseUrl: apiBase,
|
|
23
|
+
installedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
24
|
+
marketplaceUpdatedAt: item.updatedAt,
|
|
25
|
+
files
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function writeMarketplaceSkillInstallState(params) {
|
|
29
|
+
const { destinationDir, state } = params;
|
|
30
|
+
writeFileSync(join(destinationDir, MARKETPLACE_INSTALL_STATE_FILE), `${JSON.stringify(state, null, 2)}\n`);
|
|
31
|
+
}
|
|
32
|
+
function readMarketplaceSkillInstallState(destinationDir) {
|
|
33
|
+
const statePath = [MARKETPLACE_INSTALL_STATE_FILE, LEGACY_MARKETPLACE_INSTALL_STATE_FILE].map((file) => join(destinationDir, file)).find((path) => existsSync(path));
|
|
34
|
+
if (!statePath) return null;
|
|
35
|
+
try {
|
|
36
|
+
const parsed = JSON.parse(readFileSync(statePath, "utf8"));
|
|
37
|
+
if (parsed.schemaVersion !== 1 || parsed.type !== "skill" || parsed.source !== "marketplace" || typeof parsed.slug !== "string" || !Array.isArray(parsed.files)) return null;
|
|
38
|
+
return parsed;
|
|
39
|
+
} catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function hasLocalMarketplaceSkillDrift(destinationDir, state) {
|
|
44
|
+
return state.files.some((file) => {
|
|
45
|
+
const targetPath = resolve(destinationDir, ...file.path.split("/"));
|
|
46
|
+
if (!existsSync(targetPath)) return true;
|
|
47
|
+
return hashMarketplaceFileBytes(readFileSync(targetPath)) !== file.sha256;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function resolveMarketplaceSkillUpdateStatus(state, remoteUpdatedAt) {
|
|
51
|
+
if (!state || !state.marketplaceUpdatedAt || !remoteUpdatedAt) return "unknown";
|
|
52
|
+
return Date.parse(remoteUpdatedAt) > Date.parse(state.marketplaceUpdatedAt) ? "outdated" : "up-to-date";
|
|
53
|
+
}
|
|
54
|
+
function normalizeMarketplaceRelativePath(path) {
|
|
55
|
+
return path.replace(/\\/g, "/");
|
|
56
|
+
}
|
|
57
|
+
//#endregion
|
|
58
|
+
export { MARKETPLACE_INSTALL_STATE_FILE, buildMarketplaceSkillInstallState, hasLocalMarketplaceSkillDrift, hashMarketplaceFileBytes, isLocalMarketplaceInstallStateFile, readMarketplaceSkillInstallState, resolveMarketplaceSkillUpdateStatus, writeMarketplaceSkillInstallState };
|
|
59
|
+
|
|
60
|
+
//# sourceMappingURL=marketplace-install-state.store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace-install-state.store.js","names":[],"sources":["../../../../../src/cli/commands/skills/stores/marketplace-install-state.store.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\n\nexport type MarketplaceSkillUpdateStatus = \"outdated\" | \"up-to-date\" | \"unknown\";\n\nexport const MARKETPLACE_INSTALL_STATE_FILE = \".nextclaw-install.json\";\nconst LEGACY_MARKETPLACE_INSTALL_STATE_FILE = \".nextclaw-marketplace.json\";\n\nexport type MarketplaceSkillInstallStateFileEntry = {\n path: string;\n sha256: string;\n};\n\nexport type MarketplaceSkillInstallState = {\n schemaVersion: 1;\n type: \"skill\";\n source: \"marketplace\";\n slug: string;\n packageName?: string;\n apiBaseUrl: string;\n installedAt: string;\n marketplaceUpdatedAt?: string;\n files: MarketplaceSkillInstallStateFileEntry[];\n};\n\nexport function hashMarketplaceFileBytes(bytes: Buffer): string {\n return createHash(\"sha256\").update(bytes).digest(\"hex\");\n}\n\nexport function isLocalMarketplaceInstallStateFile(path: string): boolean {\n const normalized = normalizeMarketplaceRelativePath(path);\n return normalized === MARKETPLACE_INSTALL_STATE_FILE || normalized === LEGACY_MARKETPLACE_INSTALL_STATE_FILE;\n}\n\nexport function buildMarketplaceSkillInstallState(params: {\n item: {\n slug: string;\n packageName?: string;\n updatedAt?: string;\n };\n apiBase: string;\n files: MarketplaceSkillInstallStateFileEntry[];\n}): MarketplaceSkillInstallState {\n const { apiBase, files, item } = params;\n return {\n schemaVersion: 1,\n type: \"skill\",\n source: \"marketplace\",\n slug: item.slug,\n packageName: item.packageName,\n apiBaseUrl: apiBase,\n installedAt: new Date().toISOString(),\n marketplaceUpdatedAt: item.updatedAt,\n files,\n };\n}\n\nexport function writeMarketplaceSkillInstallState(params: {\n destinationDir: string;\n state: MarketplaceSkillInstallState;\n}): void {\n const { destinationDir, state } = params;\n writeFileSync(\n join(destinationDir, MARKETPLACE_INSTALL_STATE_FILE),\n `${JSON.stringify(state, null, 2)}\\n`\n );\n}\n\nexport function readMarketplaceSkillInstallState(destinationDir: string): MarketplaceSkillInstallState | null {\n const statePath = [MARKETPLACE_INSTALL_STATE_FILE, LEGACY_MARKETPLACE_INSTALL_STATE_FILE]\n .map((file) => join(destinationDir, file))\n .find((path) => existsSync(path));\n if (!statePath) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(readFileSync(statePath, \"utf8\")) as Partial<MarketplaceSkillInstallState>;\n if (\n parsed.schemaVersion !== 1\n || parsed.type !== \"skill\"\n || parsed.source !== \"marketplace\"\n || typeof parsed.slug !== \"string\"\n || !Array.isArray(parsed.files)\n ) {\n return null;\n }\n return parsed as MarketplaceSkillInstallState;\n } catch {\n return null;\n }\n}\n\nexport function hasLocalMarketplaceSkillDrift(destinationDir: string, state: MarketplaceSkillInstallState): boolean {\n return state.files.some((file) => {\n const targetPath = resolve(destinationDir, ...file.path.split(\"/\"));\n if (!existsSync(targetPath)) {\n return true;\n }\n return hashMarketplaceFileBytes(readFileSync(targetPath)) !== file.sha256;\n });\n}\n\nexport function resolveMarketplaceSkillUpdateStatus(\n state: MarketplaceSkillInstallState | null,\n remoteUpdatedAt: string | undefined\n): MarketplaceSkillUpdateStatus {\n if (!state || !state.marketplaceUpdatedAt || !remoteUpdatedAt) {\n return \"unknown\";\n }\n return Date.parse(remoteUpdatedAt) > Date.parse(state.marketplaceUpdatedAt)\n ? \"outdated\"\n : \"up-to-date\";\n}\n\nfunction normalizeMarketplaceRelativePath(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n"],"mappings":";;;;AAMA,MAAa,iCAAiC;AAC9C,MAAM,wCAAwC;AAmB9C,SAAgB,yBAAyB,OAAuB;AAC9D,QAAO,WAAW,SAAS,CAAC,OAAO,MAAM,CAAC,OAAO,MAAM;;AAGzD,SAAgB,mCAAmC,MAAuB;CACxE,MAAM,aAAa,iCAAiC,KAAK;AACzD,QAAO,eAAA,4BAAiD,eAAe;;AAGzE,SAAgB,kCAAkC,QAQjB;CAC/B,MAAM,EAAE,SAAS,OAAO,SAAS;AACjC,QAAO;EACL,eAAe;EACf,MAAM;EACN,QAAQ;EACR,MAAM,KAAK;EACX,aAAa,KAAK;EAClB,YAAY;EACZ,8BAAa,IAAI,MAAM,EAAC,aAAa;EACrC,sBAAsB,KAAK;EAC3B;EACD;;AAGH,SAAgB,kCAAkC,QAGzC;CACP,MAAM,EAAE,gBAAgB,UAAU;AAClC,eACE,KAAK,gBAAgB,+BAA+B,EACpD,GAAG,KAAK,UAAU,OAAO,MAAM,EAAE,CAAC,IACnC;;AAGH,SAAgB,iCAAiC,gBAA6D;CAC5G,MAAM,YAAY,CAAC,gCAAgC,sCAAsC,CACtF,KAAK,SAAS,KAAK,gBAAgB,KAAK,CAAC,CACzC,MAAM,SAAS,WAAW,KAAK,CAAC;AACnC,KAAI,CAAC,UACH,QAAO;AAGT,KAAI;EACF,MAAM,SAAS,KAAK,MAAM,aAAa,WAAW,OAAO,CAAC;AAC1D,MACE,OAAO,kBAAkB,KACtB,OAAO,SAAS,WAChB,OAAO,WAAW,iBAClB,OAAO,OAAO,SAAS,YACvB,CAAC,MAAM,QAAQ,OAAO,MAAM,CAE/B,QAAO;AAET,SAAO;SACD;AACN,SAAO;;;AAIX,SAAgB,8BAA8B,gBAAwB,OAA8C;AAClH,QAAO,MAAM,MAAM,MAAM,SAAS;EAChC,MAAM,aAAa,QAAQ,gBAAgB,GAAG,KAAK,KAAK,MAAM,IAAI,CAAC;AACnE,MAAI,CAAC,WAAW,WAAW,CACzB,QAAO;AAET,SAAO,yBAAyB,aAAa,WAAW,CAAC,KAAK,KAAK;GACnE;;AAGJ,SAAgB,oCACd,OACA,iBAC8B;AAC9B,KAAI,CAAC,SAAS,CAAC,MAAM,wBAAwB,CAAC,gBAC5C,QAAO;AAET,QAAO,KAAK,MAAM,gBAAgB,GAAG,KAAK,MAAM,MAAM,qBAAqB,GACvE,aACA;;AAGN,SAAS,iCAAiC,MAAsB;AAC9D,QAAO,KAAK,QAAQ,OAAO,IAAI"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { MarketplaceSkillUpdateStatus } from "../stores/marketplace-install-state.store.js";
|
|
2
|
+
|
|
3
|
+
//#region src/cli/commands/skills/utils/marketplace-skill-lifecycle.utils.d.ts
|
|
4
|
+
type MarketplaceSkillInstallKind = "builtin" | "marketplace";
|
|
5
|
+
type MarketplaceSkillInstallOptions = {
|
|
6
|
+
slug: string;
|
|
7
|
+
workdir: string;
|
|
8
|
+
dir?: string;
|
|
9
|
+
force?: boolean;
|
|
10
|
+
apiBaseUrl?: string;
|
|
11
|
+
};
|
|
12
|
+
declare function installMarketplaceSkill(options: MarketplaceSkillInstallOptions): Promise<{
|
|
13
|
+
slug: string;
|
|
14
|
+
destinationDir: string;
|
|
15
|
+
alreadyInstalled?: boolean;
|
|
16
|
+
source: MarketplaceSkillInstallKind;
|
|
17
|
+
}>;
|
|
18
|
+
declare function updateInstalledMarketplaceSkill(options: MarketplaceSkillInstallOptions): Promise<{
|
|
19
|
+
slug: string;
|
|
20
|
+
destinationDir: string;
|
|
21
|
+
updated: boolean;
|
|
22
|
+
source: MarketplaceSkillInstallKind;
|
|
23
|
+
status: MarketplaceSkillUpdateStatus;
|
|
24
|
+
}>;
|
|
25
|
+
//#endregion
|
|
26
|
+
export { MarketplaceSkillInstallOptions, installMarketplaceSkill, updateInstalledMarketplaceSkill };
|
|
27
|
+
//# sourceMappingURL=marketplace-skill-lifecycle.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace-skill-lifecycle.utils.d.ts","names":[],"sources":["../../../../../src/cli/commands/skills/utils/marketplace-skill-lifecycle.utils.ts"],"mappings":";;;KAsBK,2BAAA;AAAA,KAEO,8BAAA;EACV,IAAA;EACA,OAAA;EACA,GAAA;EACA,KAAA;EACA,UAAA;AAAA;AAAA,iBAGoB,uBAAA,CAAwB,OAAA,EAAS,8BAAA,GAAiC,OAAA;EACtF,IAAA;EACA,cAAA;EACA,gBAAA;EACA,MAAA,EAAQ,2BAAA;AAAA;AAAA,iBAyDY,+BAAA,CAAgC,OAAA,EAAS,8BAAA,GAAiC,OAAA;EAC9F,IAAA;EACA,cAAA;EACA,OAAA;EACA,MAAA,EAAQ,2BAAA;EACR,MAAA,EAAQ,4BAAA;AAAA"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { buildMarketplaceSkillInstallState, hasLocalMarketplaceSkillDrift, isLocalMarketplaceInstallStateFile, readMarketplaceSkillInstallState, resolveMarketplaceSkillUpdateStatus, writeMarketplaceSkillInstallState } from "../stores/marketplace-install-state.store.js";
|
|
2
|
+
import { fetchMarketplaceSkillFiles, fetchMarketplaceSkillItem, resolveMarketplaceApiBase, writeMarketplaceSkillFiles } from "../marketplace-client.js";
|
|
3
|
+
import { validateSkillSelector } from "../marketplace-identity.utils.js";
|
|
4
|
+
import { DEFAULT_SKILLS_DIR } from "@nextclaw/core";
|
|
5
|
+
import { SkillManager } from "@nextclaw/kernel";
|
|
6
|
+
import { existsSync, mkdirSync, readdirSync, rmSync } from "node:fs";
|
|
7
|
+
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
8
|
+
//#region src/cli/commands/skills/utils/marketplace-skill-lifecycle.utils.ts
|
|
9
|
+
async function installMarketplaceSkill(options) {
|
|
10
|
+
const { slug, workdir: rawWorkdir, dir, force, apiBaseUrl } = options;
|
|
11
|
+
const selector = validateSkillSelector(slug.trim(), "slug");
|
|
12
|
+
const workdir = resolve(rawWorkdir);
|
|
13
|
+
if (!existsSync(workdir)) throw new Error(`Workdir does not exist: ${workdir}`);
|
|
14
|
+
const apiBase = resolveMarketplaceApiBase(apiBaseUrl);
|
|
15
|
+
const item = await fetchMarketplaceSkillItem(apiBase, selector);
|
|
16
|
+
const installSlug = item.slug;
|
|
17
|
+
const resolvedSlug = item.packageName || item.slug;
|
|
18
|
+
const destinationDir = resolveMarketplaceSkillDestinationDir({
|
|
19
|
+
workdir,
|
|
20
|
+
slug: installSlug,
|
|
21
|
+
dir
|
|
22
|
+
});
|
|
23
|
+
if (item.install.kind === "builtin") {
|
|
24
|
+
const builtinResult = resolveBuiltinMarketplaceInstallResult({
|
|
25
|
+
workdir,
|
|
26
|
+
slug: installSlug
|
|
27
|
+
});
|
|
28
|
+
builtinResult.slug = resolvedSlug;
|
|
29
|
+
return builtinResult;
|
|
30
|
+
}
|
|
31
|
+
const filesPayload = await fetchMarketplaceSkillFiles(apiBase, selector);
|
|
32
|
+
const existingInstall = prepareMarketplaceSkillDestinationDir({
|
|
33
|
+
destinationDir,
|
|
34
|
+
files: filesPayload.files,
|
|
35
|
+
force,
|
|
36
|
+
slug: installSlug
|
|
37
|
+
});
|
|
38
|
+
if (existingInstall) {
|
|
39
|
+
existingInstall.slug = resolvedSlug;
|
|
40
|
+
return existingInstall;
|
|
41
|
+
}
|
|
42
|
+
const writtenFiles = await writeMarketplaceSkillFiles({
|
|
43
|
+
destinationDir,
|
|
44
|
+
files: filesPayload.files,
|
|
45
|
+
apiBase,
|
|
46
|
+
slug: selector
|
|
47
|
+
});
|
|
48
|
+
ensureInstalledMarketplaceSkill(destinationDir, installSlug);
|
|
49
|
+
writeMarketplaceSkillInstallState({
|
|
50
|
+
destinationDir,
|
|
51
|
+
state: buildMarketplaceSkillInstallState({
|
|
52
|
+
item,
|
|
53
|
+
apiBase,
|
|
54
|
+
files: writtenFiles
|
|
55
|
+
})
|
|
56
|
+
});
|
|
57
|
+
return buildMarketplaceInstallResult(resolvedSlug, destinationDir);
|
|
58
|
+
}
|
|
59
|
+
async function updateInstalledMarketplaceSkill(options) {
|
|
60
|
+
const { slug, workdir: rawWorkdir, dir, force, apiBaseUrl } = options;
|
|
61
|
+
const selector = validateSkillSelector(slug.trim(), "slug");
|
|
62
|
+
const workdir = resolve(rawWorkdir);
|
|
63
|
+
if (!existsSync(workdir)) throw new Error(`Workdir does not exist: ${workdir}`);
|
|
64
|
+
const apiBase = resolveMarketplaceApiBase(apiBaseUrl);
|
|
65
|
+
const item = await fetchMarketplaceSkillItem(apiBase, selector);
|
|
66
|
+
const destinationDir = resolveMarketplaceSkillDestinationDir({
|
|
67
|
+
workdir,
|
|
68
|
+
slug: item.slug,
|
|
69
|
+
dir
|
|
70
|
+
});
|
|
71
|
+
if (item.install.kind === "builtin") return {
|
|
72
|
+
slug: item.packageName || item.slug,
|
|
73
|
+
destinationDir: resolveBuiltinSkillDir(workdir, item.slug),
|
|
74
|
+
updated: false,
|
|
75
|
+
source: "builtin",
|
|
76
|
+
status: "up-to-date"
|
|
77
|
+
};
|
|
78
|
+
if (!existsSync(destinationDir)) throw new Error(`Marketplace skill is not installed: ${item.slug}`);
|
|
79
|
+
const currentState = readMarketplaceSkillInstallState(destinationDir);
|
|
80
|
+
if (!currentState && !force) throw new Error(`Missing marketplace install state for ${item.slug}; use --force to replace this skill from marketplace.`);
|
|
81
|
+
if (!force && currentState && hasLocalMarketplaceSkillDrift(destinationDir, currentState)) throw new Error(`Local skill files changed since install: ${item.slug}; use --force to overwrite local changes.`);
|
|
82
|
+
const status = resolveMarketplaceSkillUpdateStatus(currentState, item.updatedAt);
|
|
83
|
+
if (!force && status === "up-to-date") return {
|
|
84
|
+
slug: item.packageName || item.slug,
|
|
85
|
+
destinationDir,
|
|
86
|
+
updated: false,
|
|
87
|
+
source: "marketplace",
|
|
88
|
+
status
|
|
89
|
+
};
|
|
90
|
+
const filesPayload = await fetchMarketplaceSkillFiles(apiBase, selector);
|
|
91
|
+
rmSync(destinationDir, {
|
|
92
|
+
recursive: true,
|
|
93
|
+
force: true
|
|
94
|
+
});
|
|
95
|
+
mkdirSync(destinationDir, { recursive: true });
|
|
96
|
+
const writtenFiles = await writeMarketplaceSkillFiles({
|
|
97
|
+
destinationDir,
|
|
98
|
+
files: filesPayload.files,
|
|
99
|
+
apiBase,
|
|
100
|
+
slug: selector
|
|
101
|
+
});
|
|
102
|
+
ensureInstalledMarketplaceSkill(destinationDir, item.slug);
|
|
103
|
+
writeMarketplaceSkillInstallState({
|
|
104
|
+
destinationDir,
|
|
105
|
+
state: buildMarketplaceSkillInstallState({
|
|
106
|
+
item,
|
|
107
|
+
apiBase,
|
|
108
|
+
files: writtenFiles
|
|
109
|
+
})
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
slug: item.packageName || item.slug,
|
|
113
|
+
destinationDir,
|
|
114
|
+
updated: true,
|
|
115
|
+
source: "marketplace",
|
|
116
|
+
status: "up-to-date"
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function resolveMarketplaceSkillDestinationDir(params) {
|
|
120
|
+
const { workdir, slug, dir } = params;
|
|
121
|
+
const dirName = dir?.trim() || DEFAULT_SKILLS_DIR;
|
|
122
|
+
return isAbsolute(dirName) ? resolve(dirName, slug) : resolve(workdir, dirName, slug);
|
|
123
|
+
}
|
|
124
|
+
function resolveBuiltinMarketplaceInstallResult(params) {
|
|
125
|
+
return {
|
|
126
|
+
slug: params.slug,
|
|
127
|
+
destinationDir: resolveBuiltinSkillDir(params.workdir, params.slug),
|
|
128
|
+
alreadyInstalled: true,
|
|
129
|
+
source: "builtin"
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function prepareMarketplaceSkillDestinationDir(params) {
|
|
133
|
+
const { destinationDir, files, force, slug } = params;
|
|
134
|
+
if (!force && existsSync(destinationDir)) {
|
|
135
|
+
const existingDirState = inspectMarketplaceSkillDirectory(destinationDir, files);
|
|
136
|
+
if (existingDirState === "installed") return {
|
|
137
|
+
slug,
|
|
138
|
+
destinationDir,
|
|
139
|
+
alreadyInstalled: true,
|
|
140
|
+
source: "marketplace"
|
|
141
|
+
};
|
|
142
|
+
if (existingDirState !== "recoverable") throw new Error(`Skill directory already exists: ${destinationDir} (use --force)`);
|
|
143
|
+
rmSync(destinationDir, {
|
|
144
|
+
recursive: true,
|
|
145
|
+
force: true
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
if (force && existsSync(destinationDir)) rmSync(destinationDir, {
|
|
149
|
+
recursive: true,
|
|
150
|
+
force: true
|
|
151
|
+
});
|
|
152
|
+
mkdirSync(destinationDir, { recursive: true });
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
function ensureInstalledMarketplaceSkill(destinationDir, slug) {
|
|
156
|
+
if (!existsSync(join(destinationDir, "SKILL.md"))) throw new Error(`Marketplace skill ${slug} does not include SKILL.md`);
|
|
157
|
+
}
|
|
158
|
+
function buildMarketplaceInstallResult(slug, destinationDir) {
|
|
159
|
+
return {
|
|
160
|
+
slug,
|
|
161
|
+
destinationDir,
|
|
162
|
+
source: "marketplace"
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function inspectMarketplaceSkillDirectory(destinationDir, files) {
|
|
166
|
+
if (existsSync(join(destinationDir, "SKILL.md"))) return "installed";
|
|
167
|
+
const discoveredFiles = collectRelativeFiles(destinationDir);
|
|
168
|
+
if (discoveredFiles === null) return "conflict";
|
|
169
|
+
const relevantFiles = discoveredFiles.filter((file) => !isIgnorableMarketplaceResidue(file));
|
|
170
|
+
if (relevantFiles.length === 0) return "recoverable";
|
|
171
|
+
const manifestPaths = new Set(files.map((file) => normalizeMarketplaceRelativePath(file.path)));
|
|
172
|
+
return relevantFiles.every((file) => manifestPaths.has(normalizeMarketplaceRelativePath(file))) ? "recoverable" : "conflict";
|
|
173
|
+
}
|
|
174
|
+
function collectRelativeFiles(rootDir) {
|
|
175
|
+
const output = [];
|
|
176
|
+
const walk = (dir) => {
|
|
177
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
178
|
+
for (const entry of entries) {
|
|
179
|
+
const absolute = join(dir, entry.name);
|
|
180
|
+
if (entry.isDirectory()) {
|
|
181
|
+
if (!walk(absolute)) return false;
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (!entry.isFile()) return false;
|
|
185
|
+
const relativePath = relative(rootDir, absolute);
|
|
186
|
+
output.push(normalizeMarketplaceRelativePath(relativePath));
|
|
187
|
+
}
|
|
188
|
+
return true;
|
|
189
|
+
};
|
|
190
|
+
return walk(rootDir) ? output : null;
|
|
191
|
+
}
|
|
192
|
+
function normalizeMarketplaceRelativePath(path) {
|
|
193
|
+
return path.replace(/\\/g, "/");
|
|
194
|
+
}
|
|
195
|
+
function isIgnorableMarketplaceResidue(path) {
|
|
196
|
+
return path === ".DS_Store" || isLocalMarketplaceInstallStateFile(path);
|
|
197
|
+
}
|
|
198
|
+
function resolveBuiltinSkillDir(workdir, skillName) {
|
|
199
|
+
const skillDir = new SkillManager({ workspace: workdir }).resolveBuiltinSkillDir(skillName);
|
|
200
|
+
if (!skillDir) throw new Error(`Built-in skill not found in local installation: ${skillName}`);
|
|
201
|
+
return skillDir;
|
|
202
|
+
}
|
|
203
|
+
//#endregion
|
|
204
|
+
export { installMarketplaceSkill, updateInstalledMarketplaceSkill };
|
|
205
|
+
|
|
206
|
+
//# sourceMappingURL=marketplace-skill-lifecycle.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace-skill-lifecycle.utils.js","names":[],"sources":["../../../../../src/cli/commands/skills/utils/marketplace-skill-lifecycle.utils.ts"],"sourcesContent":["import { existsSync, mkdirSync, readdirSync, rmSync } from \"node:fs\";\nimport { isAbsolute, join, relative, resolve } from \"node:path\";\nimport { DEFAULT_SKILLS_DIR } from \"@nextclaw/core\";\nimport { SkillManager } from \"@nextclaw/kernel\";\nimport {\n fetchMarketplaceSkillFiles,\n fetchMarketplaceSkillItem,\n resolveMarketplaceApiBase,\n type MarketplaceSkillFileManifestEntry,\n writeMarketplaceSkillFiles\n} from \"../marketplace-client.js\";\nimport {\n buildMarketplaceSkillInstallState,\n hasLocalMarketplaceSkillDrift,\n isLocalMarketplaceInstallStateFile,\n readMarketplaceSkillInstallState,\n resolveMarketplaceSkillUpdateStatus,\n type MarketplaceSkillUpdateStatus,\n writeMarketplaceSkillInstallState\n} from \"../stores/marketplace-install-state.store.js\";\nimport { validateSkillSelector } from \"../marketplace-identity.utils.js\";\n\ntype MarketplaceSkillInstallKind = \"builtin\" | \"marketplace\";\n\nexport type MarketplaceSkillInstallOptions = {\n slug: string;\n workdir: string;\n dir?: string;\n force?: boolean;\n apiBaseUrl?: string;\n};\n\nexport async function installMarketplaceSkill(options: MarketplaceSkillInstallOptions): Promise<{\n slug: string;\n destinationDir: string;\n alreadyInstalled?: boolean;\n source: MarketplaceSkillInstallKind;\n}> {\n const { slug, workdir: rawWorkdir, dir, force, apiBaseUrl } = options;\n const selector = validateSkillSelector(slug.trim(), \"slug\");\n const workdir = resolve(rawWorkdir);\n if (!existsSync(workdir)) {\n throw new Error(`Workdir does not exist: ${workdir}`);\n }\n\n const apiBase = resolveMarketplaceApiBase(apiBaseUrl);\n const item = await fetchMarketplaceSkillItem(apiBase, selector);\n const installSlug = item.slug;\n const resolvedSlug = item.packageName || item.slug;\n const destinationDir = resolveMarketplaceSkillDestinationDir({\n workdir,\n slug: installSlug,\n dir,\n });\n\n if (item.install.kind === \"builtin\") {\n const builtinResult = resolveBuiltinMarketplaceInstallResult({\n workdir,\n slug: installSlug,\n });\n builtinResult.slug = resolvedSlug;\n return builtinResult;\n }\n\n const filesPayload = await fetchMarketplaceSkillFiles(apiBase, selector);\n const existingInstall = prepareMarketplaceSkillDestinationDir({\n destinationDir,\n files: filesPayload.files,\n force,\n slug: installSlug,\n });\n if (existingInstall) {\n existingInstall.slug = resolvedSlug;\n return existingInstall;\n }\n const writtenFiles = await writeMarketplaceSkillFiles({\n destinationDir,\n files: filesPayload.files,\n apiBase,\n slug: selector,\n });\n ensureInstalledMarketplaceSkill(destinationDir, installSlug);\n writeMarketplaceSkillInstallState({\n destinationDir,\n state: buildMarketplaceSkillInstallState({\n item,\n apiBase,\n files: writtenFiles,\n }),\n });\n return buildMarketplaceInstallResult(resolvedSlug, destinationDir);\n}\n\nexport async function updateInstalledMarketplaceSkill(options: MarketplaceSkillInstallOptions): Promise<{\n slug: string;\n destinationDir: string;\n updated: boolean;\n source: MarketplaceSkillInstallKind;\n status: MarketplaceSkillUpdateStatus;\n}> {\n const { slug, workdir: rawWorkdir, dir, force, apiBaseUrl } = options;\n const selector = validateSkillSelector(slug.trim(), \"slug\");\n const workdir = resolve(rawWorkdir);\n if (!existsSync(workdir)) {\n throw new Error(`Workdir does not exist: ${workdir}`);\n }\n\n const apiBase = resolveMarketplaceApiBase(apiBaseUrl);\n const item = await fetchMarketplaceSkillItem(apiBase, selector);\n const destinationDir = resolveMarketplaceSkillDestinationDir({\n workdir,\n slug: item.slug,\n dir,\n });\n\n if (item.install.kind === \"builtin\") {\n return {\n slug: item.packageName || item.slug,\n destinationDir: resolveBuiltinSkillDir(workdir, item.slug),\n updated: false,\n source: \"builtin\",\n status: \"up-to-date\",\n };\n }\n\n if (!existsSync(destinationDir)) {\n throw new Error(`Marketplace skill is not installed: ${item.slug}`);\n }\n\n const currentState = readMarketplaceSkillInstallState(destinationDir);\n if (!currentState && !force) {\n throw new Error(`Missing marketplace install state for ${item.slug}; use --force to replace this skill from marketplace.`);\n }\n\n if (!force && currentState && hasLocalMarketplaceSkillDrift(destinationDir, currentState)) {\n throw new Error(`Local skill files changed since install: ${item.slug}; use --force to overwrite local changes.`);\n }\n\n const status = resolveMarketplaceSkillUpdateStatus(currentState, item.updatedAt);\n if (!force && status === \"up-to-date\") {\n return {\n slug: item.packageName || item.slug,\n destinationDir,\n updated: false,\n source: \"marketplace\",\n status,\n };\n }\n\n const filesPayload = await fetchMarketplaceSkillFiles(apiBase, selector);\n rmSync(destinationDir, { recursive: true, force: true });\n mkdirSync(destinationDir, { recursive: true });\n const writtenFiles = await writeMarketplaceSkillFiles({\n destinationDir,\n files: filesPayload.files,\n apiBase,\n slug: selector,\n });\n ensureInstalledMarketplaceSkill(destinationDir, item.slug);\n writeMarketplaceSkillInstallState({\n destinationDir,\n state: buildMarketplaceSkillInstallState({\n item,\n apiBase,\n files: writtenFiles,\n }),\n });\n\n return {\n slug: item.packageName || item.slug,\n destinationDir,\n updated: true,\n source: \"marketplace\",\n status: \"up-to-date\",\n };\n}\n\nfunction resolveMarketplaceSkillDestinationDir(params: {\n workdir: string;\n slug: string;\n dir?: string;\n}): string {\n const { workdir, slug, dir } = params;\n const dirName = dir?.trim() || DEFAULT_SKILLS_DIR;\n return isAbsolute(dirName)\n ? resolve(dirName, slug)\n : resolve(workdir, dirName, slug);\n}\n\nfunction resolveBuiltinMarketplaceInstallResult(params: {\n workdir: string;\n slug: string;\n}): {\n slug: string;\n destinationDir: string;\n alreadyInstalled: true;\n source: \"builtin\";\n} {\n return {\n slug: params.slug,\n destinationDir: resolveBuiltinSkillDir(params.workdir, params.slug),\n alreadyInstalled: true,\n source: \"builtin\",\n };\n}\n\nfunction prepareMarketplaceSkillDestinationDir(params: {\n destinationDir: string;\n files: MarketplaceSkillFileManifestEntry[];\n force?: boolean;\n slug: string;\n}): {\n slug: string;\n destinationDir: string;\n alreadyInstalled: true;\n source: \"marketplace\";\n} | null {\n const { destinationDir, files, force, slug } = params;\n if (!force && existsSync(destinationDir)) {\n const existingDirState = inspectMarketplaceSkillDirectory(destinationDir, files);\n if (existingDirState === \"installed\") {\n return {\n slug,\n destinationDir,\n alreadyInstalled: true,\n source: \"marketplace\",\n };\n }\n if (existingDirState !== \"recoverable\") {\n throw new Error(`Skill directory already exists: ${destinationDir} (use --force)`);\n }\n rmSync(destinationDir, { recursive: true, force: true });\n }\n\n if (force && existsSync(destinationDir)) {\n rmSync(destinationDir, { recursive: true, force: true });\n }\n\n mkdirSync(destinationDir, { recursive: true });\n return null;\n}\n\nfunction ensureInstalledMarketplaceSkill(destinationDir: string, slug: string): void {\n if (!existsSync(join(destinationDir, \"SKILL.md\"))) {\n throw new Error(`Marketplace skill ${slug} does not include SKILL.md`);\n }\n}\n\nfunction buildMarketplaceInstallResult(slug: string, destinationDir: string): {\n slug: string;\n destinationDir: string;\n source: \"marketplace\";\n} {\n return {\n slug,\n destinationDir,\n source: \"marketplace\",\n };\n}\n\nfunction inspectMarketplaceSkillDirectory(\n destinationDir: string,\n files: MarketplaceSkillFileManifestEntry[]\n): \"installed\" | \"recoverable\" | \"conflict\" {\n if (existsSync(join(destinationDir, \"SKILL.md\"))) {\n return \"installed\";\n }\n\n const discoveredFiles = collectRelativeFiles(destinationDir);\n if (discoveredFiles === null) {\n return \"conflict\";\n }\n\n const relevantFiles = discoveredFiles.filter((file) => !isIgnorableMarketplaceResidue(file));\n if (relevantFiles.length === 0) {\n return \"recoverable\";\n }\n\n const manifestPaths = new Set(files.map((file) => normalizeMarketplaceRelativePath(file.path)));\n return relevantFiles.every((file) => manifestPaths.has(normalizeMarketplaceRelativePath(file)))\n ? \"recoverable\"\n : \"conflict\";\n}\n\nfunction collectRelativeFiles(rootDir: string): string[] | null {\n const output: string[] = [];\n const walk = (dir: string): boolean => {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const absolute = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (!walk(absolute)) {\n return false;\n }\n continue;\n }\n if (!entry.isFile()) {\n return false;\n }\n const relativePath = relative(rootDir, absolute);\n output.push(normalizeMarketplaceRelativePath(relativePath));\n }\n return true;\n };\n\n return walk(rootDir) ? output : null;\n}\n\nfunction normalizeMarketplaceRelativePath(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n\nfunction isIgnorableMarketplaceResidue(path: string): boolean {\n return path === \".DS_Store\" || isLocalMarketplaceInstallStateFile(path);\n}\n\nfunction resolveBuiltinSkillDir(workdir: string, skillName: string): string {\n const skillDir = new SkillManager({ workspace: workdir }).resolveBuiltinSkillDir(skillName);\n if (!skillDir) {\n throw new Error(`Built-in skill not found in local installation: ${skillName}`);\n }\n return skillDir;\n}\n"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { AccountCommandOptions, AccountSetUsernameCommandOptions, AgentCommandOptions, AgentsListCommandOptions, AgentsNewCommandOptions, AgentsRemoveCommandOptions, AgentsRuntimesCommandOptions, AgentsUpdateCommandOptions, ChannelsAddOptions, ChannelsListOptions, ChannelsLoginOptions, ConfigGetOptions, ConfigSetOptions, CronAddOptions, DoctorCommandOptions, GatewayCommandOptions, HealthProbe, LoginCommandOptions, LogsTailCommandOptions, MarketplaceSkillsRecommendCommandOptions, MarketplaceSkillsSearchCommandOptions, McpAddCommandOptions, McpDoctorOptions, McpListOptions, PluginsInfoOptions, PluginsInstallOptions, PluginsListOptions, PluginsUninstallOptions, RemoteConnectCommandOptions, RemoteDoctorCommandOptions, RemoteEnableCommandOptions, RemoteStatusCommandOptions, RequestRestartParams, RuntimeStatusReport, SecretsApplyOptions, SecretsAuditOptions, SecretsConfigureOptions, SecretsReloadOptions, ServiceAutostartCommandOptions, SkillsInfoCommandOptions, SkillsInstalledCommandOptions, StartCommandOptions, StatusCommandOptions, UiCommandOptions, UpdateCommandOptions, UsageCommandOptions } from "./shared/types/cli.types.js";
|
|
1
|
+
import { AccountCommandOptions, AccountSetUsernameCommandOptions, AgentCommandOptions, AgentsListCommandOptions, AgentsNewCommandOptions, AgentsRemoveCommandOptions, AgentsRuntimesCommandOptions, AgentsUpdateCommandOptions, ChannelsAddOptions, ChannelsListOptions, ChannelsLoginOptions, ConfigGetOptions, ConfigSetOptions, CronAddOptions, DoctorCommandOptions, GatewayCommandOptions, HealthProbe, LoginCommandOptions, LogsTailCommandOptions, MarketplaceSkillsRecommendCommandOptions, MarketplaceSkillsSearchCommandOptions, MarketplaceSkillsUpdateCommandOptions, McpAddCommandOptions, McpDoctorOptions, McpListOptions, PluginsInfoOptions, PluginsInstallOptions, PluginsListOptions, PluginsUninstallOptions, RemoteConnectCommandOptions, RemoteDoctorCommandOptions, RemoteEnableCommandOptions, RemoteStatusCommandOptions, RequestRestartParams, RuntimeStatusReport, SecretsApplyOptions, SecretsAuditOptions, SecretsConfigureOptions, SecretsReloadOptions, ServiceAutostartCommandOptions, SkillsInfoCommandOptions, SkillsInstalledCommandOptions, StartCommandOptions, StatusCommandOptions, UiCommandOptions, UpdateCommandOptions, UsageCommandOptions } from "./shared/types/cli.types.js";
|
|
2
2
|
import { NextclawServiceRuntime, NextclawServiceRuntimeOptions, runNextclawNpmRuntimeLauncher } from "./service-runtime.service.js";
|
|
3
3
|
import { NextclawDistribution } from "./shared/types/distribution.types.js";
|
|
4
4
|
import { NextclawDistributionService } from "./shared/services/runtime/nextclaw-distribution.service.js";
|
|
5
5
|
import { readLearningLoopRuntimeConfig } from "@nextclaw/kernel";
|
|
6
|
-
export { AccountCommandOptions, AccountSetUsernameCommandOptions, AgentCommandOptions, AgentsListCommandOptions, AgentsNewCommandOptions, AgentsRemoveCommandOptions, AgentsRuntimesCommandOptions, AgentsUpdateCommandOptions, ChannelsAddOptions, ChannelsListOptions, ChannelsLoginOptions, ConfigGetOptions, ConfigSetOptions, CronAddOptions, DoctorCommandOptions, GatewayCommandOptions, HealthProbe, LoginCommandOptions, LogsTailCommandOptions, MarketplaceSkillsRecommendCommandOptions, MarketplaceSkillsSearchCommandOptions, McpAddCommandOptions, McpDoctorOptions, McpListOptions, type NextclawDistribution, NextclawDistributionService, NextclawServiceRuntime, type NextclawServiceRuntimeOptions, PluginsInfoOptions, PluginsInstallOptions, PluginsListOptions, PluginsUninstallOptions, RemoteConnectCommandOptions, RemoteDoctorCommandOptions, RemoteEnableCommandOptions, RemoteStatusCommandOptions, RequestRestartParams, RuntimeStatusReport, SecretsApplyOptions, SecretsAuditOptions, SecretsConfigureOptions, SecretsReloadOptions, ServiceAutostartCommandOptions, SkillsInfoCommandOptions, SkillsInstalledCommandOptions, StartCommandOptions, StatusCommandOptions, UiCommandOptions, UpdateCommandOptions, UsageCommandOptions, readLearningLoopRuntimeConfig, runNextclawNpmRuntimeLauncher };
|
|
6
|
+
export { AccountCommandOptions, AccountSetUsernameCommandOptions, AgentCommandOptions, AgentsListCommandOptions, AgentsNewCommandOptions, AgentsRemoveCommandOptions, AgentsRuntimesCommandOptions, AgentsUpdateCommandOptions, ChannelsAddOptions, ChannelsListOptions, ChannelsLoginOptions, ConfigGetOptions, ConfigSetOptions, CronAddOptions, DoctorCommandOptions, GatewayCommandOptions, HealthProbe, LoginCommandOptions, LogsTailCommandOptions, MarketplaceSkillsRecommendCommandOptions, MarketplaceSkillsSearchCommandOptions, MarketplaceSkillsUpdateCommandOptions, McpAddCommandOptions, McpDoctorOptions, McpListOptions, type NextclawDistribution, NextclawDistributionService, NextclawServiceRuntime, type NextclawServiceRuntimeOptions, PluginsInfoOptions, PluginsInstallOptions, PluginsListOptions, PluginsUninstallOptions, RemoteConnectCommandOptions, RemoteDoctorCommandOptions, RemoteEnableCommandOptions, RemoteStatusCommandOptions, RequestRestartParams, RuntimeStatusReport, SecretsApplyOptions, SecretsAuditOptions, SecretsConfigureOptions, SecretsReloadOptions, ServiceAutostartCommandOptions, SkillsInfoCommandOptions, SkillsInstalledCommandOptions, StartCommandOptions, StatusCommandOptions, UiCommandOptions, UpdateCommandOptions, UsageCommandOptions, readLearningLoopRuntimeConfig, runNextclawNpmRuntimeLauncher };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-marketplace-installer.service.d.ts","names":[],"sources":["../../../../src/shared/services/marketplace/service-marketplace-installer.service.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"service-marketplace-installer.service.d.ts","names":[],"sources":["../../../../src/shared/services/marketplace/service-marketplace-installer.service.ts"],"mappings":";;;KAgBK,gBAAA;EACH,OAAA;EACA,MAAA;AAAA;AAAA,KAGG,yBAAA,GAA4B,gBAAA;AAAA,cAEpB,2BAAA;EAAA,iBAEQ,IAAA;cAAA,IAAA;IACf,qBAAA,SAA8B,OAAA;IAC9B,gBAAA,GAAmB,IAAA,eAAmB,OAAA;IACtC,mBAAA,GAAsB,IAAA,UAAc,KAAA,eAAoB,yBAAA;EAAA;EAI5D,eAAA,CAAA,GAAmB,oBAAA;EAAA,QAaL,YAAA;EAAA,QAkCA,UAAA;EAAA,QAIA,WAAA;EAAA,QAWA,cAAA;EAAA,QAeA,SAAA;EAAA,QAIA,UAAA;EAAA,QAIA,SAAA;EAAA,QAIA,SAAA;EAAA,QAIN,uBAAA;AAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buildMarketplaceSkillInstallArgs, pickUserFacingCommandSummary } from "../../utils/marketplace/service-marketplace-helpers.utils.js";
|
|
1
|
+
import { buildMarketplaceSkillInstallArgs, buildMarketplaceSkillUpdateArgs, pickUserFacingCommandSummary } from "../../utils/marketplace/service-marketplace-helpers.utils.js";
|
|
2
2
|
import { ServiceMcpMarketplaceOps } from "./service-mcp-marketplace-ops.js";
|
|
3
3
|
import { getSkillsPath, getWorkspacePath, loadConfig } from "@nextclaw/core";
|
|
4
4
|
import { existsSync, rmSync } from "node:fs";
|
|
@@ -11,6 +11,7 @@ var ServiceMarketplaceInstaller = class {
|
|
|
11
11
|
createInstaller() {
|
|
12
12
|
return {
|
|
13
13
|
installSkill: (params) => this.installSkill(params),
|
|
14
|
+
updateSkill: (params) => this.updateSkill(params),
|
|
14
15
|
installMcp: (params) => this.installMcp(params),
|
|
15
16
|
uninstallSkill: (slug) => this.uninstallSkill(slug),
|
|
16
17
|
enableMcp: (name) => this.enableMcp(name),
|
|
@@ -20,22 +21,22 @@ var ServiceMarketplaceInstaller = class {
|
|
|
20
21
|
};
|
|
21
22
|
}
|
|
22
23
|
async installSkill(params) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
const { force, kind, slug } = params;
|
|
25
|
+
if (kind === "builtin") {
|
|
26
|
+
const result = this.deps.installBuiltinSkill(slug, force);
|
|
27
|
+
if (!result) throw new Error(`Builtin skill not found: ${slug}`);
|
|
26
28
|
return result;
|
|
27
29
|
}
|
|
28
|
-
if (
|
|
29
|
-
const workspace = getWorkspacePath(loadConfig().agents.defaults.workspace);
|
|
30
|
+
if (kind && kind !== "marketplace") throw new Error(`Unsupported marketplace skill kind: ${kind}`);
|
|
30
31
|
const args = buildMarketplaceSkillInstallArgs({
|
|
31
|
-
slug
|
|
32
|
-
workspace,
|
|
33
|
-
force
|
|
32
|
+
slug,
|
|
33
|
+
workspace: getWorkspacePath(loadConfig().agents.defaults.workspace),
|
|
34
|
+
force
|
|
34
35
|
});
|
|
35
36
|
try {
|
|
36
|
-
return { message: pickUserFacingCommandSummary(await this.deps.runCliSubcommand(args), `Installed skill: ${
|
|
37
|
+
return { message: pickUserFacingCommandSummary(await this.deps.runCliSubcommand(args), `Installed skill: ${slug}`) };
|
|
37
38
|
} catch (error) {
|
|
38
|
-
const fallback = this.deps.installBuiltinSkill(
|
|
39
|
+
const fallback = this.deps.installBuiltinSkill(slug, force);
|
|
39
40
|
if (!fallback) throw error;
|
|
40
41
|
return fallback;
|
|
41
42
|
}
|
|
@@ -43,6 +44,18 @@ var ServiceMarketplaceInstaller = class {
|
|
|
43
44
|
async installMcp(params) {
|
|
44
45
|
return await this.createMcpMarketplaceOps().install(params);
|
|
45
46
|
}
|
|
47
|
+
async updateSkill(params) {
|
|
48
|
+
const workspace = getWorkspacePath(loadConfig().agents.defaults.workspace);
|
|
49
|
+
const output = await this.deps.runCliSubcommand(buildMarketplaceSkillUpdateArgs({
|
|
50
|
+
slug: params.slug,
|
|
51
|
+
workspace,
|
|
52
|
+
force: params.force
|
|
53
|
+
}));
|
|
54
|
+
return {
|
|
55
|
+
message: pickUserFacingCommandSummary(output, `Updated skill: ${params.slug}`),
|
|
56
|
+
output
|
|
57
|
+
};
|
|
58
|
+
}
|
|
46
59
|
async uninstallSkill(slug) {
|
|
47
60
|
const targetDir = join(getSkillsPath(getWorkspacePath(loadConfig().agents.defaults.workspace)), slug);
|
|
48
61
|
if (!existsSync(targetDir)) throw new Error(`Skill not installed in workspace: ${slug}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-marketplace-installer.service.js","names":[],"sources":["../../../../src/shared/services/marketplace/service-marketplace-installer.service.ts"],"sourcesContent":["import { getSkillsPath, getWorkspacePath, loadConfig } from \"@nextclaw/core\";\nimport type {\n MarketplaceInstallSkillParams,\n MarketplaceInstaller,\n MarketplaceMcpDoctorResult,\n MarketplaceMcpInstallRequest\n} from \"@nextclaw/server\";\nimport { existsSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {
|
|
1
|
+
{"version":3,"file":"service-marketplace-installer.service.js","names":[],"sources":["../../../../src/shared/services/marketplace/service-marketplace-installer.service.ts"],"sourcesContent":["import { getSkillsPath, getWorkspacePath, loadConfig } from \"@nextclaw/core\";\nimport type {\n MarketplaceInstallSkillParams,\n MarketplaceInstaller,\n MarketplaceMcpDoctorResult,\n MarketplaceMcpInstallRequest\n} from \"@nextclaw/server\";\nimport { existsSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n buildMarketplaceSkillInstallArgs,\n buildMarketplaceSkillUpdateArgs,\n pickUserFacingCommandSummary\n} from \"@nextclaw-service/shared/utils/marketplace/service-marketplace-helpers.utils.js\";\nimport { ServiceMcpMarketplaceOps } from \"@nextclaw-service/shared/services/marketplace/service-mcp-marketplace-ops.js\";\n\ntype UserFacingResult = {\n message: string;\n output?: string;\n};\n\ntype BuiltinSkillInstallResult = UserFacingResult | null;\n\nexport class ServiceMarketplaceInstaller {\n constructor(\n private readonly deps: {\n applyLiveConfigReload?: () => Promise<void>;\n runCliSubcommand: (args: string[]) => Promise<string>;\n installBuiltinSkill: (slug: string, force?: boolean) => BuiltinSkillInstallResult;\n }\n ) {}\n\n createInstaller(): MarketplaceInstaller {\n return {\n installSkill: (params) => this.installSkill(params),\n updateSkill: (params) => this.updateSkill(params),\n installMcp: (params) => this.installMcp(params),\n uninstallSkill: (slug) => this.uninstallSkill(slug),\n enableMcp: (name) => this.enableMcp(name),\n disableMcp: (name) => this.disableMcp(name),\n removeMcp: (name) => this.removeMcp(name),\n doctorMcp: (name) => this.doctorMcp(name)\n };\n }\n\n private async installSkill(params: MarketplaceInstallSkillParams): Promise<UserFacingResult> {\n const { force, kind, slug } = params;\n if (kind === \"builtin\") {\n const result = this.deps.installBuiltinSkill(slug, force);\n if (!result) {\n throw new Error(`Builtin skill not found: ${slug}`);\n }\n return result;\n }\n\n if (kind && kind !== \"marketplace\") {\n throw new Error(`Unsupported marketplace skill kind: ${kind}`);\n }\n\n const workspace = getWorkspacePath(loadConfig().agents.defaults.workspace);\n const args = buildMarketplaceSkillInstallArgs({\n slug,\n workspace,\n force\n });\n\n try {\n const output = await this.deps.runCliSubcommand(args);\n const summary = pickUserFacingCommandSummary(output, `Installed skill: ${slug}`);\n return { message: summary };\n } catch (error) {\n const fallback = this.deps.installBuiltinSkill(slug, force);\n if (!fallback) {\n throw error;\n }\n return fallback;\n }\n }\n\n private async installMcp(params: MarketplaceMcpInstallRequest): Promise<{ name: string; message: string; output?: string }> {\n return await this.createMcpMarketplaceOps().install(params);\n }\n\n private async updateSkill(params: MarketplaceInstallSkillParams): Promise<UserFacingResult> {\n const workspace = getWorkspacePath(loadConfig().agents.defaults.workspace);\n const output = await this.deps.runCliSubcommand(buildMarketplaceSkillUpdateArgs({\n slug: params.slug,\n workspace,\n force: params.force\n }));\n const summary = pickUserFacingCommandSummary(output, `Updated skill: ${params.slug}`);\n return { message: summary, output };\n }\n\n private async uninstallSkill(slug: string): Promise<UserFacingResult> {\n const workspace = getWorkspacePath(loadConfig().agents.defaults.workspace);\n const targetDir = join(getSkillsPath(workspace), slug);\n\n if (!existsSync(targetDir)) {\n throw new Error(`Skill not installed in workspace: ${slug}`);\n }\n\n rmSync(targetDir, { recursive: true, force: true });\n\n return {\n message: `Uninstalled skill: ${slug}`\n };\n }\n\n private async enableMcp(name: string): Promise<UserFacingResult> {\n return await this.createMcpMarketplaceOps().enable(name);\n }\n\n private async disableMcp(name: string): Promise<UserFacingResult> {\n return await this.createMcpMarketplaceOps().disable(name);\n }\n\n private async removeMcp(name: string): Promise<UserFacingResult> {\n return await this.createMcpMarketplaceOps().remove(name);\n }\n\n private async doctorMcp(name: string): Promise<MarketplaceMcpDoctorResult> {\n return await this.createMcpMarketplaceOps().doctor(name);\n }\n\n private createMcpMarketplaceOps(): ServiceMcpMarketplaceOps {\n return new ServiceMcpMarketplaceOps({\n applyLiveConfigReload: this.deps.applyLiveConfigReload\n });\n }\n}\n"],"mappings":";;;;;;AAuBA,IAAa,8BAAb,MAAyC;CACvC,YACE,MAKA;AALiB,OAAA,OAAA;;CAOnB,kBAAwC;AACtC,SAAO;GACL,eAAe,WAAW,KAAK,aAAa,OAAO;GACnD,cAAc,WAAW,KAAK,YAAY,OAAO;GACjD,aAAa,WAAW,KAAK,WAAW,OAAO;GAC/C,iBAAiB,SAAS,KAAK,eAAe,KAAK;GACnD,YAAY,SAAS,KAAK,UAAU,KAAK;GACzC,aAAa,SAAS,KAAK,WAAW,KAAK;GAC3C,YAAY,SAAS,KAAK,UAAU,KAAK;GACzC,YAAY,SAAS,KAAK,UAAU,KAAK;GAC1C;;CAGH,MAAc,aAAa,QAAkE;EAC3F,MAAM,EAAE,OAAO,MAAM,SAAS;AAC9B,MAAI,SAAS,WAAW;GACtB,MAAM,SAAS,KAAK,KAAK,oBAAoB,MAAM,MAAM;AACzD,OAAI,CAAC,OACH,OAAM,IAAI,MAAM,4BAA4B,OAAO;AAErD,UAAO;;AAGT,MAAI,QAAQ,SAAS,cACnB,OAAM,IAAI,MAAM,uCAAuC,OAAO;EAIhE,MAAM,OAAO,iCAAiC;GAC5C;GACA,WAHgB,iBAAiB,YAAY,CAAC,OAAO,SAAS,UAAU;GAIxE;GACD,CAAC;AAEF,MAAI;AAGF,UAAO,EAAE,SADO,6BADD,MAAM,KAAK,KAAK,iBAAiB,KAAK,EACA,oBAAoB,OAAO,EACrD;WACpB,OAAO;GACd,MAAM,WAAW,KAAK,KAAK,oBAAoB,MAAM,MAAM;AAC3D,OAAI,CAAC,SACH,OAAM;AAER,UAAO;;;CAIX,MAAc,WAAW,QAAmG;AAC1H,SAAO,MAAM,KAAK,yBAAyB,CAAC,QAAQ,OAAO;;CAG7D,MAAc,YAAY,QAAkE;EAC1F,MAAM,YAAY,iBAAiB,YAAY,CAAC,OAAO,SAAS,UAAU;EAC1E,MAAM,SAAS,MAAM,KAAK,KAAK,iBAAiB,gCAAgC;GAC9E,MAAM,OAAO;GACb;GACA,OAAO,OAAO;GACf,CAAC,CAAC;AAEH,SAAO;GAAE,SADO,6BAA6B,QAAQ,kBAAkB,OAAO,OAAO;GAC1D;GAAQ;;CAGrC,MAAc,eAAe,MAAyC;EAEpE,MAAM,YAAY,KAAK,cADL,iBAAiB,YAAY,CAAC,OAAO,SAAS,UAAU,CAC3B,EAAE,KAAK;AAEtD,MAAI,CAAC,WAAW,UAAU,CACxB,OAAM,IAAI,MAAM,qCAAqC,OAAO;AAG9D,SAAO,WAAW;GAAE,WAAW;GAAM,OAAO;GAAM,CAAC;AAEnD,SAAO,EACL,SAAS,sBAAsB,QAChC;;CAGH,MAAc,UAAU,MAAyC;AAC/D,SAAO,MAAM,KAAK,yBAAyB,CAAC,OAAO,KAAK;;CAG1D,MAAc,WAAW,MAAyC;AAChE,SAAO,MAAM,KAAK,yBAAyB,CAAC,QAAQ,KAAK;;CAG3D,MAAc,UAAU,MAAyC;AAC/D,SAAO,MAAM,KAAK,yBAAyB,CAAC,OAAO,KAAK;;CAG1D,MAAc,UAAU,MAAmD;AACzE,SAAO,MAAM,KAAK,yBAAyB,CAAC,OAAO,KAAK;;CAG1D,0BAA4D;AAC1D,SAAO,IAAI,yBAAyB,EAClC,uBAAuB,KAAK,KAAK,uBAClC,CAAC"}
|
|
@@ -53,6 +53,13 @@ type MarketplaceSkillsRecommendCommandOptions = {
|
|
|
53
53
|
limit?: string | number;
|
|
54
54
|
json?: boolean;
|
|
55
55
|
};
|
|
56
|
+
type MarketplaceSkillsUpdateCommandOptions = {
|
|
57
|
+
apiBase?: string;
|
|
58
|
+
workdir?: string;
|
|
59
|
+
dir?: string;
|
|
60
|
+
force?: boolean;
|
|
61
|
+
json?: boolean;
|
|
62
|
+
};
|
|
56
63
|
type UpdateCommandOptions = {
|
|
57
64
|
check?: boolean;
|
|
58
65
|
download?: boolean;
|
|
@@ -297,5 +304,5 @@ type RequestRestartParams = {
|
|
|
297
304
|
mode?: "execute" | "notify";
|
|
298
305
|
};
|
|
299
306
|
//#endregion
|
|
300
|
-
export { AccountCommandOptions, AccountSetUsernameCommandOptions, AgentCommandOptions, AgentsListCommandOptions, AgentsNewCommandOptions, AgentsRemoveCommandOptions, AgentsRuntimesCommandOptions, AgentsUpdateCommandOptions, ChannelsAddOptions, ChannelsListOptions, ChannelsLoginOptions, ConfigGetOptions, ConfigSetOptions, CronAddOptions, DoctorCommandOptions, GatewayCommandOptions, HealthProbe, LoginCommandOptions, LogsTailCommandOptions, MarketplaceSkillsRecommendCommandOptions, MarketplaceSkillsSearchCommandOptions, McpAddCommandOptions, McpDoctorOptions, McpListOptions, PluginsInfoOptions, PluginsInstallOptions, PluginsListOptions, PluginsUninstallOptions, type RemoteConnectCommandOptions, type RemoteDoctorCommandOptions, type RemoteEnableCommandOptions, type RemoteStatusCommandOptions, RequestRestartParams, RuntimeStatusReport, SecretsApplyOptions, SecretsAuditOptions, SecretsConfigureOptions, SecretsReloadOptions, ServiceAutostartCommandOptions, SkillsInfoCommandOptions, SkillsInstalledCommandOptions, StartCommandOptions, StatusCommandOptions, UiCommandOptions, UpdateCommandOptions, UsageCommandOptions };
|
|
307
|
+
export { AccountCommandOptions, AccountSetUsernameCommandOptions, AgentCommandOptions, AgentsListCommandOptions, AgentsNewCommandOptions, AgentsRemoveCommandOptions, AgentsRuntimesCommandOptions, AgentsUpdateCommandOptions, ChannelsAddOptions, ChannelsListOptions, ChannelsLoginOptions, ConfigGetOptions, ConfigSetOptions, CronAddOptions, DoctorCommandOptions, GatewayCommandOptions, HealthProbe, LoginCommandOptions, LogsTailCommandOptions, MarketplaceSkillsRecommendCommandOptions, MarketplaceSkillsSearchCommandOptions, MarketplaceSkillsUpdateCommandOptions, McpAddCommandOptions, McpDoctorOptions, McpListOptions, PluginsInfoOptions, PluginsInstallOptions, PluginsListOptions, PluginsUninstallOptions, type RemoteConnectCommandOptions, type RemoteDoctorCommandOptions, type RemoteEnableCommandOptions, type RemoteStatusCommandOptions, RequestRestartParams, RuntimeStatusReport, SecretsApplyOptions, SecretsAuditOptions, SecretsConfigureOptions, SecretsReloadOptions, ServiceAutostartCommandOptions, SkillsInfoCommandOptions, SkillsInstalledCommandOptions, StartCommandOptions, StatusCommandOptions, UiCommandOptions, UpdateCommandOptions, UsageCommandOptions };
|
|
301
308
|
//# sourceMappingURL=cli.types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.types.d.ts","names":[],"sources":["../../../src/shared/types/cli.types.ts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.types.d.ts","names":[],"sources":["../../../src/shared/types/cli.types.ts"],"mappings":"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"}
|
|
@@ -5,6 +5,11 @@ declare const buildMarketplaceSkillInstallArgs: (params: {
|
|
|
5
5
|
workspace: string;
|
|
6
6
|
force?: boolean;
|
|
7
7
|
}) => string[];
|
|
8
|
+
declare const buildMarketplaceSkillUpdateArgs: (params: {
|
|
9
|
+
slug: string;
|
|
10
|
+
workspace: string;
|
|
11
|
+
force?: boolean;
|
|
12
|
+
}) => string[];
|
|
8
13
|
//#endregion
|
|
9
|
-
export { buildMarketplaceSkillInstallArgs, pickUserFacingCommandSummary };
|
|
14
|
+
export { buildMarketplaceSkillInstallArgs, buildMarketplaceSkillUpdateArgs, pickUserFacingCommandSummary };
|
|
10
15
|
//# sourceMappingURL=service-marketplace-helpers.utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-marketplace-helpers.utils.d.ts","names":[],"sources":["../../../../src/shared/utils/marketplace/service-marketplace-helpers.utils.ts"],"mappings":";cAkBa,4BAAA,GAAgC,MAAA,UAAgB,QAAA;AAAA,cA+BhD,gCAAA,GAAoC,MAAA;EAC/C,IAAA;EACA,SAAA;EACA,KAAA;AAAA"}
|
|
1
|
+
{"version":3,"file":"service-marketplace-helpers.utils.d.ts","names":[],"sources":["../../../../src/shared/utils/marketplace/service-marketplace-helpers.utils.ts"],"mappings":";cAkBa,4BAAA,GAAgC,MAAA,UAAgB,QAAA;AAAA,cA+BhD,gCAAA,GAAoC,MAAA;EAC/C,IAAA;EACA,SAAA;EACA,KAAA;AAAA;AAAA,cASW,+BAAA,GAAmC,MAAA;EAC9C,IAAA;EACA,SAAA;EACA,KAAA;AAAA"}
|
|
@@ -29,7 +29,19 @@ const buildMarketplaceSkillInstallArgs = (params) => {
|
|
|
29
29
|
if (params.force) args.push("--force");
|
|
30
30
|
return args;
|
|
31
31
|
};
|
|
32
|
+
const buildMarketplaceSkillUpdateArgs = (params) => {
|
|
33
|
+
const args = [
|
|
34
|
+
"marketplace",
|
|
35
|
+
"skills",
|
|
36
|
+
"update",
|
|
37
|
+
params.slug,
|
|
38
|
+
"--workdir",
|
|
39
|
+
params.workspace
|
|
40
|
+
];
|
|
41
|
+
if (params.force) args.push("--force");
|
|
42
|
+
return args;
|
|
43
|
+
};
|
|
32
44
|
//#endregion
|
|
33
|
-
export { buildMarketplaceSkillInstallArgs, pickUserFacingCommandSummary };
|
|
45
|
+
export { buildMarketplaceSkillInstallArgs, buildMarketplaceSkillUpdateArgs, pickUserFacingCommandSummary };
|
|
34
46
|
|
|
35
47
|
//# sourceMappingURL=service-marketplace-helpers.utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-marketplace-helpers.utils.js","names":[],"sources":["../../../../src/shared/utils/marketplace/service-marketplace-helpers.utils.ts"],"sourcesContent":["const containsAbsoluteFsPath = (line: string): boolean => {\n const normalized = line.trim();\n if (!normalized) {\n return false;\n }\n\n const lowered = normalized.toLowerCase();\n if (lowered.includes(\"http://\") || lowered.includes(\"https://\")) {\n return false;\n }\n\n if (/^[A-Za-z]:\\\\/.test(normalized)) {\n return true;\n }\n\n return /(?:^|\\s)(?:~\\/|\\/[^\\s]+)/.test(normalized);\n};\n\nexport const pickUserFacingCommandSummary = (output: string, fallback: string): string => {\n const lines = output\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n\n if (lines.length === 0) {\n return fallback;\n }\n\n const visibleLines = lines.filter((line) => {\n if (/^(path|install path|source path|destination|location)\\s*:/i.test(line)) {\n return false;\n }\n if (containsAbsoluteFsPath(line)) {\n return false;\n }\n return true;\n });\n\n if (visibleLines.length === 0) {\n return fallback;\n }\n\n const preferred = [...visibleLines].reverse().find((line) =>\n /\\b(installed|enabled|disabled|uninstalled|published|updated|already installed|removed)\\b/i.test(line),\n );\n\n return preferred ?? visibleLines[visibleLines.length - 1] ?? fallback;\n};\n\nexport const buildMarketplaceSkillInstallArgs = (params: {\n slug: string;\n workspace: string;\n force?: boolean;\n}): string[] => {\n const args = [\"skills\", \"install\", params.slug, \"--workdir\", params.workspace];\n if (params.force) {\n args.push(\"--force\");\n }\n return args;\n};\n"],"mappings":";AAAA,MAAM,0BAA0B,SAA0B;CACxD,MAAM,aAAa,KAAK,MAAM;AAC9B,KAAI,CAAC,WACH,QAAO;CAGT,MAAM,UAAU,WAAW,aAAa;AACxC,KAAI,QAAQ,SAAS,UAAU,IAAI,QAAQ,SAAS,WAAW,CAC7D,QAAO;AAGT,KAAI,eAAe,KAAK,WAAW,CACjC,QAAO;AAGT,QAAO,2BAA2B,KAAK,WAAW;;AAGpD,MAAa,gCAAgC,QAAgB,aAA6B;CACxF,MAAM,QAAQ,OACX,MAAM,KAAK,CACX,KAAK,SAAS,KAAK,MAAM,CAAC,CAC1B,OAAO,QAAQ;AAElB,KAAI,MAAM,WAAW,EACnB,QAAO;CAGT,MAAM,eAAe,MAAM,QAAQ,SAAS;AAC1C,MAAI,6DAA6D,KAAK,KAAK,CACzE,QAAO;AAET,MAAI,uBAAuB,KAAK,CAC9B,QAAO;AAET,SAAO;GACP;AAEF,KAAI,aAAa,WAAW,EAC1B,QAAO;AAOT,QAJkB,CAAC,GAAG,aAAa,CAAC,SAAS,CAAC,MAAM,SAClD,4FAA4F,KAAK,KAAK,CACvG,IAEmB,aAAa,aAAa,SAAS,MAAM;;AAG/D,MAAa,oCAAoC,WAIjC;CACd,MAAM,OAAO;EAAC;EAAU;EAAW,OAAO;EAAM;EAAa,OAAO;EAAU;AAC9E,KAAI,OAAO,MACT,MAAK,KAAK,UAAU;AAEtB,QAAO"}
|
|
1
|
+
{"version":3,"file":"service-marketplace-helpers.utils.js","names":[],"sources":["../../../../src/shared/utils/marketplace/service-marketplace-helpers.utils.ts"],"sourcesContent":["const containsAbsoluteFsPath = (line: string): boolean => {\n const normalized = line.trim();\n if (!normalized) {\n return false;\n }\n\n const lowered = normalized.toLowerCase();\n if (lowered.includes(\"http://\") || lowered.includes(\"https://\")) {\n return false;\n }\n\n if (/^[A-Za-z]:\\\\/.test(normalized)) {\n return true;\n }\n\n return /(?:^|\\s)(?:~\\/|\\/[^\\s]+)/.test(normalized);\n};\n\nexport const pickUserFacingCommandSummary = (output: string, fallback: string): string => {\n const lines = output\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n\n if (lines.length === 0) {\n return fallback;\n }\n\n const visibleLines = lines.filter((line) => {\n if (/^(path|install path|source path|destination|location)\\s*:/i.test(line)) {\n return false;\n }\n if (containsAbsoluteFsPath(line)) {\n return false;\n }\n return true;\n });\n\n if (visibleLines.length === 0) {\n return fallback;\n }\n\n const preferred = [...visibleLines].reverse().find((line) =>\n /\\b(installed|enabled|disabled|uninstalled|published|updated|already installed|removed)\\b/i.test(line),\n );\n\n return preferred ?? visibleLines[visibleLines.length - 1] ?? fallback;\n};\n\nexport const buildMarketplaceSkillInstallArgs = (params: {\n slug: string;\n workspace: string;\n force?: boolean;\n}): string[] => {\n const args = [\"skills\", \"install\", params.slug, \"--workdir\", params.workspace];\n if (params.force) {\n args.push(\"--force\");\n }\n return args;\n};\n\nexport const buildMarketplaceSkillUpdateArgs = (params: {\n slug: string;\n workspace: string;\n force?: boolean;\n}): string[] => {\n const args = [\"marketplace\", \"skills\", \"update\", params.slug, \"--workdir\", params.workspace];\n if (params.force) {\n args.push(\"--force\");\n }\n return args;\n};\n"],"mappings":";AAAA,MAAM,0BAA0B,SAA0B;CACxD,MAAM,aAAa,KAAK,MAAM;AAC9B,KAAI,CAAC,WACH,QAAO;CAGT,MAAM,UAAU,WAAW,aAAa;AACxC,KAAI,QAAQ,SAAS,UAAU,IAAI,QAAQ,SAAS,WAAW,CAC7D,QAAO;AAGT,KAAI,eAAe,KAAK,WAAW,CACjC,QAAO;AAGT,QAAO,2BAA2B,KAAK,WAAW;;AAGpD,MAAa,gCAAgC,QAAgB,aAA6B;CACxF,MAAM,QAAQ,OACX,MAAM,KAAK,CACX,KAAK,SAAS,KAAK,MAAM,CAAC,CAC1B,OAAO,QAAQ;AAElB,KAAI,MAAM,WAAW,EACnB,QAAO;CAGT,MAAM,eAAe,MAAM,QAAQ,SAAS;AAC1C,MAAI,6DAA6D,KAAK,KAAK,CACzE,QAAO;AAET,MAAI,uBAAuB,KAAK,CAC9B,QAAO;AAET,SAAO;GACP;AAEF,KAAI,aAAa,WAAW,EAC1B,QAAO;AAOT,QAJkB,CAAC,GAAG,aAAa,CAAC,SAAS,CAAC,MAAM,SAClD,4FAA4F,KAAK,KAAK,CACvG,IAEmB,aAAa,aAAa,SAAS,MAAM;;AAG/D,MAAa,oCAAoC,WAIjC;CACd,MAAM,OAAO;EAAC;EAAU;EAAW,OAAO;EAAM;EAAa,OAAO;EAAU;AAC9E,KAAI,OAAO,MACT,MAAK,KAAK,UAAU;AAEtB,QAAO;;AAGT,MAAa,mCAAmC,WAIhC;CACd,MAAM,OAAO;EAAC;EAAe;EAAU;EAAU,OAAO;EAAM;EAAa,OAAO;EAAU;AAC5F,KAAI,OAAO,MACT,MAAK,KAAK,UAAU;AAEtB,QAAO"}
|