skills-experimental/deferred-flush-buffered-writer/SKILL.md
# Deferred Flush BufferedWriter Skill Deferred Flush BufferedWriter - createBufferedWriter + flushIntervalMs + maxBufferSize + maxBufferBytes + flushDeferred setImmediate + pendingOverflow coalesce + immediateMode bypass + buffer array + writeFn inject + flush clearTimer + dispose drain + overflow detach。 ## 功能概述 从Claude Code的utils/bufferedWriter.ts提取的Deferred flush bufferedWriter模式,用于OpenClaw的批量写入优化。 ## 核心机制 ### createBufferedWriter ```typescript export function createBufferedWriter({ w
npx skillsauth add bianhaifeng789-hue/openclaw-config skills-experimental/deferred-flush-buffered-writerInstall 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.
Deferred Flush BufferedWriter - createBufferedWriter + flushIntervalMs + maxBufferSize + maxBufferBytes + flushDeferred setImmediate + pendingOverflow coalesce + immediateMode bypass + buffer array + writeFn inject + flush clearTimer + dispose drain + overflow detach。
从Claude Code的utils/bufferedWriter.ts提取的Deferred flush bufferedWriter模式,用于OpenClaw的批量写入优化。
export function createBufferedWriter({
writeFn,
flushIntervalMs = 1000,
maxBufferSize = 100,
maxBufferBytes = Infinity,
immediateMode = false,
}): BufferedWriter
// Factory function
# writeFn injected
# Configurable thresholds
flushIntervalMs = 1000
// Timer-based flush every 1000ms
# Periodic flush
maxBufferSize = 100
// Flush when buffer.length >= 100
# Count threshold
maxBufferBytes = Infinity
// Flush when bufferBytes >= maxBufferBytes
# Bytes threshold
function flushDeferred(): void {
// ...
pendingOverflow = detached
setImmediate(() => {
const toWrite = pendingOverflow
pendingOverflow = null
if (toWrite) writeFn(toWrite.join(''))
})
}
// Deferred flush with setImmediate
# Non-blocking
# writeFn may block (appendFileSync)
# Deferring keeps tick short
if (pendingOverflow) {
// A previous overflow write is still queued. Coalesce into it to preserve ordering.
pendingOverflow.push(...buffer)
buffer = []
bufferBytes = 0
return
}
// Coalesce into pending overflow
# Preserve ordering
# Batch writes
if (immediateMode) {
writeFn(content) // Bypass buffer
return
}
// Immediate mode: no buffering
# Direct write
let buffer: string[] = []
let bufferBytes = 0
// String array buffer
# Track bytes separately
writeFn: WriteFn
// Injected write function
# Dependency injection
# Allows different write targets
function flush(): void {
if (pendingOverflow) {
writeFn(pendingOverflow.join(''))
pendingOverflow = null
}
if (buffer.length === 0) return
writeFn(buffer.join(''))
buffer = []
bufferBytes = 0
clearTimer()
}
// Flush buffer and pendingOverflow
# Clear timer
# Reset buffer
dispose(): void {
flush()
}
// Dispose: drain all buffers
# Cleanup on shutdown
// Detach the buffer synchronously so the caller never waits on writeFn.
// writeFn may block (e.g. errorLogSink.ts appendFileSync) — if overflow fires
// mid-render or mid-keystroke, deferring the write keeps the current tick short.
const detached = buffer
buffer = []
bufferBytes = 0
// Detach buffer synchronously
# Caller never waits
# writeFn deferred
{
"bufferLength": 50,
"bufferBytes": 1024,
"pendingOverflow": ["content1", "content2"],
"flushIntervalMs": 1000
}
setImmediate(() => writeFn()) → deferred → non-blocking → caller never waits on writeFn
# setImmediate deferred write
# 非阻塞
# caller不等待writeFn
pendingOverflow exists → push(...buffer) → coalesce → preserve ordering → batch writes
# pendingOverflow存在时coalesce
# preserve ordering
# batch writes
const detached = buffer → buffer = [] → detached → write later → caller never waits
# 同步detach buffer
# buffer清空
# detached稍后write
# caller不等待
buffer.length >= maxBufferSize | bufferBytes >= maxBufferBytes → overflow → two thresholds
# 双threshold触发overflow
# count threshold
# bytes threshold
immediateMode=true → writeFn(content) directly → no buffer → bypass buffering
# immediateMode直接write
# 不buffer
# bypass buffering
utils/bufferedWriter.ts (100 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