refactor(frontmatter): share openclaw manifest parsing

This commit is contained in:
Peter Steinberger
2026-02-16 00:23:04 +00:00
parent fddf8a6f4a
commit ae1880acf6
3 changed files with 53 additions and 34 deletions

View File

@@ -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<string, unknown>)
: 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,
};
}

View File

@@ -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<string, unknown>)
: 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,
};
}

View File

@@ -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<string, unknown>,
): OpenClawManifestRequires | undefined {
const requiresRaw =
typeof metadataObj.requires === "object" && metadataObj.requires !== null
? (metadataObj.requires as Record<string, unknown>)
: 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<T>(
metadataObj: Record<string, unknown>,
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, unknown>): string[] {
return normalizeStringList(metadataObj.os);
}