@@ -24,6 +24,7 @@ import {
2424 type SkillsHomeEnvSnapshot ,
2525} from "../test-support/home-env.test-support.js" ;
2626import type { SkillEntry , SkillSnapshot } from "../types.js" ;
27+ import { shouldIncludeSkill } from "./config.js" ;
2728import { buildWorkspaceSkillsPrompt } from "./workspace.js" ;
2829
2930vi . mock ( "./plugin-skills.js" , ( ) => ( {
@@ -502,6 +503,62 @@ describe("buildWorkspaceSkillsPrompt", () => {
502503 } ) ;
503504} ) ;
504505
506+ describe ( "shouldIncludeSkill" , ( ) => {
507+ const envName = "OPENCLAW_TEST_SKILL_REQUIREMENT" ;
508+ const entry = makeSkillEntry ( "env-skill" , {
509+ primaryEnv : envName ,
510+ requires : { env : [ envName ] } ,
511+ } ) ;
512+
513+ function shouldInclude ( config ?: OpenClawConfig ) : boolean {
514+ return shouldIncludeSkill ( { entry, config, bundledAllowlist : undefined } ) ;
515+ }
516+
517+ it ( "requires non-blank host and configured env values" , ( ) => {
518+ withClearedEnv ( [ envName ] , ( ) => {
519+ expect ( shouldInclude ( ) ) . toBe ( false ) ;
520+
521+ process . env [ envName ] = " " ;
522+ expect ( shouldInclude ( ) ) . toBe ( false ) ;
523+
524+ process . env [ envName ] = " example " ;
525+ expect ( shouldInclude ( ) ) . toBe ( true ) ;
526+
527+ delete process . env [ envName ] ;
528+ expect (
529+ shouldInclude ( { skills : { entries : { "env-skill" : { env : { [ envName ] : " " } } } } } ) ,
530+ ) . toBe ( false ) ;
531+ expect (
532+ shouldInclude ( {
533+ skills : { entries : { "env-skill" : { env : { [ envName ] : " example " } } } } ,
534+ } ) ,
535+ ) . toBe ( true ) ;
536+ } ) ;
537+ } ) ;
538+
539+ it ( "requires a non-blank primary apiKey" , ( ) => {
540+ withClearedEnv ( [ envName ] , ( ) => {
541+ expect ( shouldInclude ( resolvedSkillApiKeyConfig ( "env-skill" , " " ) ) ) . toBe ( false ) ;
542+ expect ( shouldInclude ( resolvedSkillApiKeyConfig ( "env-skill" , " example " ) ) ) . toBe ( true ) ;
543+ expect ( shouldInclude ( rawSkillApiKeyRefConfig ( "env-skill" ) ) ) . toBe ( true ) ;
544+ } ) ;
545+ } ) ;
546+
547+ it ( "keeps always-on skills eligible without credentials" , ( ) => {
548+ withClearedEnv ( [ envName ] , ( ) => {
549+ expect (
550+ shouldIncludeSkill ( {
551+ entry : makeSkillEntry ( "always-skill" , {
552+ always : true ,
553+ requires : { env : [ envName ] } ,
554+ } ) ,
555+ bundledAllowlist : undefined ,
556+ } ) ,
557+ ) . toBe ( true ) ;
558+ } ) ;
559+ } ) ;
560+ } ) ;
561+
505562describe ( "applySkillEnvOverrides" , ( ) => {
506563 it ( "sets and restores env vars" , ( ) => {
507564 const entries = envSkillEntries ( "env-skill" , {
0 commit comments