From b838429e2f2e5b956eeb66b7b3827d3991461489 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 15 Feb 2026 13:01:39 +0000 Subject: [PATCH] refactor(status): share emoji/homepage resolver --- src/agents/skills-status.ts | 12 +++++------- src/hooks/hooks-status.ts | 12 +++++------- src/shared/entry-metadata.ts | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+), 14 deletions(-) create mode 100644 src/shared/entry-metadata.ts diff --git a/src/agents/skills-status.ts b/src/agents/skills-status.ts index ae00847cb6e..d4a22abd8ef 100644 --- a/src/agents/skills-status.ts +++ b/src/agents/skills-status.ts @@ -1,5 +1,6 @@ import path from "node:path"; import type { OpenClawConfig } from "../config/config.js"; +import { resolveEmojiAndHomepage } from "../shared/entry-metadata.js"; import { evaluateRequirementsFromMetadata } from "../shared/requirements.js"; import { CONFIG_DIR } from "../utils.js"; import { @@ -183,13 +184,10 @@ function buildSkillStatus( const allowBundled = resolveBundledAllowlist(config); const blockedByAllowlist = !isBundledSkillAllowed(entry, allowBundled); const always = entry.metadata?.always === true; - const emoji = entry.metadata?.emoji ?? entry.frontmatter.emoji; - const homepageRaw = - entry.metadata?.homepage ?? - entry.frontmatter.homepage ?? - entry.frontmatter.website ?? - entry.frontmatter.url; - const homepage = homepageRaw?.trim() ? homepageRaw.trim() : undefined; + const { emoji, homepage } = resolveEmojiAndHomepage({ + metadata: entry.metadata, + frontmatter: entry.frontmatter, + }); const bundled = bundledNames && bundledNames.size > 0 ? bundledNames.has(entry.skill.name) diff --git a/src/hooks/hooks-status.ts b/src/hooks/hooks-status.ts index eca4054ffc7..06eb3dd64c0 100644 --- a/src/hooks/hooks-status.ts +++ b/src/hooks/hooks-status.ts @@ -1,6 +1,7 @@ import path from "node:path"; import type { OpenClawConfig } from "../config/config.js"; import type { HookEligibilityContext, HookEntry, HookInstallSpec } from "./types.js"; +import { resolveEmojiAndHomepage } from "../shared/entry-metadata.js"; import { evaluateRequirementsFromMetadata } from "../shared/requirements.js"; import { CONFIG_DIR } from "../utils.js"; import { hasBinary, isConfigPathTruthy, resolveHookConfig } from "./config.js"; @@ -100,13 +101,10 @@ function buildHookStatus( const managedByPlugin = entry.hook.source === "openclaw-plugin"; const disabled = managedByPlugin ? false : hookConfig?.enabled === false; const always = entry.metadata?.always === true; - const emoji = entry.metadata?.emoji ?? entry.frontmatter.emoji; - const homepageRaw = - entry.metadata?.homepage ?? - entry.frontmatter.homepage ?? - entry.frontmatter.website ?? - entry.frontmatter.url; - const homepage = homepageRaw?.trim() ? homepageRaw.trim() : undefined; + const { emoji, homepage } = resolveEmojiAndHomepage({ + metadata: entry.metadata, + frontmatter: entry.frontmatter, + }); const events = entry.metadata?.events ?? []; const { diff --git a/src/shared/entry-metadata.ts b/src/shared/entry-metadata.ts new file mode 100644 index 00000000000..692a4c83567 --- /dev/null +++ b/src/shared/entry-metadata.ts @@ -0,0 +1,18 @@ +export function resolveEmojiAndHomepage(params: { + metadata?: { emoji?: string; homepage?: string } | null; + frontmatter?: { + emoji?: string; + homepage?: string; + website?: string; + url?: string; + } | null; +}): { emoji?: string; homepage?: string } { + const emoji = params.metadata?.emoji ?? params.frontmatter?.emoji; + const homepageRaw = + params.metadata?.homepage ?? + params.frontmatter?.homepage ?? + params.frontmatter?.website ?? + params.frontmatter?.url; + const homepage = homepageRaw?.trim() ? homepageRaw.trim() : undefined; + return { ...(emoji ? { emoji } : {}), ...(homepage ? { homepage } : {}) }; +}