skills-experimental/bundled-skills-pattern/SKILL.md
# Bundled Skills Pattern Skill Bundled Skills Pattern - BundledSkillDefinition + registerBundledSkill + files extraction + Closure-local memoization + extractionPromise + prependBaseDir。 ## 功能概述 从Claude Code的skills/bundledSkills.ts提取的bundled skills模式,用于OpenClaw的内置技能。 ## 核心机制 ### BundledSkillDefinition Type ```typescript export type BundledSkillDefinition = { name: string description: string aliases?: string[] whenToUse?: string argumentHint?: string allowedTools?: string[] mo
npx skillsauth add bianhaifeng789-hue/openclaw-config skills-experimental/bundled-skills-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.
Bundled Skills Pattern - BundledSkillDefinition + registerBundledSkill + files extraction + Closure-local memoization + extractionPromise + prependBaseDir。
从Claude Code的skills/bundledSkills.ts提取的bundled skills模式,用于OpenClaw的内置技能。
export type BundledSkillDefinition = {
name: string
description: string
aliases?: string[]
whenToUse?: string
argumentHint?: string
allowedTools?: string[]
model?: string
disableModelInvocation?: boolean
userInvocable?: boolean
isEnabled?: () => boolean
hooks?: HooksSettings
context?: 'inline' | 'fork'
agent?: string
/**
* Additional reference files to extract to disk on first invocation.
* Keys are relative paths (forward slashes, no `..`), values are content.
* When set, the skill prompt is prefixed with a "Base directory for this
* skill: <dir>" line so the model can Read/Grep these files on demand.
*/
files?: Record<string, string>
getPromptForCommand: (
args: string,
context: ToolUseContext,
) => Promise<ContentBlockParam[]>
}
// Comprehensive skill definition
// files: reference files to extract on first invocation
// getPromptForCommand: async function
export function registerBundledSkill(definition: BundledSkillDefinition): void {
const { files } = definition
let skillRoot: string | undefined
let getPromptForCommand = definition.getPromptForCommand
if (files && Object.keys(files).length > 0) {
skillRoot = getBundledSkillExtractDir(definition.name)
// Closure-local memoization
let extractionPromise: Promise<string | null> | undefined
const inner = definition.getPromptForCommand
getPromptForCommand = async (args, ctx) => {
extractionPromise ??= extractBundledSkillFiles(definition.name, files)
const extractedDir = await extractionPromise
const blocks = await inner(args, ctx)
if (extractedDir === null) return blocks
return prependBaseDir(blocks, extractedDir)
}
}
const command: Command = {
type: 'prompt',
name: definition.name,
// ...
}
bundledSkills.push(command)
}
// Register skill to internal registry
// files: extract on first invocation
// Closure-local memoization (extract once per process)
// Closure-local memoization: extract once per process.
// Memoize the promise (not the result) so concurrent callers await
// the same extraction instead of racing into separate writes.
let extractionPromise: Promise<string | null> | undefined
extractionPromise ??= extractBundledSkillFiles(definition.name, files)
const extractedDir = await extractionPromise
// Memoize promise (not result)
# Concurrent callers await same extraction
# Prevent race condition
return prependBaseDir(blocks, extractedDir)
// Prefix prompt with "Base directory for this skill: <dir>"
// Model can Read/Grep these files on demand
// Same contract as disk-based skills
skillRoot = getBundledSkillExtractDir(definition.name)
// Get extract directory for bundled skill files
// Unique directory per skill
const extractedDir = await extractionPromise
// Extract files to disk on first invocation
// Keys are relative paths (forward slashes, no `..`)
// Values are content
{
"skillName": "healthcheck",
"filesExtracted": true,
"extractDir": "/tmp/healthcheck-skill"
}
files: Record<string, string> → extract on first invocation → Read/Grep on demand
// 首次调用时提取文件
// 模型可Read/Grep这些文件
// 与disk-based skills相同contract
let extractionPromise: Promise | undefined → ??= → concurrent callers await same
// Closure-local memoization
// Memoize promise而非result
// 并发调用者等待同一个extraction
prependBaseDir(blocks, extractedDir) → "Base directory for this skill: <dir>"
// Prompt前缀base directory
// 模型知道文件位置
// 可按需Read/Grep
Keys: relative paths (forward slashes, no `..`) → safe extraction
// 相对路径(forward slashes)
// 不允许`..`
// 安全提取
skills/bundledSkills.tsbusiness
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