Install
openclaw skills install @dora233/npcopenclaw skills install @dora233/npc不是「测你是哪种 NPC」,是「查出你被哪套机制写死了」。
MBTI 告诉你「你是什么人」,这张卡告诉你「你被什么卡住了」。前者贴标签,后者给参数——参数是可以动的。
对外风味:冷幽默、系统口吻、准确优先于温柔。
| 通道 | 何时用 | 怎么走 |
|---|---|---|
| UI 模式(首选) | 能打开本地 HTML | scripts/build_quiz_html.py --out <路径> 生成单文件点选页。一屏一题、点选即记、可回退、提交出卡,带复制完整卡 |
| 纯文本模式 | 只有对话框 | 第 1 轮 --questions 一屏铺开 12 题;第 2 轮收答案串 --card "<串>" 出卡 |
纯文本模式两轮闭环,没有第三轮。
# 1. 出题(把 stdout 原样发给用户)
python -X utf8 scripts/npc.py --questions
# 2. 收答案串出卡(把卡片原文发出)
python -X utf8 scripts/npc.py --card "1A 2B 3C 4D 5A 6B 7C 8D 9A 10B 11C 12D"
# 3. 可选:单个类型的完整档案
python -X utf8 scripts/npc.py --list
Windows 下所有 python 调用必须带 -X utf8,否则中文输出按 GBK 乱码。
| 用户回复 | 处理 |
|---|---|
| 答案串(含/不含题号、全角半角、逗号顿号空格换行) | --card 全部识别,先归一化再解析 |
| 「就到这里」「不想答了」 | 数已交题数:≥ 8 题直接出卡,未答按默认项补齐,卡片末尾注「剩下的系统替你答了」;不足 8 题劝一句,仍坚持则照样出卡(不拦第二次) |
| 漏答 | 用该题默认项补齐,末尾注一句,绝不追问 |
| 完全没识别到答案 | 退出码 2 + [系统] 没识别到答案。至少要给我一个 A/B/C/D。 不许替用户猜 |
| 对结果不服 | 「同样的答案永远得到同一张卡。想换结果,就换个答案。」不重判同一份答案 |
| 用户想吐槽结果 | 跟着玩,不解释算法。这个 Skill 的乐趣一半在评论区 |
完整机制写在 references/mechanics.md,改数据前必读。 三句话版本:
mean(sign × z) 取最高。⚠️ echo(回声)轴不能删。 它区分「说不出」(端口关闭)和「说了没人接」(端口开着、对面没人)——后者是这个 Skill 最有价值的那一类用户。由来见 mechanics.md 第一节。
完整规范在 references/style-guide.md,写任何判词前必读。 核心三条:
meta.banned_words,audit 强制扫描):加油 / 你可以的 / 突破自我 / 走出舒适区 / 成为更好的自己 / 你值得 / 正能量 / 赋能 / 抓手 / 闭环 / 打工人。出口协议(认真模式):当浓度 ≥ 78 且回声 ≥ 65 时,系统必须收起全部玩笑,输出 meta.exit_text。这是幽默的保险丝,不是可选项。出口段落里不许出现任何修辞、比喻、数字游戏。
见 references/mechanics.md 第二节。一句话版本:
路人甲(这条街本身)· 告示板(只发任务)· 铁匠(产能黑洞)· 守卫(风险的替身)· 酒馆老板(情报中枢,没人问他)· 治疗师(血包)· 隐藏 NPC(前代主角,没触发)· 传送点(中台)· 公告员(说了,没人听) · 稀有解「你不是 NPC」。
两条不能破的原则:
references/npc-pov.md。
不默认触发、不进主流程、不做推荐。 只在用户明确说「换个视角写」「NPC 视角」「从那个路人角度写」时进入。它和主流程共用一套观察方法,但是两件独立的事——硬缝在一起会让主线变得不干净。
meta.disclaimer)不可删。python -X utf8 scripts/npc.py --calibrate # 重算锚点+stats,看九型分布
python -X utf8 scripts/npc.py --audit # 九型可达 + 禁词 + 占位符 + 卡片宽度
python -X utf8 scripts/npc.py --selftest # 确定性 + 解析容错 + 漏答补齐
python -X utf8 scripts/build_quiz_html.py --out npc-demo.html # 重新生成点选页 + 自动真机冒烟
python -X utf8 scripts/build_quiz_html.py --verify # JS 与 Python 引擎对拍(需 node)
顺序不能颠倒,且第 4 步最容易漏——页面的锚点是构建时写死的,改了阈值不重新生成,页面和命令行会给出不同结果。
达标线:九型全部可达;单型 4%–17%;稀有解 3%–6%;卡片最宽 ≤ 54 列;禁词 0 命中;真机冒烟零 pageerror。
真机冒烟不可跳过。 引擎对拍(--verify)只覆盖计算逻辑,抓不到渲染层的致命错:
function top(){}曾让整页全黑——top是 window 的不可配置内置属性,浏览器在 解析期就抛 SyntaxError,整个<script>不执行,而 Node mock 环境里没有 window.top, 测试照样绿。前端产物的「能不能显示」只有真机说了算(详见references/web-pitfalls.md)。
npc-awakening/
├── SKILL.md
├── data/
│ ├── questions.json # 12 题(含七轴权重 + 默认项)
│ ├── types.json # 九型 + 稀有解(判词 / 支线 / 特征轴 / 姿态)
│ └── meta.json # 锚点 / stats / 坐标区划 / 开场白 / 出口文案 / 禁词
├── scripts/
│ ├── npc.py # 主引擎:--questions / --card / --calibrate / --audit / --selftest / --list
│ ├── build_quiz_html.py# 单文件点选页生成 + --verify 对拍
│ └── engine.js # (可选)如需独立 JS 引擎,从此处抽
├── references/
│ ├── mechanics.md # 七轴 / 九型 / 判定 / 达标线 / 改数据流程
│ ├── style-guide.md # 文风三段式 / 六手法 / 禁词 / 出口协议 / 世界观纪律
│ ├── lines.md # 台词库(含 Dora 提供的同事口头禅)
│ └── npc-pov.md # NPC 视角写作(非必填模块)
└── npc-demo.html # 单文件点选页(构建产物)