refactor(shared): share requirements eval for remote context

This commit is contained in:
Peter Steinberger
2026-02-15 14:26:10 +00:00
parent 33a3a56ee1
commit 34b6c743f5
3 changed files with 37 additions and 10 deletions

View File

@@ -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] ||

View File

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

View File

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