refactor(shared): reuse runtime entry requirement evaluator

This commit is contained in:
Peter Steinberger
2026-02-19 00:17:24 +00:00
parent ef5d7cee22
commit b2c2737452
3 changed files with 45 additions and 27 deletions

View File

@@ -1,6 +1,6 @@
import path from "node:path";
import type { OpenClawConfig } from "../config/config.js";
import { evaluateEntryMetadataRequirements } from "../shared/entry-status.js";
import { evaluateEntryMetadataRequirementsForCurrentPlatform } from "../shared/entry-status.js";
import type { RequirementConfigCheck, Requirements } from "../shared/requirements.js";
import { CONFIG_DIR } from "../utils.js";
import {
@@ -179,27 +179,29 @@ function buildSkillStatus(
const allowBundled = resolveBundledAllowlist(config);
const blockedByAllowlist = !isBundledSkillAllowed(entry, allowBundled);
const always = entry.metadata?.always === true;
const isEnvSatisfied = (envName: string) =>
Boolean(
process.env[envName] ||
skillConfig?.env?.[envName] ||
(skillConfig?.apiKey && entry.metadata?.primaryEnv === envName),
);
const isConfigSatisfied = (pathStr: string) => isConfigPathTruthy(config, pathStr);
const bundled =
bundledNames && bundledNames.size > 0
? bundledNames.has(entry.skill.name)
: entry.skill.source === "openclaw-bundled";
const requirementStatus = evaluateEntryMetadataRequirementsForCurrentPlatform({
always,
metadata: entry.metadata,
frontmatter: entry.frontmatter,
hasLocalBin: hasBinary,
remote: eligibility?.remote,
isEnvSatisfied,
isConfigSatisfied,
});
const { emoji, homepage, required, missing, requirementsSatisfied, configChecks } =
evaluateEntryMetadataRequirements({
always,
metadata: entry.metadata,
frontmatter: entry.frontmatter,
hasLocalBin: hasBinary,
localPlatform: process.platform,
remote: eligibility?.remote,
isEnvSatisfied: (envName) =>
Boolean(
process.env[envName] ||
skillConfig?.env?.[envName] ||
(skillConfig?.apiKey && entry.metadata?.primaryEnv === envName),
),
isConfigSatisfied: (pathStr) => isConfigPathTruthy(config, pathStr),
});
requirementStatus;
const eligible = !disabled && !blockedByAllowlist && requirementsSatisfied;
return {

View File

@@ -1,6 +1,6 @@
import path from "node:path";
import type { OpenClawConfig } from "../config/config.js";
import { evaluateEntryMetadataRequirements } from "../shared/entry-status.js";
import { evaluateEntryMetadataRequirementsForCurrentPlatform } from "../shared/entry-status.js";
import type { RequirementConfigCheck, Requirements } from "../shared/requirements.js";
import { CONFIG_DIR } from "../utils.js";
import { hasBinary, isConfigPathTruthy, resolveHookConfig } from "./config.js";
@@ -87,18 +87,21 @@ function buildHookStatus(
const disabled = managedByPlugin ? false : hookConfig?.enabled === false;
const always = entry.metadata?.always === true;
const events = entry.metadata?.events ?? [];
const isEnvSatisfied = (envName: string) =>
Boolean(process.env[envName] || hookConfig?.env?.[envName]);
const isConfigSatisfied = (pathStr: string) => isConfigPathTruthy(config, pathStr);
const requirementStatus = evaluateEntryMetadataRequirementsForCurrentPlatform({
always,
metadata: entry.metadata,
frontmatter: entry.frontmatter,
hasLocalBin: hasBinary,
remote: eligibility?.remote,
isEnvSatisfied,
isConfigSatisfied,
});
const { emoji, homepage, required, missing, requirementsSatisfied, configChecks } =
evaluateEntryMetadataRequirements({
always,
metadata: entry.metadata,
frontmatter: entry.frontmatter,
hasLocalBin: hasBinary,
localPlatform: process.platform,
remote: eligibility?.remote,
isEnvSatisfied: (envName) => Boolean(process.env[envName] || hookConfig?.env?.[envName]),
isConfigSatisfied: (pathStr) => isConfigPathTruthy(config, pathStr),
});
requirementStatus;
const eligible = !disabled && requirementsSatisfied;

View File

@@ -7,6 +7,10 @@ import {
type RequirementsMetadata,
} from "./requirements.js";
export type EntryMetadataRequirementsParams = Parameters<
typeof evaluateEntryMetadataRequirements
>[0];
export function evaluateEntryMetadataRequirements(params: {
always: boolean;
metadata?: (RequirementsMetadata & { emoji?: string; homepage?: string }) | null;
@@ -51,3 +55,12 @@ export function evaluateEntryMetadataRequirements(params: {
configChecks,
};
}
export function evaluateEntryMetadataRequirementsForCurrentPlatform(
params: Omit<EntryMetadataRequirementsParams, "localPlatform">,
): ReturnType<typeof evaluateEntryMetadataRequirements> {
return evaluateEntryMetadataRequirements({
...params,
localPlatform: process.platform,
});
}