BF claw-markdown-preview
Local Markdown preview skill. Trigger when the user explicitly asks to preview a markdown file — e.g. "preview this markdown file", "open markdown preview", "markdown preview", or the Chinese "预览这个 markdown 文件" / "打开 markdown 预览" / "markdown 预览一下".
Local Markdown preview skill.
As a process F 45/100 · Will not run — References files that are not bundled: images/img-xxx.png
How to improve
- The text references files that are not there: add them or drop the references.
- Your own cases (evals/evals.json, 4–6 real requests with expected answers): the full check would then run those instead of a model-drafted suite.
- A spec.yaml with trigger phrases and assertions — a behaviour contract for CI; `skilltest init` writes a template.
Guard findings · 11
✓ No critical or high findings
Medium and low: 11
-
low Secrets in code
secret-high-entropy-tokenassets/lib/converter.js:282High-entropy token-like string (may be an id, hash or a credential)function conv…Svg(cssValue, bgSize) { -
low Secrets in code
secret-high-entropy-tokenassets/lib/converter.js:435High-entropy token-like string (may be an id, hash or a credential)var svgDataUri = conv…Svg(bgImage, bgSize);
-
low Dangerous commands
cmd-background-processassets/lib/highlight.min.js:420Starts a background / autostarted process (string literal in code, not executed)built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","de
code literal -
low Obfuscation
obf-hex-escape-chainassets/lib/markdown-it.min.js:2Escaped/char-code string obfuscation (detector / deny-list definition; security demo / example)!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).markdownit=detectordemo -
low Secrets in code
secret-high-entropy-tokenassets/lib/markdown-it.min.js:2High-entropy token-like string (may be an id, hash or a credential) (detector / deny-list definition)!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).markdownit=detector -
low Dangerous commands
cmd-background-processscripts/preview_server.py:37Starts a background / autostarted process (string literal in code, not executed)macOS/Linux: 双 fork + setsid,成为独立 session leader(PPID=1)。
code literal -
low Dangerous commands
cmd-background-processscripts/preview_server.py:45Starts a background / autostarted processos.setsid()
-
low Dangerous commands
cmd-background-processSKILL.md:39Starts a background / autostarted process (quoted — discussed, not commanded)**第 1 步 —— 以独立进程方式启动服务(关键:必须脱离 WorkBuddy 托管后台任务树,否则对话闲置约 20 分钟服务会被回收而"断开"。脱离由 python 内部跨平台实现,不依赖 shell `setsid`):**
quoted -
low Dangerous commands
cmd-background-processSKILL.md:42Starts a background / autostarted process# 单实例清理:只终止上一次本技能启动的预览实例(PID 文件精确定位),不误伤其他进程。整条命令以 python3 常驻结尾。(脱离托管由 python 内部实现跨平台双 fork/detach,不依赖 shell setsid,多行 if 块部分环境识别不到 python3)。
-
low Dangerous commands
cmd-background-processSKILL.md:46Starts a background / autostarted process (quoted — discussed, not commanded)> 关键:脱离托管由 `preview_server.py` **内部自行实现**(macOS/Linux 用 `os.fork() + os.setsid()` 双 fork 成为独立 session leader,Windows 用 `subprocess.Popen` + `DETACHED_PROCESS` 启动独立实例),脚本自动判断、不依赖 shell 命令。效果与 shell `se
quoted -
low Dangerous commands
cmd-background-processSKILL.md:116Starts a background / autostarted process- **常驻 + 心跳兜底**:服务脱离 WorkBuddy 托管常驻(跨平台,python 内部实现脱离,不依赖 shell setsid),不会因对话闲置 / 切窗口 / 睡眠被回收;页面每 5 秒心跳仅作兜底,关闭页面后最多等待 `--heartbeat-timeout` 秒(默认 120 分钟)才自停,刻意设长以避免后台标签页冻结 / 睡眠误杀
Files scanned: 17. Evidence is masked. Grey chips explain why severity was lowered.
Against the Agent Skills spec
- warning
missing-refreference to a missing file: images/img-xxx.png
Process rating: all ten parameters 45/100
- 0Tools and files. 1 referenced file(s) missing: images/img-xxx.png
- 0Result and completion. Does not say what the result is
- 0Inputs and preconditions. Does not say what the process needs to start
- 0Failures and branches. Linear process with no failure handling
- 0Progress reporting. Says nothing while it works
- 100Steps. 20 steps
- 100When it triggers. States when to use and when not to
- 100Consistency. Name and required fields are in place
- 100Execution cost. Instruction body is 1160 tokens
- 100Running it twice. No mutating operations
Everything here is measured from the skill text rather than judged by a model, so the numbers are checkable. A parameter weighs more when it is a more common reason for the process to stall.
Quality signals
- +4Description does not say when NOT to use the skill (false activations)
- +3Output format is not stated: the model decides each time
- -2localhost URLs: will not work for another user
- +1No license
- +2Single-language instructions
- +5Description quotes 6 example trigger phrases
- +3Description length 248: enough signal without eating the budget
- +4Structure: 10 headings
- +3Step-by-step instructions: 20 items
- +4Has examples (2 code blocks)
- +3All 1 scripts are documented
Quality base 70; lint remarks subtract, signals add up to 100. Result: 84.