diff --git a/src/agents/skills/frontmatter.ts b/src/agents/skills/frontmatter.ts index 857bed643ea..e97b5ab68cd 100644 --- a/src/agents/skills/frontmatter.ts +++ b/src/agents/skills/frontmatter.ts @@ -12,6 +12,9 @@ import { normalizeStringList, parseFrontmatterBool, resolveOpenClawManifestBlock, + resolveOpenClawManifestInstall, + resolveOpenClawManifestOs, + resolveOpenClawManifestRequires, } from "../../shared/frontmatter.js"; export function parseFrontmatter(content: string): ParsedSkillFrontmatter { @@ -83,15 +86,9 @@ export function resolveOpenClawMetadata( if (!metadataObj) { return undefined; } - const requiresRaw = - typeof metadataObj.requires === "object" && metadataObj.requires !== null - ? (metadataObj.requires as Record) - : undefined; - const installRaw = Array.isArray(metadataObj.install) ? (metadataObj.install as unknown[]) : []; - const install = installRaw - .map((entry) => parseInstallSpec(entry)) - .filter((entry): entry is SkillInstallSpec => Boolean(entry)); - const osRaw = normalizeStringList(metadataObj.os); + const requires = resolveOpenClawManifestRequires(metadataObj); + const install = resolveOpenClawManifestInstall(metadataObj, parseInstallSpec); + const osRaw = resolveOpenClawManifestOs(metadataObj); return { always: typeof metadataObj.always === "boolean" ? metadataObj.always : undefined, emoji: typeof metadataObj.emoji === "string" ? metadataObj.emoji : undefined, @@ -99,14 +96,7 @@ export function resolveOpenClawMetadata( skillKey: typeof metadataObj.skillKey === "string" ? metadataObj.skillKey : undefined, primaryEnv: typeof metadataObj.primaryEnv === "string" ? metadataObj.primaryEnv : undefined, os: osRaw.length > 0 ? osRaw : undefined, - requires: requiresRaw - ? { - bins: normalizeStringList(requiresRaw.bins), - anyBins: normalizeStringList(requiresRaw.anyBins), - env: normalizeStringList(requiresRaw.env), - config: normalizeStringList(requiresRaw.config), - } - : undefined, + requires: requires, install: install.length > 0 ? install : undefined, }; } diff --git a/src/hooks/frontmatter.ts b/src/hooks/frontmatter.ts index 801da9a1d5d..3cfc1d67e27 100644 --- a/src/hooks/frontmatter.ts +++ b/src/hooks/frontmatter.ts @@ -11,6 +11,9 @@ import { normalizeStringList, parseFrontmatterBool, resolveOpenClawManifestBlock, + resolveOpenClawManifestInstall, + resolveOpenClawManifestOs, + resolveOpenClawManifestRequires, } from "../shared/frontmatter.js"; export function parseFrontmatter(content: string): ParsedHookFrontmatter { @@ -60,15 +63,9 @@ export function resolveOpenClawMetadata( if (!metadataObj) { return undefined; } - const requiresRaw = - typeof metadataObj.requires === "object" && metadataObj.requires !== null - ? (metadataObj.requires as Record) - : undefined; - const installRaw = Array.isArray(metadataObj.install) ? (metadataObj.install as unknown[]) : []; - const install = installRaw - .map((entry) => parseInstallSpec(entry)) - .filter((entry): entry is HookInstallSpec => Boolean(entry)); - const osRaw = normalizeStringList(metadataObj.os); + const requires = resolveOpenClawManifestRequires(metadataObj); + const install = resolveOpenClawManifestInstall(metadataObj, parseInstallSpec); + const osRaw = resolveOpenClawManifestOs(metadataObj); const eventsRaw = normalizeStringList(metadataObj.events); return { always: typeof metadataObj.always === "boolean" ? metadataObj.always : undefined, @@ -78,14 +75,7 @@ export function resolveOpenClawMetadata( export: typeof metadataObj.export === "string" ? metadataObj.export : undefined, os: osRaw.length > 0 ? osRaw : undefined, events: eventsRaw.length > 0 ? eventsRaw : [], - requires: requiresRaw - ? { - bins: normalizeStringList(requiresRaw.bins), - anyBins: normalizeStringList(requiresRaw.anyBins), - env: normalizeStringList(requiresRaw.env), - config: normalizeStringList(requiresRaw.config), - } - : undefined, + requires: requires, install: install.length > 0 ? install : undefined, }; } diff --git a/src/shared/frontmatter.ts b/src/shared/frontmatter.ts index 8611744d9b1..2db4fb95117 100644 --- a/src/shared/frontmatter.ts +++ b/src/shared/frontmatter.ts @@ -58,3 +58,42 @@ export function resolveOpenClawManifestBlock(params: { return undefined; } } + +export type OpenClawManifestRequires = { + bins: string[]; + anyBins: string[]; + env: string[]; + config: string[]; +}; + +export function resolveOpenClawManifestRequires( + metadataObj: Record, +): OpenClawManifestRequires | undefined { + const requiresRaw = + typeof metadataObj.requires === "object" && metadataObj.requires !== null + ? (metadataObj.requires as Record) + : undefined; + if (!requiresRaw) { + return undefined; + } + return { + bins: normalizeStringList(requiresRaw.bins), + anyBins: normalizeStringList(requiresRaw.anyBins), + env: normalizeStringList(requiresRaw.env), + config: normalizeStringList(requiresRaw.config), + }; +} + +export function resolveOpenClawManifestInstall( + metadataObj: Record, + parseInstallSpec: (input: unknown) => T | undefined, +): T[] { + const installRaw = Array.isArray(metadataObj.install) ? (metadataObj.install as unknown[]) : []; + return installRaw + .map((entry) => parseInstallSpec(entry)) + .filter((entry): entry is T => Boolean(entry)); +} + +export function resolveOpenClawManifestOs(metadataObj: Record): string[] { + return normalizeStringList(metadataObj.os); +}