skills-experimental/diagnostic-logs/SKILL.md
# Diagnostic Logs Skill **优先级**: P29 **来源**: Claude Code `diagLogs.ts` **适用场景**: 监控日志、诊断追踪 --- ## 概述 Diagnostic Logs将诊断信息写入JSONL日志文件,用于容器内监控和问题追踪。支持计时包装函数,自动记录started/completed/failed事件。 --- ## 核心功能 ### 1. JSONL日志写入 ```typescript type DiagnosticLogLevel = 'debug' | 'info' | 'warn' | 'error' type DiagnosticLogEntry = { timestamp: string level: DiagnosticLogLevel event: string data: Record<string, unknown> } export function logForDiagnosticsNoPII( level: DiagnosticLogLevel, e
npx skillsauth add bianhaifeng789-hue/openclaw-config skills-experimental/diagnostic-logsInstall 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.
优先级: P29
来源: Claude Code diagLogs.ts
适用场景: 监控日志、诊断追踪
Diagnostic Logs将诊断信息写入JSONL日志文件,用于容器内监控和问题追踪。支持计时包装函数,自动记录started/completed/failed事件。
type DiagnosticLogLevel = 'debug' | 'info' | 'warn' | 'error'
type DiagnosticLogEntry = {
timestamp: string
level: DiagnosticLogLevel
event: string
data: Record<string, unknown>
}
export function logForDiagnosticsNoPII(
level: DiagnosticLogLevel,
event: string,
data?: Record<string, unknown>
): void
export async function withDiagnosticsTiming<T>(
event: string,
fn: () => Promise<T>,
getData?: (result: T) => Record<string, unknown>
): Promise<T>
/**
* Important - this function MUST NOT be called with any PII, including
* file paths, project names, repo names, prompts, etc.
*/
export function logForDiagnosticsNoPII(...): void {
const entry: DiagnosticLogEntry = {
timestamp: new Date().toISOString(),
level,
event,
data: data ?? {}
}
// JSONL格式写入
const line = jsonStringify(entry) + '\n'
fs.appendFileSync(logFile, line)
}
export async function withDiagnosticsTiming<T>(...): Promise<T> {
const startTime = Date.now()
logForDiagnosticsNoPII('info', `${event}_started`)
try {
const result = await fn()
const additionalData = getData ? getData(result) : {}
logForDiagnosticsNoPII('info', `${event}_completed`, {
duration_ms: Date.now() - startTime,
...additionalData
})
return result
} catch (error) {
logForDiagnosticsNoPII('error', `${event}_failed`, {
duration_ms: Date.now() - startTime
})
throw error
}
}
// 日志文件路径由环境变量指定
function getDiagnosticLogFile(): string | undefined {
return process.env.CLAUDE_CODE_DIAGNOSTICS_FILE
}
// OpenClaw扩展:飞书诊断日志
const OPENCLAW_DIAGNOSTICS_FILE = process.env.OPENCLAW_DIAGNOSTICS_FILE
logForDiagnosticsNoPII('info', 'feishu_card_sent', {
cardType: 'progress',
recipient: 'user_id'
})
logForDiagnosticsNoPII('error', 'feishu_api_error', {
error: errorMessage,
endpoint: '/api/card/send'
})
// 包装API调用计时
const result = await withDiagnosticsTiming('feishu_message_send', async () => {
return await feishuApi.sendMessage(...)
}, (result) => ({
messageId: result.message_id,
cardType: result.card_type
}))
{
"skill": "diagnostic-logs",
"priority": "P29",
"source": "diagLogs.ts",
"enabled": true,
"logLevels": ["debug", "info", "warn", "error"],
"logFile": null,
"eventsLogged": 0,
"lastEvent": null,
"createdAt": "2026-04-12T13:00:00Z"
}
diagLogs.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