skills-experimental/env-truthy-falsy-pattern/SKILL.md
# Env Truthy/Falsy Pattern Skill Env Truthy/Falsy Pattern - isEnvTruthy + isEnvDefinedFalsy + ['1','true','yes','on'] truthy + ['0','false','no','off'] falsy + boolean return + memoize getClaudeConfigHomeDir + CLAUDE_CONFIG_DIR key + normalize().trim().toLowerCase() + hasNodeOption split + parseEnvVars KEY=VALUE。 ## 功能概述 从Claude Code的utils/envUtils.ts提取的Env truthy/falsy模式,用于OpenClaw的环境变量解析。 ## 核心机制 ### isEnvTruthy ```typescript export function isEnvTruthy(envVar: string | boolean | undefin
npx skillsauth add bianhaifeng789-hue/openclaw-config skills-experimental/env-truthy-falsy-patternInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Env Truthy/Falsy Pattern - isEnvTruthy + isEnvDefinedFalsy + ['1','true','yes','on'] truthy + ['0','false','no','off'] falsy + boolean return + memoize getClaudeConfigHomeDir + CLAUDE_CONFIG_DIR key + normalize().trim().toLowerCase() + hasNodeOption split + parseEnvVars KEY=VALUE。
从Claude Code的utils/envUtils.ts提取的Env truthy/falsy模式,用于OpenClaw的环境变量解析。
export function isEnvTruthy(envVar: string | boolean | undefined): boolean {
if (!envVar) return false
if (typeof envVar === 'boolean') return envVar
const normalizedValue = envVar.toLowerCase().trim()
return ['1', 'true', 'yes', 'on'].includes(normalizedValue)
}
// Check if env var is truthy
# ['1', 'true', 'yes', 'on'] = truthy
# Case-insensitive
# Trim whitespace
export function isEnvDefinedFalsy(
envVar: string | boolean | undefined,
): boolean {
if (envVar === undefined) return false
if (typeof envVar === 'boolean') return !envVar
if (!envVar) return false
const normalizedValue = envVar.toLowerCase().trim()
return ['0', 'false', 'no', 'off'].includes(normalizedValue)
}
// Check if env var is explicitly defined as falsy
# undefined → false (not defined)
# ['0', 'false', 'no', 'off'] = defined falsy
# Different from !isEnvTruthy
['1', 'true', 'yes', 'on'].includes(normalizedValue)
// Truthy values
# 1, true, yes, on
# Common conventions
['0', 'false', 'no', 'off'].includes(normalizedValue)
// Defined falsy values
# 0, false, no, off
# Explicitly set to false
if (typeof envVar === 'boolean') return envVar
// Handle boolean directly
# No normalization needed
# Direct return
export const getClaudeConfigHomeDir = memoize(
(): string => {
return (
process.env.CLAUDE_CONFIG_DIR ?? join(homedir(), '.claude')
).normalize('NFC')
},
() => process.env.CLAUDE_CONFIG_DIR,
)
// Memoize with custom key
# 150+ callers on hot paths
# Keyed off CLAUDE_CONFIG_DIR
# Tests changing env get fresh value
() => process.env.CLAUDE_CONFIG_DIR,
// Custom memoize key
# Cache keyed by env var
# Different env → different result
# Tests can change env
envVar.toLowerCase().trim()
// Normalize for comparison
# Case-insensitive
# Trim whitespace
# 'TRUE' → 'true'
export function hasNodeOption(flag: string): boolean {
const nodeOptions = process.env.NODE_OPTIONS
if (!nodeOptions) {
return false
}
return nodeOptions.split(/\s+/).includes(flag)
}
// Check NODE_OPTIONS flag
# Split on whitespace
# Exact match (no partial)
export function parseEnvVars(
rawEnvArgs: string[] | undefined,
): Record<string, string> {
const parsedEnv: Record<string, string> = {}
if (rawEnvArgs) {
for (const envStr of rawEnvArgs) {
const [key, ...valueParts] = envStr.split('=')
if (!key || valueParts.length === 0) {
throw new Error(
`Invalid environment variable format: ${envStr}, should be: -e KEY1=value1`,
)
}
parsedEnv[key] = valueParts.join('=')
}
}
return parsedEnv
}
// Parse KEY=VALUE env vars
# split('=') → [key, ...valueParts]
# valueParts.join('=') handles multiple '='
{
"envVar": "true",
"isTruthy": true,
"isDefinedFalsy": false,
"normalized": "true"
}
['1', 'true', 'yes', 'on'] → truthy | ['0', 'false', 'no', 'off'] → defined falsy → standard conventions
# truthy/falsy arrays
# 标准conventions
# case-insensitive
isEnvDefinedFalsy: undefined → false (not defined) | '0' → true (defined false) → different from !isEnvTruthy
# defined falsy vs undefined
# undefined不算defined falsy
# 与!isEnvTruthy不同
memoize(fn, () => process.env.XXX) → key by env var → tests changing env → fresh result
# memoize with env var key
# 测试改变env时fresh result
# 不需要cache.clear
NODE_OPTIONS.split(/\s+/).includes(flag) → split whitespace → exact match → no partial match
# split whitespace
# exact match
# 防止partial match误判
[key, ...valueParts] = envStr.split('=') → valueParts.join('=') → handles multiple '=' → KEY=a=b=c
# valueParts.join('=')
# 处理多个'='
# KEY=a=b=c → value: a=b=c
utils/envUtils.ts (183 lines)business
IAA 日报飞书输出能力。 支持把固定 CSV 模板一键转换成: - 中文运营结论 - 飞书卡片 JSON - 飞书发送载荷 Use when: - 需要把 IAA 日报直接发到飞书 - 需要从 CSV 一键生成运营日报
data-ai
IAA日报分析模型 功能: - 渠道日报自动分析 - 小时级+日级ROI联动判断 - 按地区输出加量/降量/停投建议 - 按产品类型输出阈值 - 自动识别利润区/观察区/止损区 Use when: - 分析每天投放数据 - 生成运营日报结论 - 判断是否加量/降量/停投 - 对比美加澳/日韩表现 Keywords: - 日报模型, 投放日报, 加量, 降量, 停投, ROI日报, 分地区分析
data-ai
IAA固定日报分析模板 功能: - 固定字段模板(可直接贴每天数据) - 自动输出总盘结论 - 自动输出美加澳/日韩结论 - 自动给出加量/降量/停投建议 - 适配文件修复/清理两类产品 Use when: - 需要固定日报格式 - 每天复盘渠道表现 - 给运营团队出统一结论 Keywords: - 固定模板, 日报模板, ROI模板, IAA日报, 运营模板
development
# HyperlinkPool Pattern Skill HyperlinkPool Pattern - HyperlinkPool class + strings array + stringMap + Index 0 no hyperlink + intern(hyperlink) + get(id) + undefined handling + 5-minute reset + OSC8 hyperlink interning。 ## 功能概述 从Claude Code的ink/screen.ts提取的HyperlinkPool模式,用于OpenClaw的OSC8超链接池管理。 ## 核心机制 ### HyperlinkPool Class ```typescript export class HyperlinkPool { private strings: string[] = [''] // Index 0 = no hyperlink private stringMap = new Map<string, number>() // strings