From 34b6c743f5566273daed9db6aa621434f6b2ad17 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 15 Feb 2026 14:26:10 +0000 Subject: [PATCH] refactor(shared): share requirements eval for remote context --- src/agents/skills-status.ts | 8 +++----- src/hooks/hooks-status.ts | 8 +++----- src/shared/requirements.ts | 31 +++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/agents/skills-status.ts b/src/agents/skills-status.ts index d4a22abd8ef..8bcf1cd6689 100644 --- a/src/agents/skills-status.ts +++ b/src/agents/skills-status.ts @@ -1,7 +1,7 @@ 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 { evaluateRequirementsFromMetadataWithRemote } from "../shared/requirements.js"; import { CONFIG_DIR } from "../utils.js"; import { hasBinary, @@ -198,14 +198,12 @@ function buildSkillStatus( missing, eligible: requirementsSatisfied, configChecks, - } = evaluateRequirementsFromMetadata({ + } = evaluateRequirementsFromMetadataWithRemote({ always, metadata: entry.metadata, hasLocalBin: hasBinary, - hasRemoteBin: eligibility?.remote?.hasBin, - hasRemoteAnyBin: eligibility?.remote?.hasAnyBin, localPlatform: process.platform, - remotePlatforms: eligibility?.remote?.platforms, + remote: eligibility?.remote, isEnvSatisfied: (envName) => Boolean( process.env[envName] || diff --git a/src/hooks/hooks-status.ts b/src/hooks/hooks-status.ts index 06eb3dd64c0..b8db68abbfe 100644 --- a/src/hooks/hooks-status.ts +++ b/src/hooks/hooks-status.ts @@ -2,7 +2,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 { evaluateRequirementsFromMetadataWithRemote } from "../shared/requirements.js"; import { CONFIG_DIR } from "../utils.js"; import { hasBinary, isConfigPathTruthy, resolveHookConfig } from "./config.js"; import { loadWorkspaceHookEntries } from "./workspace.js"; @@ -112,14 +112,12 @@ function buildHookStatus( missing, eligible: requirementsSatisfied, configChecks, - } = evaluateRequirementsFromMetadata({ + } = evaluateRequirementsFromMetadataWithRemote({ always, metadata: entry.metadata, hasLocalBin: hasBinary, - hasRemoteBin: eligibility?.remote?.hasBin, - hasRemoteAnyBin: eligibility?.remote?.hasAnyBin, localPlatform: process.platform, - remotePlatforms: eligibility?.remote?.platforms, + remote: eligibility?.remote, isEnvSatisfied: (envName) => Boolean(process.env[envName] || hookConfig?.env?.[envName]), isConfigSatisfied: (pathStr) => isConfigPathTruthy(config, pathStr), }); diff --git a/src/shared/requirements.ts b/src/shared/requirements.ts index 3bdfe6a5363..be7080facc0 100644 --- a/src/shared/requirements.ts +++ b/src/shared/requirements.ts @@ -185,3 +185,34 @@ export function evaluateRequirementsFromMetadata(params: { }); return { required, ...result }; } + +export function evaluateRequirementsFromMetadataWithRemote(params: { + always: boolean; + metadata?: RequirementsMetadata; + hasLocalBin: (bin: string) => boolean; + localPlatform: string; + remote?: { + hasBin?: (bin: string) => boolean; + hasAnyBin?: (bins: string[]) => boolean; + platforms?: string[]; + }; + isEnvSatisfied: (envName: string) => boolean; + isConfigSatisfied: (pathStr: string) => boolean; +}): { + required: Requirements; + missing: Requirements; + eligible: boolean; + configChecks: RequirementConfigCheck[]; +} { + return evaluateRequirementsFromMetadata({ + always: params.always, + metadata: params.metadata, + hasLocalBin: params.hasLocalBin, + hasRemoteBin: params.remote?.hasBin, + hasRemoteAnyBin: params.remote?.hasAnyBin, + localPlatform: params.localPlatform, + remotePlatforms: params.remote?.platforms, + isEnvSatisfied: params.isEnvSatisfied, + isConfigSatisfied: params.isConfigSatisfied, + }); +}