Install
openclaw skills install @dora233/sk-63a3cbd6aca1想知道哪根魔杖在等你?走进魔杖商店,让店主替你找到那根属于你的魔杖!不用填表、不用写长串回复,全程就像逛街一样轻松:选我是谁——告诉我「选魔杖」「我的魔杖是什么」或「进店逛逛」,开启测试;点着答——一题一题来,点选答案就够了,选过的自动记住,不累也不易混;一键出卡——答完点「提交判定」,专属杖卡立刻出炉:木材·杖芯·英寸·韧度,世上仅此一根。答累了也不怕:已答 8 题,随时说「就到这里」,剩下的题杖替你答,照样提前出卡。还能「两杖相照」:把朋友的杖码粘进来,看你们是同一棵树、孪生杖,还是互为杖鞘。无论你沉稳可靠还是自由不羁、安静内秀还是光芒外放,总有一根杖在架上等你——万一不满意,随时可以再进
openclaw skills install @dora233/sk-63a3cbd6aca1一家会拐弯才能找到的魔杖商店。店主边量边聊、铺题目、念判词、给出杖卡; 杖这东西,从来是人挑杖,杖也在挑人。
有两条路,题库、权重、阈值、编号、文案完全同源,走哪条结果都一样:
| 检查项 | 结论 | 处理 |
|---|---|---|
| 能否执行脚本 | 有 Python 3 即可 | 走主路径 scripts/wand_shop.py |
| 能否读本地文件 | 能读 data/*.json | 文案、题库、试卷、判定表全部从配置读取 |
| 是否需要降级 | 仅当无法执行脚本 | 不建议降级——计分链路复杂,宁可引导用户换通道 |
Windows 注意:运行时带 -X utf8(或设 PYTHONIOENCODING=utf-8),
否则中文输出会按 GBK 编码乱码。
| 通道 | 何时用 | 怎么走 |
|---|---|---|
| UI 模式(首选) | 能在界面上打开本地 HTML | build_quiz_html.py --out 生成页面,present_files 推给用户点着玩 |
| 纯文本模式 | 纯文本通道 | 下面这套两轮文本协议 |
| 轮次 | 触发条件 | 店主做什么 |
|---|---|---|
| 第 1 轮 | 用户说「选魔杖」「进店逛逛」「我的魔杖是什么」 | --questions:开场白 + 报卷号 + 一屏铺开 27 题 |
| 第 2 轮 | 用户回答案串 | --card "答案串":直接出杖卡(含判词、树籍、复现串) |
没有第 3 轮——杖不征求你的意见,杖只负责选你。用户不满意就请他再测一次(新卷)。
PY="C:\Users\yangduo\.workbuddy\binaries\python\versions\3.13.12\python.exe"
# 第 1 轮:开场 + 一屏题目(随机抽卷;指定卷加 --paper N,便于复现)
"$PY" -X utf8 scripts/wand_shop.py --questions
# 第 2 轮:收答案串(含卷号),出杖卡
"$PY" -X utf8 scripts/wand_shop.py --card "#7:CCBACCBCAACBCBAABCACBACBBBA"
"$PY" -X utf8 scripts/wand_shop.py --card "1A 2B 3C … 27B" --paper 7 # 带题号写法也认
# 提前结束:用户只答了部分就说「就到这里」——部分答案串 + --early,未答按中间项补齐
"$PY" -X utf8 scripts/wand_shop.py --card "#7:CCBACCBC" --early --paper 7
# 两杖相照:入参可以是两个复现串,或两个「木·芯·英寸·韧度」杖名行,混用也行
"$PY" -X utf8 scripts/wand_shop.py --compare "#1:AAA…" "橡木 · 炉心泥 · 11½ 英寸 · 微韧"
# 调试 / 自检
"$PY" -X utf8 scripts/wand_shop.py --scores "#7:…" # 各维度归一化得分
"$PY" -X utf8 scripts/wand_shop.py --random --seed 42 # 随机作答出卡
"$PY" -X utf8 scripts/wand_shop.py --audit # 结构 + 可达性 + 分布 + 禁词
"$PY" -X utf8 scripts/wand_shop.py --selftest # 回归自检
"$PY" -X utf8 scripts/build_quiz_html.py --verify # Python↔JS 对拍(需 node)
| 用户回复 | 处理 |
|---|---|
#7:ABC… / 卷号7 ABC… / ABC… --paper 7 | 都认;卷号缺失 → 退出码 2 + 补卷号提示,不许替用户猜卷号 |
1A 2B … 27C(带题号) | 按题号解析,题号乱序也认 |
| 全角字母/数字、逗号、顿号、空格 | 先归一化再解析 |
| 「就到这里」「不想答了」「先出结果」 | 数用户已交的题数:≥ 8 题(meta.early_exit_min)→ 部分答案串 + --early 直接出卡,卡片印「剩下的它替你答了」;不足 8 题 → 店主劝一句「再给三题的功夫」,用户仍坚持则照样出卡(不拦第二次) |
| 部分答案串(不足 27 个字母) | 未答按该题中间项补齐;带 --early 印早退专属文案,不带则印普通缺答提示。两种都不追问 |
| 漏答(答完 27 题但中间空了几题) | 用中间项补齐,卡片末尾注一句,绝不追问 |
| 退出码 2 的三种错误分开报 | 不是答案 / 字母越界 / 缺卷号,各有各的话术 |
--scores 仅调试用)。四个维度各自独立计分,不互相竞争:
| 维度 | 题量 | 取值 | 测什么 |
|---|---|---|---|
| wood 木材 | 11 | 橡/山楂/桦/紫杉/樱桃/胡桃/白蜡/枫 | 底色:你如何对待世界 |
| core 杖芯 | 8 | 星陨砂/萤火绒/雷纹羽/潮汐珠/炉心泥/雾露晶 | 驱动力:什么让你发光(全自创) |
| len 长度 | 4 | 沉静型 / 均衡型 / 丰盛型 | 表达的浓度 |
| flex 韧度 | 4 | 轻盈 / 微韧 / 挺韧 / 坚硬 | 面对挫折的姿态 |
raw;归一化 score = raw / cap,
cap = 该组全部题目中该值可获得的最高权重之和。meta.tie_break 固定顺序裁决,
同一份答案永远同一个结果。crc32("卷号:答案串") % 10000 + 1,杖历 = 卷号换皮(〇一…二〇)。南坡橡林 第 3194 棵 · 杖历〇七年拣选——这是给用户看的社交身份。#04:ACBAA…(卷号 + 27 个字母)也印在文本卡上;页面里则收进
「复制完整卡」,卡面视觉不突出它。同一份答案 + 同一张卷永远同一根杖、同一树号。woods.json,不要在对话里现编。判定全查表、确定性、可解释,规则顺序在 meta.compare_rules(先命中先得):
| 优先级 | 条件 | 判定 |
|---|---|---|
| 1 | 四项全同 | 复刻 |
| 2 | 木同 + 树号同 | 同一棵树(约 1/10000,稀有彩蛋) |
| 3 | 木同 + 芯同 | 孪生杖 |
| 4 | 木同 + 芯相克 | 同树异芯 |
| 5 | 韧度相对(轻↔硬、韧↔挺) | 互为杖鞘 |
| 6 | 长度一沉一盛 | 互补声部 |
| 7 | 芯相克 + 长相对 + 韧相对 | 相克相成 |
| 8 | 木同 | 同林 |
| 兜底 | 无 | compare_fallback 文案 |
杖芯相克对:星陨砂↔炉心泥、萤火绒↔潮汐珠、雷纹羽↔雾露晶(cores.json 的 clash)。
meta.banned_words_in_questions,--audit 会拦。--audit(可达性 + 随机分布 + 禁词 + 卡宽)。papers.json 由 make_papers.py 固定种子生成(20 张卷,题目与选项顺序都打乱);
改题库后必须重跑 make_papers.py,否则页面用的是旧卷。"$PY" -X utf8 scripts/build_quiz_html.py --out 魔杖商店.html # 生成后必须 present_files
"$PY" -X utf8 scripts/build_quiz_html.py --verify # 改动后必跑(对拍)
产出自包含 HTML:无外链、无依赖,双击即开。页面流程:
ART 模块,与 scripts/make_wand_art.py 同视觉口径),
无 canvas 环境回退 assets/wand_hero.png 静态图;结果页还可用「换个样式看」随时互换。
说明:页内现画不消耗图片生成额度;纯文本模式下若用户想要图,用图片生成工具
(或本地跑 make_wand_art.py --wood … --core …,不耗额度)出图随卡发出。make_wand_art.py 现画(不耗额度),
无法执行脚本再用图片生成工具(提醒消耗额度);简洁版只发排版文字卡。
问一次即可,不反复追问。魔杖选择你/
├── SKILL.md
├── assets/
│ └── wand_hero.png # 静态兜底插画(canvas 不可用时回退;替换后重跑 --out)
├── data/
│ ├── questions.json # 题库 27 题(题干 + 选项 + 权重 + 默认项)
│ ├── woods.json # 8 种木材:树语、判词、画像、林名
│ ├── cores.json # 6 种杖芯:来历、判词、陪伴语、相克对
│ ├── meta.json # 开场白、失败剧本池、长度/韧度档、相照规则、禁词、声明
│ └── papers.json # 试卷库 20 张(make_papers.py 生成,勿手改)
└── scripts/
├── wand_shop.py # --card / --questions / --compare / --audit / --selftest …
├── make_papers.py # 构建期:生成 / 校验 papers.json(固定种子)
├── make_wand_art.py # 离线插画:按杖特画魔杖图(Pillow;纯文本模式出图用)
└── build_quiz_html.py # UI 模式:生成单文件答题页(--out / --verify;页内 canvas 现画专属图)
make_papers.py + --audit + --verify——三件套缺一不可,
否则页面用旧卷、分布失衡或 JS 分叉。--verify 不过就不许发布。^ 0xffffffff——少一个异或,对拍全部翻车(发生过)。-X utf8。