skills-experimental/csi-parse-pattern/SKILL.md
# CSI Parse Pattern Skill CSI Parse Pattern - parseCSI function + finalByte extraction + privateMode prefix + intermediate bytes + paramStr parsing + params array + p0/p1 defaults + cursor movement cases + erase/insert/delete cases + SGR handling + Action type return。 ## 功能概述 从Claude Code的ink/termio/parser.ts提取的CSI解析模式,用于OpenClaw的ANSI序列语义解析。 ## 核心机制 ### parseCSI Function ```typescript function parseCSI(rawSequence: string): Action | null { const inner = rawSequence.slice(2) // Remove ES
npx skillsauth add bianhaifeng789-hue/openclaw-config skills-experimental/csi-parse-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.
CSI Parse Pattern - parseCSI function + finalByte extraction + privateMode prefix + intermediate bytes + paramStr parsing + params array + p0/p1 defaults + cursor movement cases + erase/insert/delete cases + SGR handling + Action type return。
从Claude Code的ink/termio/parser.ts提取的CSI解析模式,用于OpenClaw的ANSI序列语义解析。
function parseCSI(rawSequence: string): Action | null {
const inner = rawSequence.slice(2) // Remove ESC [
if (inner.length === 0) return null
const finalByte = inner.charCodeAt(inner.length - 1)
const beforeFinal = inner.slice(0, -1)
// Extract final byte and before-final
// Returns Action or null
}
const finalByte = inner.charCodeAt(inner.length - 1)
// Final byte determines command
// e.g., 'A' (0x41) = Cursor Up
if (beforeFinal.length > 0 && '?>='.includes(beforeFinal[0]!)) {
privateMode = beforeFinal[0]!
paramStr = beforeFinal.slice(1)
}
// Private mode prefix: ?, >, =
# e.g., CSI ?25l (cursor hide private)
const intermediateMatch = paramStr.match(/([^0-9;:]+)$/)
if (intermediateMatch) {
intermediate = intermediateMatch[1]!
paramStr = paramStr.slice(0, -intermediate.length)
}
// Intermediate bytes before final
# e.g., CSI 0 SP A (SP = space)
const params = parseCSIParams(paramStr)
// Parse parameters (semicolon and colon separated)
# Returns number array
function parseCSIParams(paramStr: string): number[] {
if (paramStr === '') return []
return paramStr.split(/[;:]/).map(s => (s === '' ? 0 : parseInt(s, 10)))
}
// Split by ; or :
# Empty → 0, else parseInt
const p0 = params[0] ?? 1 // Default 1 if missing
const p1 = params[1] ?? 1
// Default values for missing params
# Most CSI commands default to 1
if (finalByte === CSI.CUU) {
return {
type: 'cursor',
action: { type: 'move', direction: 'up', count: p0 },
}
}
// CUU (A): Cursor Up
# CUD (B): Down, CUF (C): Forward, CUB (D): Back
# CNL (E): Next Line, CPL (F): Prev Line
# CHA (G): Column, CUP (H): Position, VPA (d): Row
if (finalByte === CSI.ED) {
return { type: 'erase', region: p0 === 0 ? 'below' : p0 === 1 ? 'above' : 'all' }
}
// ED (J): Erase in Display
# EL (K): Erase in Line
# ECH (X): Erase Character
if (finalByte === CSI.IL) {
return { type: 'insert', lines: p0 }
}
if (finalByte === CSI.DL) {
return { type: 'delete', lines: p0 }
}
// IL (L): Insert Lines
# DL (M): Delete Lines
# ICH (@): Insert Characters
# DCH (P): Delete Characters
if (finalByte === CSI.SGR && privateMode === '') {
return { type: 'sgr', params: paramStr }
}
// SGR (m): Select Graphic Rendition
# params passed to SGR parser
return {
type: 'cursor' | 'erase' | 'insert' | 'delete' | 'sgr' | 'scroll' | ...,
// specific action fields
}
// Semantic action type
# Not raw sequence string
# Structured representation
{
"finalByte": 65,
"privateMode": "",
"intermediate": "",
"params": [5],
"action": {"type": "cursor", "direction": "up", "count": 5}
}
finalByte → command identification → 'A'=CUU, 'B'=CUD, 'J'=ED, 'm'=SGR
# final byte决定command
# 不同final byte不同action
'?>=' prefix → private mode → CSI ?25l (cursor hide) → different from CSI 25l
# private mode prefix: ?, >, =
# 私有sequence不同于标准
paramStr.match(/([^0-9;:]+)$/) → intermediate bytes → between params and final
# intermediate bytes在params和final之间
# regex提取
params[0] ?? 1 → default 1 → most CSI commands count defaults to 1
# params缺失默认1
# 大多数CSI commands count默认1
parseCSI → Action (cursor/erase/insert/delete/sgr) → semantic meaning → not raw string
# parseCSI返回语义Action
# 不是raw sequence string
# 结构化representation
ink/termio/parser.ts (394 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