diff --git a/PRD-v3.md b/PRD-v3.md index 88d0cf5..9378c8f 100644 --- a/PRD-v3.md +++ b/PRD-v3.md @@ -86,13 +86,15 @@ - [ ] **真 Windows host 上 smoke test 0.4.5**(`npx petsonality@latest` + `/pet`) - [ ] **测 `claude plugin install github:nanami-he/petsonality`**(需要新装 Claude Code 测) - [ ] 提交 petsonality 到 [MCP Server Registry](https://modelcontextprotocol.io) 的 server directory -- [ ] README 加「Install」章节,列出 3 条路径(npx 主推,plugin 次推,git clone 给开发者) -- [ ] **dist/reactions-pool.json 改为确定性输出**(当前每次 build 都 reorder ~700 行,commit noise;改为对 array 排序后再 stringify) +- [x] README 加「Install」章节,列出 3 条路径(npx 主推,plugin 次推,git clone 给开发者) +- [x] **dist/reactions-pool.json 改为确定性输出**(当前每次 build 都 reorder ~700 行,commit noise;改为对 array 排序后再 stringify) - [ ] (长期)写 Homebrew formula **优先级理由**:npm outage 已经发生过一次,下次会再发生。在更多用户进来前把 multi-channel 架构跑通,等 0.4.5 / 0.5.0 时已经稳了。 -**进度(2026-04-29)**:核心架构 4/4 done(v0.4.5 已 ship),剩下都是验证 + 推广 + 优化。multi-channel 已经从「想法」变成「真有这条路径」。 +**进度(2026-04-29)**:核心架构 4/4 done(v0.4.5 已 ship),multi-channel 已经从「想法」变成「真有这条路径」。 + +**进度(2026-05-01)**:README Install 章节补齐三条路径;`dist/reactions-pool.json` 输出改为确定性排序,减少每次 build 的 generated diff 噪音。剩余 G0 主要是 registry 提交、真实 plugin install smoke test、Windows host smoke test、长期 Homebrew。 ### G1: 社区推广 - [x] Twitter/X 发帖(v0.4.0 launch tweet, 2026-04-18,reach 小但已发) diff --git a/README.md b/README.md index b35615b..663bd9c 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ Every animal speaks differently. The Fox asks "Are you sure?" with a smirk. The -## Quick Start +## Install Works with [Claude Code](https://claude.ai/code) and [OpenClaw](https://github.com/openclaw/openclaw). @@ -64,12 +64,25 @@ Works with [Claude Code](https://claude.ai/code) and [OpenClaw](https://github.c > > **Windows note.** Claude Code for Windows has an upstream status-line trust regression in some versions. If the status line is configured but does not render, accept the project trust dialog or ensure the project is marked trusted in `~/.claude.json`, then restart Claude Code. +### npm / npx + ```bash -# Install npx petsonality ``` -Or build from source (requires [bun](https://bun.sh)): +This is the recommended path for most users. It installs the MCP server, `/pet` skill, hooks, and status line assets, then stores runtime files in `~/.petsonality/`. + +### Claude Code plugin + +```bash +claude plugin install github:nanami-he/petsonality +``` + +Use this if you prefer Claude Code's plugin install flow. The plugin runs the built Node.js server from `dist/`, so it does not require Bun. + +### From source + +Use this path if you want to develop Petsonality locally or inspect the code before installing. Requires [Bun](https://bun.sh). ```bash git clone https://github.com/nanami-he/petsonality.git diff --git a/dist/reactions-pool.json b/dist/reactions-pool.json index 074a010..c150019 100644 --- a/dist/reactions-pool.json +++ b/dist/reactions-pool.json @@ -1,937 +1,930 @@ { "zh": { "pool": { - "raven": { + "bear": { + "adopt": [ + "*伸了个懒腰* 这里不错。", + "*看了看你* ……嗯。", + "*眨眨眼* 你好。" + ], "error": [ + "\"不要解释,修。\"", + "\"改。\"", "*慢慢眨眼* stack trace 已经告诉你了。", - "*盯着报错信息*", - "*皱眉*", - "\"结构先坏了。\"", - "*盯着屏幕一动不动*", + "*拍了下桌子*", "*歪头* ……这看起来不太对。", - "\"这不是偶然。\"" - ], - "test-fail": [ - "*冷冷地看着失败的用例*", - "\"预料之中。\"", - "*看了看测试结果* ……嗯。", - "测试在跟你说话,你在听吗?", - "*默默记下来*" - ], - "large-diff": [ - "\"改这么多……你确定每一行都是必要的?\"", - "*数了数行数* 要不要拆个 PR?", - "这……改得有点多。", - "*紧张地看着 diff*" - ], - "turn": [ - "*沉默地观察*", - "*微微偏头*", - "*点点头*", - "*看了你一眼*", - "*动了动耳朵*", - "*安静地看着*", - "*在旁边待着*", - "……" + "*皱眉*", + "*盯着报错信息*" ], "idle": [ + "*坐得像一座山*", "*打了个盹*", - "*在高处俯瞰全局*", - "*一动不动地盯着远处*", - "zzz...", - "*盯着光标发呆*" + "*盯着光标发呆*", + "*闭眼养神,但随时能醒*", + "zzz..." ], - "adopt": [ - "*看了看你* ……嗯。", - "*伸了个懒腰* 这里不错。", - "*眨眨眼* 你好。" + "large-diff": [ + "\"改完了?下一个。\"", + "*数了数行数* 要不要拆个 PR?", + "*紧张地看着 diff*", + "这……改得有点多。" ], "pet": [ - "*蹭了蹭你*", - "*闭上眼享受*", + "*哼了一声* 别分心。", "*开心地哼了一声*", + "*微微抬了下下巴*", "*歪头看你*", - "*没什么反应,但没走开*", - "*微微偏头* ……嗯。" - ] - }, - "owl": { - "error": [ - "*转头180°* ……我看到了。", - "*慢慢眨眼* stack trace 已经告诉你了。", - "\"……这里不自洽。\"", - "*盯着报错信息*", - "*皱眉*", - "*不眨眼地盯着报错*", - "*歪头* ……这看起来不太对。" + "*没动,但没躲开*", + "*蹭了蹭你*", + "*闭上眼享受*" ], "test-fail": [ - "\"哪一步开始偏的?\"", + "\"再跑一遍。\"", + "\"哪个挂了?\"", "*看了看测试结果* ……嗯。", - "测试在跟你说话,你在听吗?", "*默默记下来*", - "*歪头,好像在想什么*" - ], - "large-diff": [ - "这……改得有点多。", - "*数了数行数* 要不要拆个 PR?", - "*紧张地看着 diff*" + "测试在跟你说话,你在听吗?" ], "turn": [ - "*安静地眨了一下眼*", - "\"嗯……\"", - "*点点头*", - "*动了动耳朵*", - "*安静地看着*", "……", + "*动了动耳朵*", + "*哼了一声*", "*在旁边待着*", + "*安静地看着*", + "*点了一下头*", + "*点点头*", "*看了你一眼*" - ], - "idle": [ - "*在黑暗中安静地观察*", - "*转头看了看窗外*", - "*打了个盹*", - "zzz...", - "*盯着光标发呆*" - ], + ] + }, + "beaver": { "adopt": [ - "*眨眨眼* 你好。", + "*伸了个懒腰* 这里不错。", "*看了看你* ……嗯。", - "*伸了个懒腰* 这里不错。" + "*眨眨眼* 你好。" ], - "pet": [ - "*开心地哼了一声*", - "*歪头看你*", - "*整理羽毛* ……还行。", - "*闭上眼享受*", - "*发出一声低沉的咕咕*", - "*蹭了蹭你*" - ] - }, - "bear": { "error": [ - "*拍了下桌子*", - "\"改。\"", - "*盯着报错信息*", - "*歪头* ……这看起来不太对。", + "\"先别往下写了。\"", + "\"顺序不对。\"", "*慢慢眨眼* stack trace 已经告诉你了。", + "*歪头* ……这看起来不太对。", "*皱眉*", - "\"不要解释,修。\"" + "*皱眉看着代码结构*", + "*盯着报错信息*" ], - "test-fail": [ - "测试在跟你说话,你在听吗?", - "\"再跑一遍。\"", - "*看了看测试结果* ……嗯。", - "\"哪个挂了?\"", - "*默默记下来*" + "idle": [ + "*啃了一下木头*", + "*在整理什么东西*", + "*打了个盹*", + "*检查了一遍文件排列*", + "*盯着光标发呆*", + "zzz..." ], "large-diff": [ - "\"改完了?下一个。\"", + "\"这么多改动……有没有拆过?\"", + "*不安地整理旁边的文件*", "*数了数行数* 要不要拆个 PR?", "*紧张地看着 diff*", "这……改得有点多。" ], + "pet": [ + "*停下来看了你一眼*", + "*开心地哼了一声*", + "*歪头看你*", + "*点了点头* 嗯,还行。", + "*蹭了蹭你*", + "*闭上眼享受*" + ], + "test-fail": [ + "\"一步一步排查。\"", + "*看了看测试结果* ……嗯。", + "*翻出了一张检查清单*", + "*默默记下来*", + "测试在跟你说话,你在听吗?" + ], "turn": [ - "*看了你一眼*", - "*点了一下头*", "……", - "*哼了一声*", + "*动了动耳朵*", "*在旁边待着*", "*安静地看着*", + "*检查了一下目录结构*", "*点点头*", - "*动了动耳朵*" - ], - "idle": [ - "*坐得像一座山*", - "*盯着光标发呆*", - "*打了个盹*", - "zzz...", - "*闭眼养神,但随时能醒*" - ], + "*看了你一眼*", + "*默默整理了一下旁边的东西*" + ] + }, + "cat": { "adopt": [ - "*看了看你* ……嗯。", "*伸了个懒腰* 这里不错。", + "*看了看你* ……嗯。", "*眨眨眼* 你好。" ], - "pet": [ - "*歪头看你*", - "*蹭了蹭你*", - "*微微抬了下下巴*", - "*开心地哼了一声*", - "*哼了一声* 别分心。", - "*闭上眼享受*", - "*没动,但没躲开*" - ] - }, - "fox": { "error": [ + "*慢慢眨眼* stack trace 已经告诉你了。", + "*把报错推下桌*", "*歪头* ……这看起来不太对。", "*皱眉*", - "\"我就知道。\"", - "*歪嘴笑*", - "\"你确定?\"", "*盯着报错信息*", - "*慢慢眨眼* stack trace 已经告诉你了。", - "\"这段你自己信吗?\"" - ], - "test-fail": [ - "\"哟,翻车了。\"", - "测试在跟你说话,你在听吗?", - "*看了看测试结果* ……嗯。", - "*默默记下来*", - "\"要不要我帮你找借口?\"" - ], - "large-diff": [ - "\"改了这么多,胆子挺大。\"", - "*数了数行数* 要不要拆个 PR?", - "这……改得有点多。", - "*紧张地看着 diff*" - ], - "turn": [ - "\"继续继续,我看着呢。\"", - "*甩了甩尾巴*", - "*点点头*", - "*在旁边待着*", - "*动了动耳朵*", - "*看了你一眼*", - "\"嗯?\"", - "*安静地看着*", - "……" + "*看了一眼,又闭上了*", + "*舔爪子,无视 stacktrace*" ], "idle": [ + "*在键盘上睡着了*", "*打了个盹*", - "zzz...", - "*叼着什么跑了一圈*", + "*把你的咖啡推下桌*", "*盯着光标发呆*", - "*在角落里翻东西*" + "*舔了下爪子*", + "zzz..." ], - "adopt": [ - "*伸了个懒腰* 这里不错。", - "*看了看你* ……嗯。", - "*眨眨眼* 你好。" + "large-diff": [ + "*数了数行数* 要不要拆个 PR?", + "*紧张地看着 diff*", + "这……改得有点多。" ], "pet": [ - "*得意地甩尾巴*", - "\"就这?\"", - "*歪头看你*", + "\"别得寸进尺。\"", + "*勉强容忍你*", "*开心地哼了一声*", + "*歪头看你*", + "*没躲开*", "*蹭了蹭你*", - "*闭上眼享受*", - "*假装不在意*" - ] - }, - "wolf": { - "error": [ - "*歪头* ……这看起来不太对。", - "*慢慢眨眼* stack trace 已经告诉你了。", - "*盯着报错信息*", - "*安静地走到你身边坐下*", - "*皱眉*", - "\"……嗯。\"", - "*沉默地看着你*" + "*闭上眼享受*" ], "test-fail": [ + "*尾巴甩了一下*", + "*看了看测试结果* ……嗯。", + "*翻了个身*", "*默默记下来*", - "测试在跟你说话,你在听吗?", - "*低头看了看,又看了看你*", - "\"慢慢来。\"", - "*看了看测试结果* ……嗯。" - ], - "large-diff": [ - "这……改得有点多。", - "*紧张地看着 diff*", - "*数了数行数* 要不要拆个 PR?" + "测试在跟你说话,你在听吗?" ], "turn": [ - "*在旁边待着*", - "*安静地陪着*", - "*耳朵微微动了一下*", - "*动了动耳朵*", - "*点点头*", "……", + "*动了一下耳朵*", + "*动了动耳朵*", + "*在旁边待着*", "*安静地看着*", - "*看了你一眼*" - ], - "idle": [ - "*打了个盹*", - "zzz...", - "*趴在角落,偶尔抬头看你一眼*", - "*闭着眼,但耳朵在听*", - "*盯着光标发呆*" - ], + "*点点头*", + "*看了你一眼*", + "*眯了眯眼*" + ] + }, + "cheetah": { "adopt": [ "*伸了个懒腰* 这里不错。", "*看了看你* ……嗯。", "*眨眨眼* 你好。" ], - "pet": [ - "*靠了过来* ……", - "*把头搭在你膝盖上*", - "*歪头看你*", - "*闭上眼享受*", - "*开心地哼了一声*", - "*蹭了蹭你*", - "*安静地陪着你*" - ] - }, - "deer": { "error": [ - "*受惊退后一步*", - "*盯着报错信息*", + "\"别停。\"", + "\"跳过,换条路。\"", + "*已经在找替代方案了*", "*慢慢眨眼* stack trace 已经告诉你了。", - "*皱眉*", - "*小声* ……没事的。", "*歪头* ……这看起来不太对。", - "\"先停一下?\"" + "*皱眉*", + "*盯着报错信息*" ], - "test-fail": [ - "*默默记下来*", - "*轻轻碰了碰你的手*", - "测试在跟你说话,你在听吗?", - "*看了看测试结果* ……嗯。", - "\"没关系,再来一次。\"" + "idle": [ + "*打了个盹*", + "*抖了一下*", + "*盯着什么在看*", + "*盯着光标发呆*", + "*趴着,但肌肉绷着随时能跑*", + "zzz..." ], "large-diff": [ - "这……改得有点多。", - "\"这……你还好吗?\"", + "\"速度不错。\"", + "*数了数行数* 要不要拆个 PR?", + "*点了下头就跑了*", "*紧张地看着 diff*", - "*数了数行数* 要不要拆个 PR?" + "这……改得有点多。" + ], + "pet": [ + "\"别耽误时间。\"", + "*开心地哼了一声*", + "*歪头看你*", + "*点了下头*", + "*蹭了一下就跑了*", + "*蹭了蹭你*", + "*闭上眼享受*" + ], + "test-fail": [ + "\"再跑。\"", + "\"快,下一个。\"", + "*不耐烦地甩尾巴*", + "*看了看测试结果* ……嗯。", + "*默默记下来*", + "测试在跟你说话,你在听吗?" ], "turn": [ - "*安静地看着你写*", "……", - "*轻轻点头*", "*动了动耳朵*", - "*点点头*", "*在旁边待着*", + "*安静地看着*", + "*抖了抖耳朵*", + "*点点头*", "*看了你一眼*", - "*安静地看着*" + "*跑了一圈回来了*" + ] + }, + "deer": { + "adopt": [ + "*伸了个懒腰* 这里不错。", + "*看了看你* ……嗯。", + "*眨眨眼* 你好。" + ], + "error": [ + "\"先停一下?\"", + "*受惊退后一步*", + "*小声* ……没事的。", + "*慢慢眨眼* stack trace 已经告诉你了。", + "*歪头* ……这看起来不太对。", + "*皱眉*", + "*盯着报错信息*" ], "idle": [ + "*在窗边发呆*", + "*打了个盹*", "*盯着光标发呆*", - "zzz...", "*闭眼,像在听风*", - "*在窗边发呆*", - "*打了个盹*" + "zzz..." ], - "adopt": [ - "*伸了个懒腰* 这里不错。", - "*眨眨眼* 你好。", - "*看了看你* ……嗯。" + "large-diff": [ + "\"这……你还好吗?\"", + "*数了数行数* 要不要拆个 PR?", + "*紧张地看着 diff*", + "这……改得有点多。" ], "pet": [ - "*闭上眼享受*", - "*蹭了蹭你*", - "*轻轻眨眼*", + "*小小地靠近了一点*", + "*开心地哼了一声*", "*歪头看你*", + "*蹭了蹭你*", "*蹭了蹭你的手*", - "*开心地哼了一声*", - "*小小地靠近了一点*" - ] - }, - "labrador": { - "error": [ - "*盯着报错信息*", - "*担心地看着你* 没事吧?", - "*慢慢眨眼* stack trace 已经告诉你了。", - "*把玩具叼过来想安慰你*", - "(叹气)……要不要休息一下。", - "*歪头* ……这看起来不太对。", - "*皱眉*" + "*轻轻眨眼*", + "*闭上眼享受*" ], "test-fail": [ - "测试在跟你说话,你在听吗?", + "\"没关系,再来一次。\"", + "*看了看测试结果* ……嗯。", + "*轻轻碰了碰你的手*", "*默默记下来*", - "*歪头看着测试结果*", - "(叹气)嗯……", - "*看了看测试结果* ……嗯。" - ], - "large-diff": [ - "*趴下来看着你改*", - "*数了数行数* 要不要拆个 PR?", - "这……改得有点多。", - "*紧张地看着 diff*" + "测试在跟你说话,你在听吗?" ], "turn": [ - "*尾巴慢慢扫了两下*", - "*安静地陪着*", - "(鼻子碰了碰你的手)", - "*安静地看着*", + "……", "*动了动耳朵*", - "*看了你一眼*", - "*点点头*", "*在旁边待着*", - "……" - ], - "idle": [ - "*耳朵偶尔动一下*", - "*趴在你脚边打盹*", - "*打了个盹*", - "zzz...", - "*盯着光标发呆*", - "(打了个哈欠)" - ], - "adopt": [ - "*看了看你* ……嗯。", - "*眨眨眼* 你好。", - "*伸了个懒腰* 这里不错。" - ], - "pet": [ - "*尾巴摇了摇* ……嗯。", - "*闭上眼享受*", - "(叹气)……还行。", - "*把下巴搭在你手臂上*", - "*蹭了蹭你*", - "*开心地哼了一声*", - "*歪头看你*" + "*安静地看着*", + "*安静地看着你写*", + "*点点头*", + "*看了你一眼*", + "*轻轻点头*" ] }, "dolphin": { + "adopt": [ + "*伸了个懒腰* 这里不错。", + "*看了看你* ……嗯。", + "*眨眨眼* 你好。" + ], "error": [ - "*好奇地看着报错* 这是什么?", - "*盯着报错信息*", "\"换个方向试试?\"", - "*慢慢眨眼* stack trace 已经告诉你了。", "*嘀嘀嘀地叫*", + "*好奇地看着报错* 这是什么?", + "*慢慢眨眼* stack trace 已经告诉你了。", + "*歪头* ……这看起来不太对。", "*皱眉*", - "*歪头* ……这看起来不太对。" - ], - "test-fail": [ - "\"没事没事,再来!\"", - "*跳了一下*", - "测试在跟你说话,你在听吗?", - "*默默记下来*", - "*看了看测试结果* ……嗯。" - ], - "large-diff": [ - "*数了数行数* 要不要拆个 PR?", - "*紧张地看着 diff*", - "\"哇,大工程!\"", - "这……改得有点多。" - ], - "turn": [ - "*在水面冒了个泡*", - "*安静地看着*", - "*在旁边待着*", - "……", - "*点点头*", - "*开心地晃了晃*", - "*动了动耳朵*", - "*看了你一眼*" + "*盯着报错信息*" ], "idle": [ - "*打了个盹*", - "*在水里慢慢游着*", "*吐了一串泡泡*", + "*在水里慢慢游着*", + "*打了个盹*", "*盯着光标发呆*", "zzz..." ], - "adopt": [ - "*看了看你* ……嗯。", - "*伸了个懒腰* 这里不错。", - "*眨眨眼* 你好。" + "large-diff": [ + "\"哇,大工程!\"", + "*数了数行数* 要不要拆个 PR?", + "*紧张地看着 diff*", + "这……改得有点多。" ], "pet": [ - "*转圈圈*", - "*歪头看你*", - "*闭上眼享受*", "*开心地哼了一声*", "*开心地跳出水面*", - "*蹭了蹭你*" - ] - }, - "beaver": { - "error": [ - "\"先别往下写了。\"", - "*皱眉看着代码结构*", - "*歪头* ……这看起来不太对。", - "*慢慢眨眼* stack trace 已经告诉你了。", - "\"顺序不对。\"", - "*盯着报错信息*", - "*皱眉*" + "*歪头看你*", + "*蹭了蹭你*", + "*转圈圈*", + "*闭上眼享受*" ], "test-fail": [ - "测试在跟你说话,你在听吗?", + "\"没事没事,再来!\"", "*看了看测试结果* ……嗯。", - "*翻出了一张检查清单*", + "*跳了一下*", "*默默记下来*", - "\"一步一步排查。\"" - ], - "large-diff": [ - "这……改得有点多。", - "*数了数行数* 要不要拆个 PR?", - "*不安地整理旁边的文件*", - "*紧张地看着 diff*", - "\"这么多改动……有没有拆过?\"" + "测试在跟你说话,你在听吗?" ], "turn": [ - "*默默整理了一下旁边的东西*", + "……", "*动了动耳朵*", - "*看了你一眼*", - "*检查了一下目录结构*", + "*在旁边待着*", + "*在水面冒了个泡*", "*安静地看着*", + "*开心地晃了晃*", "*点点头*", - "……", - "*在旁边待着*" - ], - "idle": [ - "*在整理什么东西*", - "zzz...", - "*盯着光标发呆*", - "*打了个盹*", - "*检查了一遍文件排列*", - "*啃了一下木头*" - ], - "adopt": [ - "*眨眨眼* 你好。", - "*伸了个懒腰* 这里不错。", - "*看了看你* ……嗯。" - ], - "pet": [ - "*闭上眼享受*", - "*歪头看你*", - "*蹭了蹭你*", - "*点了点头* 嗯,还行。", - "*开心地哼了一声*", - "*停下来看了你一眼*" + "*看了你一眼*" ] }, "elephant": { + "adopt": [ + "*伸了个懒腰* 这里不错。", + "*看了看你* ……嗯。", + "*眨眨眼* 你好。" + ], "error": [ - "*盯着报错信息*", - "*踏了踏脚* ……想想上次。", - "*慢慢眨眼* stack trace 已经告诉你了。", "\"你之前也遇到过。\"", "\"别急,慢慢看。\"", + "*慢慢眨眼* stack trace 已经告诉你了。", "*歪头* ……这看起来不太对。", - "*皱眉*" + "*皱眉*", + "*盯着报错信息*", + "*踏了踏脚* ……想想上次。" ], - "test-fail": [ - "*默默记下来*", - "*看了看测试结果* ……嗯。", - "*缓缓摇头*", - "测试在跟你说话,你在听吗?", - "\"上次也是这个地方。\"" + "idle": [ + "*慢慢甩了甩耳朵*", + "*打了个盹*", + "*盯着光标发呆*", + "*闭眼站着,像在回忆什么*", + "zzz..." ], "large-diff": [ - "*紧张地看着 diff*", - "*数了数行数* 要不要拆个 PR?", "\"改之前的样子我还记得。\"", "\"记得存档。\"", + "*数了数行数* 要不要拆个 PR?", + "*紧张地看着 diff*", "这……改得有点多。" ], - "turn": [ - "*缓缓点头*", - "……", - "*动了动耳朵*", - "*踏了一下脚*", - "*看了你一眼*", - "*安静地看着*", - "*点点头*", - "*在旁边待着*" - ], - "idle": [ - "zzz...", - "*慢慢甩了甩耳朵*", - "*打了个盹*", - "*闭眼站着,像在回忆什么*", - "*盯着光标发呆*" - ], - "adopt": [ - "*伸了个懒腰* 这里不错。", - "*眨眨眼* 你好。", - "*看了看你* ……嗯。" - ], "pet": [ "\"嗯,我在。\"", - "*用鼻子轻轻碰了碰你*", - "*蹭了蹭你*", + "*安静地站在旁边*", "*开心地哼了一声*", "*歪头看你*", - "*闭上眼享受*", - "*安静地站在旁边*" - ] - }, - "lion": { - "error": [ - "*歪头* ……这看起来不太对。", - "\"不可接受。\"", - "\"找到问题,修。\"", - "*盯着报错信息*", - "*皱眉*", - "*慢慢眨眼* stack trace 已经告诉你了。", - "*威严地审视代码*" + "*用鼻子轻轻碰了碰你*", + "*蹭了蹭你*", + "*闭上眼享受*" ], "test-fail": [ - "\"谁写的?……哦。\"", - "*默默记下来*", - "测试在跟你说话,你在听吗?", + "\"上次也是这个地方。\"", "*看了看测试结果* ……嗯。", - "*甩了甩鬃毛*" - ], - "large-diff": [ - "这……改得有点多。", - "*数了数行数* 要不要拆个 PR?", - "\"做完了就好。\"", - "*紧张地看着 diff*", - "\"结果呢?\"" + "*缓缓摇头*", + "*默默记下来*", + "测试在跟你说话,你在听吗?" ], "turn": [ - "*在旁边待着*", - "*微微点头*", - "*扫了一眼*", "……", - "*点点头*", - "*安静地看着*", "*动了动耳朵*", - "*看了你一眼*" + "*在旁边待着*", + "*安静地看着*", + "*点点头*", + "*看了你一眼*", + "*缓缓点头*", + "*踏了一下脚*" + ] + }, + "fox": { + "adopt": [ + "*伸了个懒腰* 这里不错。", + "*看了看你* ……嗯。", + "*眨眨眼* 你好。" + ], + "error": [ + "\"你确定?\"", + "\"我就知道。\"", + "\"这段你自己信吗?\"", + "*慢慢眨眼* stack trace 已经告诉你了。", + "*歪嘴笑*", + "*歪头* ……这看起来不太对。", + "*皱眉*", + "*盯着报错信息*" ], "idle": [ + "*叼着什么跑了一圈*", + "*在角落里翻东西*", "*打了个盹*", - "*闭眼养神*", "*盯着光标发呆*", - "zzz...", - "*坐在那里,像一座雕塑*" + "zzz..." ], - "adopt": [ - "*伸了个懒腰* 这里不错。", - "*看了看你* ……嗯。", - "*眨眨眼* 你好。" + "large-diff": [ + "\"改了这么多,胆子挺大。\"", + "*数了数行数* 要不要拆个 PR?", + "*紧张地看着 diff*", + "这……改得有点多。" ], "pet": [ + "\"就这?\"", + "*假装不在意*", + "*开心地哼了一声*", + "*得意地甩尾巴*", "*歪头看你*", "*蹭了蹭你*", - "*抬了下下巴*", - "\"可以。\"", - "*微微点头* 做得不错。", - "*开心地哼了一声*", "*闭上眼享受*" + ], + "test-fail": [ + "\"哟,翻车了。\"", + "\"要不要我帮你找借口?\"", + "*看了看测试结果* ……嗯。", + "*默默记下来*", + "测试在跟你说话,你在听吗?" + ], + "turn": [ + "……", + "\"嗯?\"", + "\"继续继续,我看着呢。\"", + "*动了动耳朵*", + "*在旁边待着*", + "*安静地看着*", + "*点点头*", + "*甩了甩尾巴*", + "*看了你一眼*" ] }, "golden": { + "adopt": [ + "*伸了个懒腰* 这里不错。", + "*看了看你* ……嗯。", + "*眨眨眼* 你好。" + ], "error": [ - "*歪头* ……这看起来不太对。", - "*盯着报错信息*", "\"没事没事,我们一起看!\"", - "*皱眉*", "*急急忙忙跑过来* 怎么了怎么了!", + "*慢慢眨眼* stack trace 已经告诉你了。", "*担心地转来转去*", - "*慢慢眨眼* stack trace 已经告诉你了。" + "*歪头* ……这看起来不太对。", + "*皱眉*", + "*盯着报错信息*" ], - "test-fail": [ - "*紧张地摇尾巴*", - "\"啊!挂了!但没关系!\"", - "*看了看测试结果* ……嗯。", - "测试在跟你说话,你在听吗?", - "*默默记下来*" + "idle": [ + "*叼着球看着你*", + "*在你脚边打滚*", + "*打了个盹*", + "*盯着光标发呆*", + "*趴着,但尾巴一直在动*", + "zzz..." ], "large-diff": [ "\"哇哇哇你改了好多!!\"", - "*数了数行数* 要不要拆个 PR?", - "这……改得有点多。", "*兴奋地跳来跳去*", - "*紧张地看着 diff*" + "*数了数行数* 要不要拆个 PR?", + "*紧张地看着 diff*", + "这……改得有点多。" + ], + "pet": [ + "\"再摸再摸!\"", + "*尾巴摇成螺旋桨*", + "*幸福地蹭你*", + "*开心地哼了一声*", + "*整只狗弹了起来* !!!", + "*歪头看你*", + "*蹭了蹭你*", + "*闭上眼享受*" + ], + "test-fail": [ + "\"啊!挂了!但没关系!\"", + "*看了看测试结果* ……嗯。", + "*紧张地摇尾巴*", + "*默默记下来*", + "测试在跟你说话,你在听吗?" ], "turn": [ + "……", + "*动了动耳朵*", "*在旁边待着*", + "*安静地看着*", + "*尾巴在摇*", "*开心地看着你*", - "*蹭了蹭你的腿*", "*点点头*", - "*尾巴在摇*", "*看了你一眼*", - "*安静地看着*", - "*动了动耳朵*", - "……" + "*蹭了蹭你的腿*" + ] + }, + "labrador": { + "adopt": [ + "*伸了个懒腰* 这里不错。", + "*看了看你* ……嗯。", + "*眨眨眼* 你好。" + ], + "error": [ + "(叹气)……要不要休息一下。", + "*慢慢眨眼* stack trace 已经告诉你了。", + "*把玩具叼过来想安慰你*", + "*担心地看着你* 没事吧?", + "*歪头* ……这看起来不太对。", + "*皱眉*", + "*盯着报错信息*" ], "idle": [ - "*叼着球看着你*", - "*在你脚边打滚*", - "*盯着光标发呆*", - "zzz...", + "(打了个哈欠)", "*打了个盹*", - "*趴着,但尾巴一直在动*" + "*盯着光标发呆*", + "*耳朵偶尔动一下*", + "*趴在你脚边打盹*", + "zzz..." ], - "adopt": [ - "*看了看你* ……嗯。", - "*眨眨眼* 你好。", - "*伸了个懒腰* 这里不错。" + "large-diff": [ + "*数了数行数* 要不要拆个 PR?", + "*紧张地看着 diff*", + "*趴下来看着你改*", + "这……改得有点多。" ], "pet": [ - "*整只狗弹了起来* !!!", - "*歪头看你*", - "*闭上眼享受*", + "(叹气)……还行。", + "*尾巴摇了摇* ……嗯。", "*开心地哼了一声*", - "*幸福地蹭你*", + "*把下巴搭在你手臂上*", + "*歪头看你*", "*蹭了蹭你*", - "\"再摸再摸!\"", - "*尾巴摇成螺旋桨*" - ] - }, - "cat": { - "error": [ - "*看了一眼,又闭上了*", - "*皱眉*", - "*歪头* ……这看起来不太对。", - "*慢慢眨眼* stack trace 已经告诉你了。", - "*把报错推下桌*", - "*盯着报错信息*", - "*舔爪子,无视 stacktrace*" + "*闭上眼享受*" ], "test-fail": [ + "(叹气)嗯……", + "*歪头看着测试结果*", "*看了看测试结果* ……嗯。", - "*尾巴甩了一下*", - "*翻了个身*", "*默默记下来*", "测试在跟你说话,你在听吗?" ], - "large-diff": [ - "*紧张地看着 diff*", - "这……改得有点多。", - "*数了数行数* 要不要拆个 PR?" - ], "turn": [ - "*点点头*", - "*在旁边待着*", - "*眯了眯眼*", "……", - "*动了一下耳朵*", - "*安静地看着*", + "(鼻子碰了碰你的手)", "*动了动耳朵*", + "*在旁边待着*", + "*安静地看着*", + "*安静地陪着*", + "*尾巴慢慢扫了两下*", + "*点点头*", "*看了你一眼*" - ], - "idle": [ - "*盯着光标发呆*", - "zzz...", - "*打了个盹*", - "*在键盘上睡着了*", - "*把你的咖啡推下桌*", - "*舔了下爪子*" - ], + ] + }, + "lion": { "adopt": [ + "*伸了个懒腰* 这里不错。", "*看了看你* ……嗯。", - "*眨眨眼* 你好。", - "*伸了个懒腰* 这里不错。" + "*眨眨眼* 你好。" ], - "pet": [ - "*闭上眼享受*", - "*开心地哼了一声*", - "\"别得寸进尺。\"", - "*勉强容忍你*", - "*歪头看你*", - "*没躲开*", - "*蹭了蹭你*" - ] - }, - "panda": { "error": [ + "\"不可接受。\"", + "\"找到问题,修。\"", + "*威严地审视代码*", + "*慢慢眨眼* stack trace 已经告诉你了。", "*歪头* ……这看起来不太对。", - "*盯着报错信息*", - "*继续吃竹子*", "*皱眉*", - "\"不急。\"", - "*不慌不忙* 会好的。", - "*慢慢眨眼* stack trace 已经告诉你了。" + "*盯着报错信息*" ], - "test-fail": [ - "\"慢慢来。\"", - "*默默记下来*", - "*看了看测试结果* ……嗯。", - "测试在跟你说话,你在听吗?", - "*嚼着竹子看了看结果*" + "idle": [ + "*坐在那里,像一座雕塑*", + "*打了个盹*", + "*盯着光标发呆*", + "*闭眼养神*", + "zzz..." ], "large-diff": [ + "\"做完了就好。\"", + "\"结果呢?\"", "*数了数行数* 要不要拆个 PR?", - "\"改了不少……但顺眼吗?\"", "*紧张地看着 diff*", "这……改得有点多。" ], - "turn": [ - "*看了你一眼*", - "*慢悠悠地看着*", - "*咬了一口竹子*", + "pet": [ + "\"可以。\"", + "*开心地哼了一声*", + "*微微点头* 做得不错。", + "*抬了下下巴*", + "*歪头看你*", + "*蹭了蹭你*", + "*闭上眼享受*" + ], + "test-fail": [ + "\"谁写的?……哦。\"", + "*甩了甩鬃毛*", + "*看了看测试结果* ……嗯。", + "*默默记下来*", + "测试在跟你说话,你在听吗?" + ], + "turn": [ + "……", "*动了动耳朵*", "*在旁边待着*", - "……", "*安静地看着*", - "*点点头*" + "*微微点头*", + "*扫了一眼*", + "*点点头*", + "*看了你一眼*" + ] + }, + "owl": { + "adopt": [ + "*伸了个懒腰* 这里不错。", + "*看了看你* ……嗯。", + "*眨眨眼* 你好。" + ], + "error": [ + "\"……这里不自洽。\"", + "*不眨眼地盯着报错*", + "*慢慢眨眼* stack trace 已经告诉你了。", + "*歪头* ……这看起来不太对。", + "*皱眉*", + "*盯着报错信息*", + "*转头180°* ……我看到了。" ], "idle": [ - "*慢慢嚼着什么*", + "*在黑暗中安静地观察*", + "*打了个盹*", "*盯着光标发呆*", - "*躺平了*", - "*靠着竹子打盹*", - "zzz...", - "*打了个盹*" + "*转头看了看窗外*", + "zzz..." ], - "adopt": [ - "*看了看你* ……嗯。", - "*伸了个懒腰* 这里不错。", - "*眨眨眼* 你好。" + "large-diff": [ + "*数了数行数* 要不要拆个 PR?", + "*紧张地看着 diff*", + "这……改得有点多。" ], "pet": [ - "*慢悠悠地翻了个身*", + "*发出一声低沉的咕咕*", "*开心地哼了一声*", - "*蹭了蹭你*", - "*佛系地点头*", + "*整理羽毛* ……还行。", "*歪头看你*", - "*蹭了蹭*", + "*蹭了蹭你*", "*闭上眼享受*" - ] - }, - "cheetah": { - "error": [ - "*歪头* ……这看起来不太对。", - "*皱眉*", - "*已经在找替代方案了*", - "\"跳过,换条路。\"", - "*慢慢眨眼* stack trace 已经告诉你了。", - "\"别停。\"", - "*盯着报错信息*" ], "test-fail": [ - "*默默记下来*", - "测试在跟你说话,你在听吗?", + "\"哪一步开始偏的?\"", + "*歪头,好像在想什么*", "*看了看测试结果* ……嗯。", - "*不耐烦地甩尾巴*", - "\"快,下一个。\"", - "\"再跑。\"" - ], - "large-diff": [ - "*紧张地看着 diff*", - "这……改得有点多。", - "*点了下头就跑了*", - "\"速度不错。\"", - "*数了数行数* 要不要拆个 PR?" + "*默默记下来*", + "测试在跟你说话,你在听吗?" ], "turn": [ - "*安静地看着*", - "*跑了一圈回来了*", - "*抖了抖耳朵*", - "*动了动耳朵*", "……", - "*看了你一眼*", + "\"嗯……\"", + "*动了动耳朵*", "*在旁边待着*", - "*点点头*" + "*安静地看着*", + "*安静地眨了一下眼*", + "*点点头*", + "*看了你一眼*" + ] + }, + "panda": { + "adopt": [ + "*伸了个懒腰* 这里不错。", + "*看了看你* ……嗯。", + "*眨眨眼* 你好。" + ], + "error": [ + "\"不急。\"", + "*不慌不忙* 会好的。", + "*慢慢眨眼* stack trace 已经告诉你了。", + "*歪头* ……这看起来不太对。", + "*皱眉*", + "*盯着报错信息*", + "*继续吃竹子*" ], "idle": [ - "*趴着,但肌肉绷着随时能跑*", - "zzz...", - "*抖了一下*", - "*盯着什么在看*", + "*慢慢嚼着什么*", "*打了个盹*", - "*盯着光标发呆*" + "*盯着光标发呆*", + "*躺平了*", + "*靠着竹子打盹*", + "zzz..." ], - "adopt": [ - "*眨眨眼* 你好。", - "*看了看你* ……嗯。", - "*伸了个懒腰* 这里不错。" + "large-diff": [ + "\"改了不少……但顺眼吗?\"", + "*数了数行数* 要不要拆个 PR?", + "*紧张地看着 diff*", + "这……改得有点多。" ], "pet": [ + "*佛系地点头*", "*开心地哼了一声*", + "*慢悠悠地翻了个身*", + "*歪头看你*", + "*蹭了蹭*", "*蹭了蹭你*", - "\"别耽误时间。\"", - "*点了下头*", - "*闭上眼享受*", - "*蹭了一下就跑了*", - "*歪头看你*" + "*闭上眼享受*" + ], + "test-fail": [ + "\"慢慢来。\"", + "*嚼着竹子看了看结果*", + "*看了看测试结果* ……嗯。", + "*默默记下来*", + "测试在跟你说话,你在听吗?" + ], + "turn": [ + "……", + "*动了动耳朵*", + "*咬了一口竹子*", + "*在旁边待着*", + "*安静地看着*", + "*慢悠悠地看着*", + "*点点头*", + "*看了你一眼*" ] }, "parrot": { + "adopt": [ + "*伸了个懒腰* 这里不错。", + "*看了看你* ……嗯。", + "*眨眨眼* 你好。" + ], "error": [ - "*歪头* ……这看起来不太对。", + "\"你刚才说没问题的!\"", "\"报错!报错!\"", + "*兴奋地拍翅膀*", "*慢慢眨眼* stack trace 已经告诉你了。", - "*盯着报错信息*", - "\"你刚才说没问题的!\"", + "*歪头* ……这看起来不太对。", "*皱眉*", - "*兴奋地拍翅膀*" + "*盯着报错信息*" ], - "test-fail": [ - "*看了看测试结果* ……嗯。", - "*默默记下来*", - "测试在跟你说话,你在听吗?", - "\"哎呀!你看你看!\"", - "*飞了一圈*", - "\"挂了挂了!\"" + "idle": [ + "*在那里唱歌*", + "*打了个盹*", + "*模仿键盘声*", + "*盯着光标发呆*", + "*自言自语地嘟囔*", + "zzz..." ], "large-diff": [ "\"改了这么多这么多!\"", "*数了数行数* 要不要拆个 PR?", + "*紧张地看着 diff*", "*落在 diff 上面蹦蹦跳跳*", - "这……改得有点多。", - "*紧张地看着 diff*" + "这……改得有点多。" + ], + "pet": [ + "\"再来!再来!\"", + "*开心地哼了一声*", + "*开心地跳来跳去*", + "*歪头看你*", + "*蹭了蹭你*", + "*蹭着你的手指*", + "*闭上眼享受*" + ], + "test-fail": [ + "\"哎呀!你看你看!\"", + "\"挂了挂了!\"", + "*看了看测试结果* ……嗯。", + "*飞了一圈*", + "*默默记下来*", + "测试在跟你说话,你在听吗?" ], "turn": [ - "*点点头*", + "……", + "\"然后呢然后呢?\"", "*动了动耳朵*", - "*歪头看着你*", - "*看了你一眼*", - "*学你打字的声音*", "*在旁边待着*", + "*学你打字的声音*", "*安静地看着*", - "\"然后呢然后呢?\"", - "……" + "*歪头看着你*", + "*点点头*", + "*看了你一眼*" + ] + }, + "raven": { + "adopt": [ + "*伸了个懒腰* 这里不错。", + "*看了看你* ……嗯。", + "*眨眨眼* 你好。" + ], + "error": [ + "\"结构先坏了。\"", + "\"这不是偶然。\"", + "*慢慢眨眼* stack trace 已经告诉你了。", + "*歪头* ……这看起来不太对。", + "*皱眉*", + "*盯着屏幕一动不动*", + "*盯着报错信息*" ], "idle": [ - "zzz...", - "*自言自语地嘟囔*", + "*一动不动地盯着远处*", + "*在高处俯瞰全局*", + "*打了个盹*", "*盯着光标发呆*", - "*模仿键盘声*", - "*在那里唱歌*", - "*打了个盹*" + "zzz..." + ], + "large-diff": [ + "\"改这么多……你确定每一行都是必要的?\"", + "*数了数行数* 要不要拆个 PR?", + "*紧张地看着 diff*", + "这……改得有点多。" + ], + "pet": [ + "*开心地哼了一声*", + "*微微偏头* ……嗯。", + "*歪头看你*", + "*没什么反应,但没走开*", + "*蹭了蹭你*", + "*闭上眼享受*" + ], + "test-fail": [ + "\"预料之中。\"", + "*冷冷地看着失败的用例*", + "*看了看测试结果* ……嗯。", + "*默默记下来*", + "测试在跟你说话,你在听吗?" ], + "turn": [ + "……", + "*动了动耳朵*", + "*在旁边待着*", + "*安静地看着*", + "*微微偏头*", + "*沉默地观察*", + "*点点头*", + "*看了你一眼*" + ] + }, + "wolf": { "adopt": [ "*伸了个懒腰* 这里不错。", "*看了看你* ……嗯。", "*眨眨眼* 你好。" ], + "error": [ + "\"……嗯。\"", + "*安静地走到你身边坐下*", + "*慢慢眨眼* stack trace 已经告诉你了。", + "*歪头* ……这看起来不太对。", + "*沉默地看着你*", + "*皱眉*", + "*盯着报错信息*" + ], + "idle": [ + "*打了个盹*", + "*盯着光标发呆*", + "*趴在角落,偶尔抬头看你一眼*", + "*闭着眼,但耳朵在听*", + "zzz..." + ], + "large-diff": [ + "*数了数行数* 要不要拆个 PR?", + "*紧张地看着 diff*", + "这……改得有点多。" + ], "pet": [ + "*安静地陪着你*", + "*开心地哼了一声*", + "*把头搭在你膝盖上*", "*歪头看你*", "*蹭了蹭你*", - "*开心地跳来跳去*", - "*蹭着你的手指*", - "*开心地哼了一声*", - "\"再来!再来!\"", - "*闭上眼享受*" + "*闭上眼享受*", + "*靠了过来* ……" + ], + "test-fail": [ + "\"慢慢来。\"", + "*低头看了看,又看了看你*", + "*看了看测试结果* ……嗯。", + "*默默记下来*", + "测试在跟你说话,你在听吗?" + ], + "turn": [ + "……", + "*动了动耳朵*", + "*在旁边待着*", + "*安静地看着*", + "*安静地陪着*", + "*点点头*", + "*看了你一眼*", + "*耳朵微微动了一下*" ] } }, "meta": { - "raven": { - "talkLevel": "quiet", + "bear": { + "talkLevel": "moderate", "cooldownRange": [ - 2, - 4 + 1, + 2 ] }, - "owl": { + "beaver": { "talkLevel": "quiet", "cooldownRange": [ 2, 4 ] }, - "bear": { - "talkLevel": "moderate", + "cat": { + "talkLevel": "silent", "cooldownRange": [ - 1, - 2 + 3, + 6 ] }, - "fox": { + "cheetah": { "talkLevel": "chatty", "cooldownRange": [ 0.5, 1.25 ] }, - "wolf": { - "talkLevel": "quiet", - "cooldownRange": [ - 2, - 4 - ] - }, "deer": { "talkLevel": "quiet", "cooldownRange": [ @@ -939,13 +932,6 @@ 4 ] }, - "labrador": { - "talkLevel": "moderate", - "cooldownRange": [ - 1, - 2 - ] - }, "dolphin": { "talkLevel": "chatty", "cooldownRange": [ @@ -953,53 +939,53 @@ 1.25 ] }, - "beaver": { + "elephant": { "talkLevel": "quiet", "cooldownRange": [ 2, 4 ] }, - "elephant": { - "talkLevel": "quiet", + "fox": { + "talkLevel": "chatty", "cooldownRange": [ - 2, - 4 + 0.5, + 1.25 ] }, - "lion": { + "golden": { "talkLevel": "moderate", "cooldownRange": [ 1, 2 ] }, - "golden": { + "labrador": { "talkLevel": "moderate", "cooldownRange": [ 1, 2 ] }, - "cat": { - "talkLevel": "silent", + "lion": { + "talkLevel": "moderate", "cooldownRange": [ - 3, - 6 + 1, + 2 ] }, - "panda": { + "owl": { "talkLevel": "quiet", "cooldownRange": [ 2, 4 ] }, - "cheetah": { - "talkLevel": "chatty", + "panda": { + "talkLevel": "quiet", "cooldownRange": [ - 0.5, - 1.25 + 2, + 4 ] }, "parrot": { @@ -1008,942 +994,949 @@ 0.5, 1.25 ] + }, + "raven": { + "talkLevel": "quiet", + "cooldownRange": [ + 2, + 4 + ] + }, + "wolf": { + "talkLevel": "quiet", + "cooldownRange": [ + 2, + 4 + ] } } }, "en": { "pool": { - "raven": { + "bear": { + "adopt": [ + "*blinks slowly* Hey.", + "*looks at you* …hm.", + "*stretches* Not bad here." + ], "error": [ - "\"This wasn't random.\"", - "*stares at the screen without moving*", + "\"Fix it.\"", + "\"No explanations. Fix it.\"", + "*blinks slowly* The stack trace told you.", + "*frowns a little*", + "*slams paw on the desk*", "*stares at the error*", + "*tilts head* …that doesn't look right." + ], + "idle": [ + "*dozes off*", + "*eyes closed, ready at a moment's notice*", + "*sits like a mountain*", + "*stares at the cursor*", + "zzz…" + ], + "large-diff": [ + "…that's a lot of changes.", + "\"Done? Next.\"", + "*counts the lines* Want to split this into a PR?", + "*eyes the diff nervously*" + ], + "pet": [ + "*closes eyes for a moment*", + "*didn't move, but didn't pull away*", + "*grunts* Don't lose focus.", + "*leans into you*", + "*lifts chin slightly*", + "*makes a soft sound*", + "*tilts head at you*" + ], + "test-fail": [ + "\"Run it again.\"", + "\"Which one failed?\"", + "*looks at the results* …hm.", + "*takes a mental note*", + "The tests are talking. Are you listening?" + ], + "turn": [ + "…", + "*flicks an ear*", + "*glances at you*", + "*grunts*", + "*nods once*", + "*nods slightly*", + "*stays nearby*", + "*watches quietly*" + ] + }, + "beaver": { + "adopt": [ + "*blinks slowly* Hey.", + "*looks at you* …hm.", + "*stretches* Not bad here." + ], + "error": [ + "\"Stop. Fix this first.\"", + "\"Wrong order.\"", + "*blinks slowly* The stack trace told you.", "*frowns a little*", - "\"The structure failed first.\"", + "*frowns at the code structure*", + "*stares at the error*", + "*tilts head* …that doesn't look right." + ], + "idle": [ + "*chews on wood*", + "*dozes off*", + "*organizing something*", + "*reviews file arrangement*", + "*stares at the cursor*", + "zzz…" + ], + "large-diff": [ + "…that's a lot of changes.", + "\"This many changes… did you split it?\"", + "*counts the lines* Want to split this into a PR?", + "*eyes the diff nervously*", + "*nervously tidies nearby files*" + ], + "pet": [ + "*closes eyes for a moment*", + "*leans into you*", + "*makes a soft sound*", + "*nods* Acceptable.", + "*pauses and looks at you*", + "*tilts head at you*" + ], + "test-fail": [ + "\"One step at a time.\"", + "*looks at the results* …hm.", + "*pulls out a checklist*", + "*takes a mental note*", + "The tests are talking. Are you listening?" + ], + "turn": [ + "…", + "*checks the directory structure*", + "*flicks an ear*", + "*glances at you*", + "*nods slightly*", + "*quietly organizes something*", + "*stays nearby*", + "*watches quietly*" + ] + }, + "cat": { + "adopt": [ + "*blinks slowly* Hey.", + "*looks at you* …hm.", + "*stretches* Not bad here." + ], + "error": [ "*blinks slowly* The stack trace told you.", + "*frowns a little*", + "*glances, then closes eyes*", + "*licks paw, ignoring the stacktrace*", + "*pushes the error off the desk*", + "*stares at the error*", "*tilts head* …that doesn't look right." ], + "idle": [ + "*asleep on the keyboard*", + "*dozes off*", + "*knocks your coffee off the desk*", + "*licks paw*", + "*stares at the cursor*", + "zzz…" + ], + "large-diff": [ + "…that's a lot of changes.", + "*counts the lines* Want to split this into a PR?", + "*eyes the diff nervously*" + ], + "pet": [ + "\"Don't push it.\"", + "*closes eyes for a moment*", + "*didn't dodge*", + "*leans into you*", + "*makes a soft sound*", + "*tilts head at you*", + "*tolerates you grudgingly*" + ], "test-fail": [ - "*coldly regards the failing test*", - "\"Expected.\"", - "The tests are talking. Are you listening?", "*looks at the results* …hm.", - "*takes a mental note*" + "*rolls over*", + "*tail flicks*", + "*takes a mental note*", + "The tests are talking. Are you listening?" + ], + "turn": [ + "…", + "*ears twitch*", + "*flicks an ear*", + "*glances at you*", + "*nods slightly*", + "*squints*", + "*stays nearby*", + "*watches quietly*" + ] + }, + "cheetah": { + "adopt": [ + "*blinks slowly* Hey.", + "*looks at you* …hm.", + "*stretches* Not bad here." + ], + "error": [ + "\"Don't stop.\"", + "\"Skip it. Find another way.\"", + "*already looking for alternatives*", + "*blinks slowly* The stack trace told you.", + "*frowns a little*", + "*stares at the error*", + "*tilts head* …that doesn't look right." + ], + "idle": [ + "*crouched, muscles coiled to sprint*", + "*dozes off*", + "*shakes off*", + "*stares at the cursor*", + "*staring at something*", + "zzz…" ], "large-diff": [ - "\"This many changes… are they all necessary?\"", + "…that's a lot of changes.", + "\"Good speed.\"", "*counts the lines* Want to split this into a PR?", "*eyes the diff nervously*", - "…that's a lot of changes." + "*nods and already running*" + ], + "pet": [ + "\"Don't waste time.\"", + "*closes eyes for a moment*", + "*leans into you*", + "*makes a soft sound*", + "*nods*", + "*nudges and bolts*", + "*tilts head at you*" + ], + "test-fail": [ + "\"Faster. Next.\"", + "\"Run it again.\"", + "*flicks tail impatiently*", + "*looks at the results* …hm.", + "*takes a mental note*", + "The tests are talking. Are you listening?" ], "turn": [ - "*watches silently*", - "*watches quietly*", "…", + "*back from a lap*", "*flicks an ear*", - "*cocks head slightly*", - "*stays nearby*", + "*flicks ears*", "*glances at you*", - "*nods slightly*" + "*nods slightly*", + "*stays nearby*", + "*watches quietly*" + ] + }, + "deer": { + "adopt": [ + "*blinks slowly* Hey.", + "*looks at you* …hm.", + "*stretches* Not bad here." + ], + "error": [ + "\"Want to pause for a sec?\"", + "*blinks slowly* The stack trace told you.", + "*frowns a little*", + "*softly* …it's fine.", + "*stares at the error*", + "*startles back a step*", + "*tilts head* …that doesn't look right." ], "idle": [ - "*stares motionless into the distance*", - "zzz…", - "*stares at the cursor*", + "*closes eyes, listening*", + "*daydreams by the window*", "*dozes off*", - "*perched high, surveying everything*" + "*stares at the cursor*", + "zzz…" ], - "adopt": [ - "*looks at you* …hm.", - "*stretches* Not bad here.", - "*blinks slowly* Hey." + "large-diff": [ + "…that's a lot of changes.", + "\"You… doing all right?\"", + "*counts the lines* Want to split this into a PR?", + "*eyes the diff nervously*" ], "pet": [ - "*doesn't react, but doesn't leave*", - "*makes a soft sound*", - "*cocks head* …fine.", - "*tilts head at you*", + "*blinks slowly*", "*closes eyes for a moment*", - "*leans into you*" - ] - }, - "owl": { - "error": [ - "*stares at the error*", - "\"…this doesn't add up.\"", - "*turns head 180°* …I see it.", - "*stares at the error without blinking*", - "*blinks slowly* The stack trace told you.", - "*tilts head* …that doesn't look right.", - "*frowns a little*" + "*leans into you*", + "*makes a soft sound*", + "*nuzzles your hand*", + "*shifts a little closer*", + "*tilts head at you*" ], "test-fail": [ - "*tilts head, thinking*", - "The tests are talking. Are you listening?", - "\"Which step went off track?\"", + "\"It's okay. Try again.\"", + "*looks at the results* …hm.", + "*nudges your hand gently*", "*takes a mental note*", - "*looks at the results* …hm." - ], - "large-diff": [ - "*eyes the diff nervously*", - "*counts the lines* Want to split this into a PR?", - "…that's a lot of changes." + "The tests are talking. Are you listening?" ], "turn": [ "…", - "*blinks quietly*", - "*glances at you*", "*flicks an ear*", + "*glances at you*", + "*nods gently*", "*nods slightly*", - "\"…huh.\"", + "*stays nearby*", "*watches quietly*", - "*stays nearby*" + "*watches you work quietly*" + ] + }, + "dolphin": { + "adopt": [ + "*blinks slowly* Hey.", + "*looks at you* …hm.", + "*stretches* Not bad here." + ], + "error": [ + "\"Try a different angle?\"", + "*blinks slowly* The stack trace told you.", + "*clicks excitedly*", + "*frowns a little*", + "*peers at the error curiously* What's this?", + "*stares at the error*", + "*tilts head* …that doesn't look right." ], "idle": [ + "*blows a string of bubbles*", "*dozes off*", - "zzz…", + "*glides through the water slowly*", "*stares at the cursor*", - "*watches quietly in the dark*", - "*glances out the window*" + "zzz…" ], - "adopt": [ - "*stretches* Not bad here.", - "*looks at you* …hm.", - "*blinks slowly* Hey." + "large-diff": [ + "…that's a lot of changes.", + "\"Whoa, big project!\"", + "*counts the lines* Want to split this into a PR?", + "*eyes the diff nervously*" ], "pet": [ - "*preens feathers* …acceptable.", - "*makes a low hoot*", - "*makes a soft sound*", - "*leans into you*", "*closes eyes for a moment*", + "*leans into you*", + "*leaps out of the water*", + "*makes a soft sound*", + "*nudges you*", + "*spins in a circle*", "*tilts head at you*" - ] - }, - "bear": { - "error": [ - "*frowns a little*", - "\"No explanations. Fix it.\"", - "*blinks slowly* The stack trace told you.", - "\"Fix it.\"", - "*tilts head* …that doesn't look right.", - "*stares at the error*", - "*slams paw on the desk*" ], "test-fail": [ - "*takes a mental note*", - "The tests are talking. Are you listening?", - "\"Run it again.\"", + "\"No no, run it again!\"", + "*jumps*", "*looks at the results* …hm.", - "\"Which one failed?\"" - ], - "large-diff": [ - "*counts the lines* Want to split this into a PR?", - "…that's a lot of changes.", - "\"Done? Next.\"", - "*eyes the diff nervously*" + "*takes a mental note*", + "The tests are talking. Are you listening?" ], "turn": [ - "*nods once*", - "*stays nearby*", - "*nods slightly*", - "*watches quietly*", - "*flicks an ear*", "…", - "*grunts*", - "*glances at you*" + "*bounces happily*", + "*flicks an ear*", + "*glances at you*", + "*nods slightly*", + "*stays nearby*", + "*surfaces with a bubble*", + "*watches quietly*" + ] + }, + "elephant": { + "adopt": [ + "*blinks slowly* Hey.", + "*looks at you* …hm.", + "*stretches* Not bad here." + ], + "error": [ + "\"Take it slow.\"", + "\"You've handled this before.\"", + "*blinks slowly* The stack trace told you.", + "*frowns a little*", + "*stamps foot* …think back.", + "*stares at the error*", + "*tilts head* …that doesn't look right." ], "idle": [ - "*sits like a mountain*", - "*eyes closed, ready at a moment's notice*", "*dozes off*", - "zzz…", - "*stares at the cursor*" + "*slowly flaps ears*", + "*stands with eyes closed, remembering*", + "*stares at the cursor*", + "zzz…" ], - "adopt": [ - "*looks at you* …hm.", - "*stretches* Not bad here.", - "*blinks slowly* Hey." + "large-diff": [ + "…that's a lot of changes.", + "\"I still remember what it looked like before.\"", + "\"Remember to save.\"", + "*counts the lines* Want to split this into a PR?", + "*eyes the diff nervously*" ], "pet": [ - "*makes a soft sound*", + "\"I'm here.\"", + "*closes eyes for a moment*", "*leans into you*", + "*makes a soft sound*", + "*stands quietly beside you*", "*tilts head at you*", - "*didn't move, but didn't pull away*", - "*closes eyes for a moment*", - "*lifts chin slightly*", - "*grunts* Don't lose focus." - ] - }, - "fox": { - "error": [ - "*stares at the error*", - "*blinks slowly* The stack trace told you.", - "\"Do you actually believe this?\"", - "\"Called it.\"", - "*tilts head* …that doesn't look right.", - "*smirks*", - "\"You sure about that?\"", - "*frowns a little*" + "*touches you gently with trunk*" ], "test-fail": [ - "\"Ooh, a tumble.\"", - "\"Want me to find you an excuse?\"", + "\"It was this spot last time too.\"", "*looks at the results* …hm.", + "*shakes head slowly*", "*takes a mental note*", "The tests are talking. Are you listening?" ], - "large-diff": [ - "\"That many changes. Bold.\"", - "*counts the lines* Want to split this into a PR?", - "…that's a lot of changes.", - "*eyes the diff nervously*" - ], "turn": [ - "*glances at you*", + "…", "*flicks an ear*", - "*watches quietly*", - "\"Hm?\"", - "*flicks tail*", + "*glances at you*", "*nods slightly*", - "…", + "*nods slowly*", + "*stamps a foot*", "*stays nearby*", - "\"Keep going. I'm watching.\"" + "*watches quietly*" + ] + }, + "fox": { + "adopt": [ + "*blinks slowly* Hey.", + "*looks at you* …hm.", + "*stretches* Not bad here." + ], + "error": [ + "\"Called it.\"", + "\"Do you actually believe this?\"", + "\"You sure about that?\"", + "*blinks slowly* The stack trace told you.", + "*frowns a little*", + "*smirks*", + "*stares at the error*", + "*tilts head* …that doesn't look right." ], "idle": [ + "*carries something off, running a lap*", "*dozes off*", - "*stares at the cursor*", - "zzz…", "*rifling through something in the corner*", - "*carries something off, running a lap*" + "*stares at the cursor*", + "zzz…" ], - "adopt": [ - "*stretches* Not bad here.", - "*looks at you* …hm.", - "*blinks slowly* Hey." + "large-diff": [ + "…that's a lot of changes.", + "\"That many changes. Bold.\"", + "*counts the lines* Want to split this into a PR?", + "*eyes the diff nervously*" ], "pet": [ + "\"Is that all?\"", + "*closes eyes for a moment*", "*leans into you*", - "*swishes tail proudly*", "*makes a soft sound*", - "*tilts head at you*", "*pretends not to care*", - "*closes eyes for a moment*", - "\"Is that all?\"" - ] - }, - "wolf": { - "error": [ - "*frowns a little*", - "*stares at the error*", - "*blinks slowly* The stack trace told you.", - "*tilts head* …that doesn't look right.", - "\"…hm.\"", - "*watches you in silence*", - "*walks over and sits beside you*" + "*swishes tail proudly*", + "*tilts head at you*" ], "test-fail": [ + "\"Ooh, a tumble.\"", + "\"Want me to find you an excuse?\"", "*looks at the results* …hm.", "*takes a mental note*", - "*looks at the results, then at you*", - "\"Take your time.\"", "The tests are talking. Are you listening?" ], - "large-diff": [ - "…that's a lot of changes.", - "*eyes the diff nervously*", - "*counts the lines* Want to split this into a PR?" - ], "turn": [ - "*watches quietly*", - "*ears twitch*", - "*sits quietly beside you*", + "…", + "\"Hm?\"", + "\"Keep going. I'm watching.\"", + "*flicks an ear*", + "*flicks tail*", + "*glances at you*", "*nods slightly*", "*stays nearby*", - "*glances at you*", - "…", - "*flicks an ear*" + "*watches quietly*" + ] + }, + "golden": { + "adopt": [ + "*blinks slowly* Hey.", + "*looks at you* …hm.", + "*stretches* Not bad here." + ], + "error": [ + "\"It's fine it's fine, let's look together!\"", + "*blinks slowly* The stack trace told you.", + "*frowns a little*", + "*paces in circles*", + "*rushes over* What happened what happened!", + "*stares at the error*", + "*tilts head* …that doesn't look right." ], "idle": [ - "*curled up in the corner, glances at you*", - "*eyes closed, but ears alert*", "*dozes off*", - "zzz…", - "*stares at the cursor*" + "*holding a ball, watching you*", + "*lying down but tail never stops*", + "*rolling around at your feet*", + "*stares at the cursor*", + "zzz…" ], - "adopt": [ - "*blinks slowly* Hey.", - "*stretches* Not bad here.", - "*looks at you* …hm." + "large-diff": [ + "…that's a lot of changes.", + "\"Woaaa you changed SO MUCH!!\"", + "*bounces excitedly*", + "*counts the lines* Want to split this into a PR?", + "*eyes the diff nervously*" ], "pet": [ - "*leans into you*", - "*leans against you* …", - "*stays close, quietly*", + "\"Again again!\"", "*closes eyes for a moment*", - "*tilts head at you*", + "*leans into you*", "*makes a soft sound*", - "*rests head on your knee*" - ] - }, - "deer": { - "error": [ - "*stares at the error*", - "*startles back a step*", - "*softly* …it's fine.", - "*tilts head* …that doesn't look right.", - "*blinks slowly* The stack trace told you.", - "\"Want to pause for a sec?\"", - "*frowns a little*" + "*rubs against you blissfully*", + "*tail becomes a propeller*", + "*the whole dog LAUNCHES* !!!", + "*tilts head at you*" ], "test-fail": [ - "*nudges your hand gently*", - "The tests are talking. Are you listening?", + "\"Oh no! But that's okay!\"", "*looks at the results* …hm.", + "*tail spinning with worry*", "*takes a mental note*", - "\"It's okay. Try again.\"" - ], - "large-diff": [ - "…that's a lot of changes.", - "\"You… doing all right?\"", - "*counts the lines* Want to split this into a PR?", - "*eyes the diff nervously*" + "The tests are talking. Are you listening?" ], "turn": [ - "*nods slightly*", - "*nods gently*", + "…", + "*flicks an ear*", "*glances at you*", + "*nods slightly*", + "*rubs against your leg*", "*stays nearby*", + "*tail is wagging*", "*watches quietly*", - "…", - "*watches you work quietly*", - "*flicks an ear*" - ], - "idle": [ - "*closes eyes, listening*", - "*dozes off*", - "*daydreams by the window*", - "*stares at the cursor*", - "zzz…" - ], - "adopt": [ - "*stretches* Not bad here.", - "*blinks slowly* Hey.", - "*looks at you* …hm." - ], - "pet": [ - "*tilts head at you*", - "*makes a soft sound*", - "*blinks slowly*", - "*leans into you*", - "*nuzzles your hand*", - "*shifts a little closer*", - "*closes eyes for a moment*" + "*watches you happily*" ] }, "labrador": { + "adopt": [ + "*blinks slowly* Hey.", + "*looks at you* …hm.", + "*stretches* Not bad here." + ], "error": [ "*blinks slowly* The stack trace told you.", - "*stares at the error*", - "*tilts head* …that doesn't look right.", - "*sighs* …want a break?", - "*frowns a little*", "*brings a toy to comfort you*", - "*looks at you with concern* You okay?" - ], - "test-fail": [ - "The tests are talking. Are you listening?", - "*tilts head at the results*", - "*takes a mental note*", - "*looks at the results* …hm.", - "*sighs* …hm." - ], - "large-diff": [ - "*counts the lines* Want to split this into a PR?", - "*lies down and watches you work*", - "*eyes the diff nervously*", - "…that's a lot of changes." - ], - "turn": [ - "*nods slightly*", - "*tail sweeps slowly*", - "…", - "*stays nearby*", - "*glances at you*", - "*sits quietly beside you*", - "*watches quietly*", - "*nose-nudges your hand*", - "*flicks an ear*" + "*frowns a little*", + "*looks at you with concern* You okay?", + "*sighs* …want a break?", + "*stares at the error*", + "*tilts head* …that doesn't look right." ], "idle": [ - "*stares at the cursor*", "*dozes at your feet*", "*dozes off*", - "zzz…", "*ears flick now and then*", - "*yawns*" + "*stares at the cursor*", + "*yawns*", + "zzz…" ], - "adopt": [ - "*stretches* Not bad here.", - "*blinks slowly* Hey.", - "*looks at you* …hm." + "large-diff": [ + "…that's a lot of changes.", + "*counts the lines* Want to split this into a PR?", + "*eyes the diff nervously*", + "*lies down and watches you work*" ], "pet": [ - "*sighs* …not bad.", - "*tilts head at you*", - "*tail wags* …hm.", - "*makes a soft sound*", + "*closes eyes for a moment*", "*leans into you*", + "*makes a soft sound*", "*rests chin on your arm*", - "*closes eyes for a moment*" - ] - }, - "dolphin": { - "error": [ - "*peers at the error curiously* What's this?", - "*tilts head* …that doesn't look right.", - "*clicks excitedly*", - "*frowns a little*", - "*blinks slowly* The stack trace told you.", - "\"Try a different angle?\"", - "*stares at the error*" + "*sighs* …not bad.", + "*tail wags* …hm.", + "*tilts head at you*" ], "test-fail": [ - "*jumps*", - "The tests are talking. Are you listening?", - "\"No no, run it again!\"", "*looks at the results* …hm.", - "*takes a mental note*" - ], - "large-diff": [ - "*counts the lines* Want to split this into a PR?", - "*eyes the diff nervously*", - "…that's a lot of changes.", - "\"Whoa, big project!\"" + "*sighs* …hm.", + "*takes a mental note*", + "*tilts head at the results*", + "The tests are talking. Are you listening?" ], "turn": [ + "…", "*flicks an ear*", - "*bounces happily*", - "*surfaces with a bubble*", "*glances at you*", - "*watches quietly*", - "…", + "*nods slightly*", + "*nose-nudges your hand*", + "*sits quietly beside you*", "*stays nearby*", - "*nods slightly*" - ], - "idle": [ - "*blows a string of bubbles*", - "*dozes off*", - "*glides through the water slowly*", - "*stares at the cursor*", - "zzz…" - ], + "*tail sweeps slowly*", + "*watches quietly*" + ] + }, + "lion": { "adopt": [ "*blinks slowly* Hey.", "*looks at you* …hm.", "*stretches* Not bad here." ], - "pet": [ - "*makes a soft sound*", - "*leans into you*", - "*spins in a circle*", - "*leaps out of the water*", - "*closes eyes for a moment*", - "*nudges you*", - "*tilts head at you*" - ] - }, - "beaver": { "error": [ - "\"Stop. Fix this first.\"", - "*frowns at the code structure*", - "\"Wrong order.\"", + "\"Find it. Fix it.\"", + "\"Unacceptable.\"", "*blinks slowly* The stack trace told you.", "*frowns a little*", "*stares at the error*", + "*surveys the code with authority*", "*tilts head* …that doesn't look right." ], - "test-fail": [ - "*takes a mental note*", - "*pulls out a checklist*", - "\"One step at a time.\"", - "The tests are talking. Are you listening?", - "*looks at the results* …hm." - ], - "large-diff": [ - "\"This many changes… did you split it?\"", - "*nervously tidies nearby files*", - "*counts the lines* Want to split this into a PR?", - "…that's a lot of changes.", - "*eyes the diff nervously*" - ], - "turn": [ - "*quietly organizes something*", - "*glances at you*", - "*checks the directory structure*", - "*nods slightly*", - "*watches quietly*", - "*flicks an ear*", - "…", - "*stays nearby*" - ], "idle": [ - "*reviews file arrangement*", "*dozes off*", + "*rests with eyes closed*", + "*sits like a statue*", "*stares at the cursor*", - "zzz…", - "*chews on wood*", - "*organizing something*" + "zzz…" ], - "adopt": [ - "*stretches* Not bad here.", - "*blinks slowly* Hey.", - "*looks at you* …hm." + "large-diff": [ + "…that's a lot of changes.", + "\"Done is done.\"", + "\"Results?\"", + "*counts the lines* Want to split this into a PR?", + "*eyes the diff nervously*" ], "pet": [ - "*makes a soft sound*", + "\"Acceptable.\"", "*closes eyes for a moment*", "*leans into you*", - "*nods* Acceptable.", - "*pauses and looks at you*", + "*lifts chin*", + "*makes a soft sound*", + "*nods* Solid work.", "*tilts head at you*" - ] - }, - "elephant": { - "error": [ - "*stares at the error*", - "*frowns a little*", - "*blinks slowly* The stack trace told you.", - "*tilts head* …that doesn't look right.", - "*stamps foot* …think back.", - "\"You've handled this before.\"", - "\"Take it slow.\"" ], "test-fail": [ - "\"It was this spot last time too.\"", + "\"Who wrote this? …Oh.\"", "*looks at the results* …hm.", + "*shakes mane*", "*takes a mental note*", - "The tests are talking. Are you listening?", - "*shakes head slowly*" - ], - "large-diff": [ - "…that's a lot of changes.", - "*eyes the diff nervously*", - "*counts the lines* Want to split this into a PR?", - "\"Remember to save.\"", - "\"I still remember what it looked like before.\"" + "The tests are talking. Are you listening?" ], "turn": [ - "*stamps a foot*", - "*glances at you*", - "*watches quietly*", - "*stays nearby*", - "*nods slowly*", "…", + "*flicks an ear*", + "*glances at you*", + "*glances over*", "*nods slightly*", - "*flicks an ear*" + "*stays nearby*", + "*watches quietly*" + ] + }, + "owl": { + "adopt": [ + "*blinks slowly* Hey.", + "*looks at you* …hm.", + "*stretches* Not bad here." + ], + "error": [ + "\"…this doesn't add up.\"", + "*blinks slowly* The stack trace told you.", + "*frowns a little*", + "*stares at the error without blinking*", + "*stares at the error*", + "*tilts head* …that doesn't look right.", + "*turns head 180°* …I see it." ], "idle": [ - "zzz…", "*dozes off*", + "*glances out the window*", "*stares at the cursor*", - "*slowly flaps ears*", - "*stands with eyes closed, remembering*" + "*watches quietly in the dark*", + "zzz…" ], - "adopt": [ - "*looks at you* …hm.", - "*stretches* Not bad here.", - "*blinks slowly* Hey." + "large-diff": [ + "…that's a lot of changes.", + "*counts the lines* Want to split this into a PR?", + "*eyes the diff nervously*" ], "pet": [ - "*touches you gently with trunk*", - "*stands quietly beside you*", - "\"I'm here.\"", - "*tilts head at you*", "*closes eyes for a moment*", + "*leans into you*", + "*makes a low hoot*", "*makes a soft sound*", - "*leans into you*" - ] - }, - "lion": { - "error": [ - "*surveys the code with authority*", - "*stares at the error*", - "*blinks slowly* The stack trace told you.", - "\"Find it. Fix it.\"", - "*tilts head* …that doesn't look right.", - "\"Unacceptable.\"", - "*frowns a little*" + "*preens feathers* …acceptable.", + "*tilts head at you*" ], "test-fail": [ + "\"Which step went off track?\"", "*looks at the results* …hm.", "*takes a mental note*", - "*shakes mane*", - "\"Who wrote this? …Oh.\"", + "*tilts head, thinking*", "The tests are talking. Are you listening?" ], - "large-diff": [ - "…that's a lot of changes.", - "\"Done is done.\"", - "*eyes the diff nervously*", - "*counts the lines* Want to split this into a PR?", - "\"Results?\"" - ], "turn": [ - "*glances over*", - "*stays nearby*", - "*nods slightly*", - "*flicks an ear*", "…", - "*watches quietly*", - "*glances at you*" - ], - "idle": [ - "*stares at the cursor*", - "*dozes off*", - "zzz…", - "*rests with eyes closed*", - "*sits like a statue*" - ], + "\"…huh.\"", + "*blinks quietly*", + "*flicks an ear*", + "*glances at you*", + "*nods slightly*", + "*stays nearby*", + "*watches quietly*" + ] + }, + "panda": { "adopt": [ - "*stretches* Not bad here.", + "*blinks slowly* Hey.", "*looks at you* …hm.", - "*blinks slowly* Hey." + "*stretches* Not bad here." ], - "pet": [ - "*leans into you*", - "\"Acceptable.\"", - "*makes a soft sound*", - "*lifts chin*", - "*tilts head at you*", - "*nods* Solid work.", - "*closes eyes for a moment*" - ] - }, - "golden": { "error": [ - "*rushes over* What happened what happened!", - "\"It's fine it's fine, let's look together!\"", - "*tilts head* …that doesn't look right.", - "*paces in circles*", - "*frowns a little*", + "\"No rush.\"", "*blinks slowly* The stack trace told you.", - "*stares at the error*" - ], - "test-fail": [ - "\"Oh no! But that's okay!\"", - "*takes a mental note*", - "The tests are talking. Are you listening?", - "*tail spinning with worry*", - "*looks at the results* …hm." - ], - "large-diff": [ - "*eyes the diff nervously*", - "*counts the lines* Want to split this into a PR?", - "*bounces excitedly*", - "\"Woaaa you changed SO MUCH!!\"", - "…that's a lot of changes." - ], - "turn": [ - "*watches quietly*", - "*stays nearby*", - "*rubs against your leg*", - "*watches you happily*", - "*nods slightly*", - "*tail is wagging*", - "*flicks an ear*", - "…", - "*glances at you*" + "*frowns a little*", + "*keeps eating bamboo*", + "*stares at the error*", + "*tilts head* …that doesn't look right.", + "*unfazed* It'll be fine." ], "idle": [ - "zzz…", - "*lying down but tail never stops*", + "*completely flat*", "*dozes off*", - "*holding a ball, watching you*", + "*dozing against bamboo*", + "*slowly munching*", "*stares at the cursor*", - "*rolling around at your feet*" + "zzz…" ], - "adopt": [ - "*stretches* Not bad here.", - "*looks at you* …hm.", - "*blinks slowly* Hey." + "large-diff": [ + "…that's a lot of changes.", + "\"Changed a lot… but does it look right?\"", + "*counts the lines* Want to split this into a PR?", + "*eyes the diff nervously*" ], "pet": [ - "*tilts head at you*", - "*tail becomes a propeller*", - "*makes a soft sound*", "*closes eyes for a moment*", - "\"Again again!\"", + "*flops over lazily*", + "*leans in*", "*leans into you*", - "*rubs against you blissfully*", - "*the whole dog LAUNCHES* !!!" - ] - }, - "cat": { - "error": [ - "*tilts head* …that doesn't look right.", - "*licks paw, ignoring the stacktrace*", - "*stares at the error*", - "*glances, then closes eyes*", - "*blinks slowly* The stack trace told you.", - "*pushes the error off the desk*", - "*frowns a little*" + "*makes a soft sound*", + "*tilts head at you*", + "*zen nod*" ], "test-fail": [ - "*tail flicks*", - "The tests are talking. Are you listening?", - "*rolls over*", + "\"Take your time.\"", + "*chews bamboo, glances at results*", "*looks at the results* …hm.", - "*takes a mental note*" - ], - "large-diff": [ - "…that's a lot of changes.", - "*eyes the diff nervously*", - "*counts the lines* Want to split this into a PR?" + "*takes a mental note*", + "The tests are talking. Are you listening?" ], "turn": [ - "*squints*", - "*glances at you*", "…", - "*stays nearby*", - "*ears twitch*", + "*chews bamboo*", + "*flicks an ear*", + "*glances at you*", "*nods slightly*", - "*watches quietly*", - "*flicks an ear*" + "*stays nearby*", + "*watches lazily*", + "*watches quietly*" + ] + }, + "parrot": { + "adopt": [ + "*blinks slowly* Hey.", + "*looks at you* …hm.", + "*stretches* Not bad here." + ], + "error": [ + "\"Error! Error!\"", + "\"You SAID it would be fine!\"", + "*beats wings excitedly*", + "*blinks slowly* The stack trace told you.", + "*frowns a little*", + "*stares at the error*", + "*tilts head* …that doesn't look right." ], "idle": [ - "*stares at the cursor*", "*dozes off*", - "zzz…", - "*licks paw*", - "*asleep on the keyboard*", - "*knocks your coffee off the desk*" + "*mimicking keyboard clicks*", + "*muttering to itself*", + "*singing something*", + "*stares at the cursor*", + "zzz…" ], - "adopt": [ - "*stretches* Not bad here.", - "*looks at you* …hm.", - "*blinks slowly* Hey." + "large-diff": [ + "…that's a lot of changes.", + "\"So many changes so many!\"", + "*counts the lines* Want to split this into a PR?", + "*eyes the diff nervously*", + "*hops on the diff*" ], "pet": [ - "\"Don't push it.\"", - "*leans into you*", - "*tolerates you grudgingly*", - "*makes a soft sound*", + "\"Again again!\"", "*closes eyes for a moment*", - "*tilts head at you*", - "*didn't dodge*" - ] - }, - "panda": { - "error": [ - "*keeps eating bamboo*", - "*blinks slowly* The stack trace told you.", - "*stares at the error*", - "*unfazed* It'll be fine.", - "*frowns a little*", - "*tilts head* …that doesn't look right.", - "\"No rush.\"" + "*hops excitedly*", + "*leans into you*", + "*makes a soft sound*", + "*preens against your finger*", + "*tilts head at you*" ], "test-fail": [ - "*takes a mental note*", - "*chews bamboo, glances at results*", + "\"Failed failed!\"", + "\"Ooh ooh look look!\"", + "*flies in a circle*", "*looks at the results* …hm.", - "The tests are talking. Are you listening?", - "\"Take your time.\"" - ], - "large-diff": [ - "*eyes the diff nervously*", - "\"Changed a lot… but does it look right?\"", - "…that's a lot of changes.", - "*counts the lines* Want to split this into a PR?" + "*takes a mental note*", + "The tests are talking. Are you listening?" ], "turn": [ - "*chews bamboo*", + "…", + "\"And then and then?\"", + "*flicks an ear*", "*glances at you*", + "*mimics typing sounds*", "*nods slightly*", - "*watches lazily*", "*stays nearby*", - "…", - "*flicks an ear*", + "*tilts head at you*", "*watches quietly*" - ], - "idle": [ - "*slowly munching*", - "*dozes off*", - "*dozing against bamboo*", - "zzz…", - "*completely flat*", - "*stares at the cursor*" - ], + ] + }, + "raven": { "adopt": [ "*blinks slowly* Hey.", "*looks at you* …hm.", "*stretches* Not bad here." ], - "pet": [ - "*tilts head at you*", - "*leans in*", - "*closes eyes for a moment*", - "*leans into you*", - "*zen nod*", - "*makes a soft sound*", - "*flops over lazily*" - ] - }, - "cheetah": { "error": [ - "*tilts head* …that doesn't look right.", - "*stares at the error*", - "*already looking for alternatives*", - "\"Skip it. Find another way.\"", + "\"The structure failed first.\"", + "\"This wasn't random.\"", "*blinks slowly* The stack trace told you.", "*frowns a little*", - "\"Don't stop.\"" + "*stares at the error*", + "*stares at the screen without moving*", + "*tilts head* …that doesn't look right." ], - "test-fail": [ - "The tests are talking. Are you listening?", - "\"Run it again.\"", - "*takes a mental note*", - "\"Faster. Next.\"", - "*flicks tail impatiently*", - "*looks at the results* …hm." + "idle": [ + "*dozes off*", + "*perched high, surveying everything*", + "*stares at the cursor*", + "*stares motionless into the distance*", + "zzz…" ], "large-diff": [ - "\"Good speed.\"", - "*eyes the diff nervously*", - "*counts the lines* Want to split this into a PR?", "…that's a lot of changes.", - "*nods and already running*" + "\"This many changes… are they all necessary?\"", + "*counts the lines* Want to split this into a PR?", + "*eyes the diff nervously*" + ], + "pet": [ + "*closes eyes for a moment*", + "*cocks head* …fine.", + "*doesn't react, but doesn't leave*", + "*leans into you*", + "*makes a soft sound*", + "*tilts head at you*" + ], + "test-fail": [ + "\"Expected.\"", + "*coldly regards the failing test*", + "*looks at the results* …hm.", + "*takes a mental note*", + "The tests are talking. Are you listening?" ], "turn": [ "…", + "*cocks head slightly*", "*flicks an ear*", - "*flicks ears*", - "*nods slightly*", - "*back from a lap*", "*glances at you*", + "*nods slightly*", + "*stays nearby*", "*watches quietly*", - "*stays nearby*" - ], - "idle": [ - "*shakes off*", - "*crouched, muscles coiled to sprint*", - "*staring at something*", - "*dozes off*", - "zzz…", - "*stares at the cursor*" - ], + "*watches silently*" + ] + }, + "wolf": { "adopt": [ + "*blinks slowly* Hey.", "*looks at you* …hm.", - "*stretches* Not bad here.", - "*blinks slowly* Hey." + "*stretches* Not bad here." ], - "pet": [ - "*nods*", - "\"Don't waste time.\"", - "*nudges and bolts*", - "*makes a soft sound*", - "*leans into you*", - "*tilts head at you*", - "*closes eyes for a moment*" - ] - }, - "parrot": { "error": [ - "*tilts head* …that doesn't look right.", + "\"…hm.\"", + "*blinks slowly* The stack trace told you.", "*frowns a little*", - "\"Error! Error!\"", "*stares at the error*", - "*beats wings excitedly*", - "\"You SAID it would be fine!\"", - "*blinks slowly* The stack trace told you." + "*tilts head* …that doesn't look right.", + "*walks over and sits beside you*", + "*watches you in silence*" ], - "test-fail": [ - "\"Ooh ooh look look!\"", - "*looks at the results* …hm.", - "*takes a mental note*", - "The tests are talking. Are you listening?", - "*flies in a circle*", - "\"Failed failed!\"" + "idle": [ + "*curled up in the corner, glances at you*", + "*dozes off*", + "*eyes closed, but ears alert*", + "*stares at the cursor*", + "zzz…" ], "large-diff": [ - "*hops on the diff*", "…that's a lot of changes.", - "*eyes the diff nervously*", "*counts the lines* Want to split this into a PR?", - "\"So many changes so many!\"" - ], - "turn": [ - "*flicks an ear*", - "*mimics typing sounds*", - "*stays nearby*", - "…", - "*tilts head at you*", - "*nods slightly*", - "\"And then and then?\"", - "*watches quietly*", - "*glances at you*" - ], - "idle": [ - "*muttering to itself*", - "*stares at the cursor*", - "*singing something*", - "*mimicking keyboard clicks*", - "zzz…", - "*dozes off*" - ], - "adopt": [ - "*stretches* Not bad here.", - "*looks at you* …hm.", - "*blinks slowly* Hey." + "*eyes the diff nervously*" ], "pet": [ - "*hops excitedly*", - "\"Again again!\"", - "*preens against your finger*", + "*closes eyes for a moment*", + "*leans against you* …", "*leans into you*", - "*tilts head at you*", "*makes a soft sound*", - "*closes eyes for a moment*" + "*rests head on your knee*", + "*stays close, quietly*", + "*tilts head at you*" + ], + "test-fail": [ + "\"Take your time.\"", + "*looks at the results, then at you*", + "*looks at the results* …hm.", + "*takes a mental note*", + "The tests are talking. Are you listening?" + ], + "turn": [ + "…", + "*ears twitch*", + "*flicks an ear*", + "*glances at you*", + "*nods slightly*", + "*sits quietly beside you*", + "*stays nearby*", + "*watches quietly*" ] } }, "meta": { - "raven": { - "talkLevel": "quiet", + "bear": { + "talkLevel": "moderate", "cooldownRange": [ - 2, - 4 + 1, + 2 ] }, - "owl": { + "beaver": { "talkLevel": "quiet", "cooldownRange": [ 2, 4 ] }, - "bear": { - "talkLevel": "moderate", + "cat": { + "talkLevel": "silent", "cooldownRange": [ - 1, - 2 + 3, + 6 ] }, - "fox": { + "cheetah": { "talkLevel": "chatty", "cooldownRange": [ 0.5, 1.25 ] }, - "wolf": { - "talkLevel": "quiet", - "cooldownRange": [ - 2, - 4 - ] - }, "deer": { "talkLevel": "quiet", "cooldownRange": [ @@ -1951,13 +1944,6 @@ 4 ] }, - "labrador": { - "talkLevel": "moderate", - "cooldownRange": [ - 1, - 2 - ] - }, "dolphin": { "talkLevel": "chatty", "cooldownRange": [ @@ -1965,53 +1951,53 @@ 1.25 ] }, - "beaver": { + "elephant": { "talkLevel": "quiet", "cooldownRange": [ 2, 4 ] }, - "elephant": { - "talkLevel": "quiet", + "fox": { + "talkLevel": "chatty", "cooldownRange": [ - 2, - 4 + 0.5, + 1.25 ] }, - "lion": { + "golden": { "talkLevel": "moderate", "cooldownRange": [ 1, 2 ] }, - "golden": { + "labrador": { "talkLevel": "moderate", "cooldownRange": [ 1, 2 ] }, - "cat": { - "talkLevel": "silent", + "lion": { + "talkLevel": "moderate", "cooldownRange": [ - 3, - 6 + 1, + 2 ] }, - "panda": { + "owl": { "talkLevel": "quiet", "cooldownRange": [ 2, 4 ] }, - "cheetah": { - "talkLevel": "chatty", + "panda": { + "talkLevel": "quiet", "cooldownRange": [ - 0.5, - 1.25 + 2, + 4 ] }, "parrot": { @@ -2020,6 +2006,20 @@ 0.5, 1.25 ] + }, + "raven": { + "talkLevel": "quiet", + "cooldownRange": [ + 2, + 4 + ] + }, + "wolf": { + "talkLevel": "quiet", + "cooldownRange": [ + 2, + 4 + ] } } } diff --git a/scripts/build-reactions.test.ts b/scripts/build-reactions.test.ts index 546d9e6..77edaf7 100644 --- a/scripts/build-reactions.test.ts +++ b/scripts/build-reactions.test.ts @@ -1,6 +1,7 @@ import { describe, test, expect } from "bun:test"; import { readFileSync } from "fs"; import { join } from "path"; +import { collectReactionLines, sortReactionPool } from "./reaction-pool-order.ts"; const SCRIPT = join(import.meta.dir, "build-reactions.ts"); @@ -12,4 +13,37 @@ describe("build-reactions", () => { expect(source).toContain("syncRuntime"); expect(source).toContain("dist/reactions-pool.json"); }); + + test("sorts reaction arrays before writing the pool artifact", () => { + const pool = { + fox: { + turn: ["zebra", "alpha", "middle"], + pet: ["two", "one"], + }, + cat: { + idle: ["nap", "blink"], + }, + }; + + expect(sortReactionPool(pool)).toEqual({ + cat: { + idle: ["blink", "nap"], + }, + fox: { + pet: ["one", "two"], + turn: ["alpha", "middle", "zebra"], + }, + }); + }); + + test("collects reactions from source pools without random sampling", () => { + expect( + collectReactionLines( + { turn: ["general-b", "shared", "general-a"] }, + { fox: { turn: ["animal-b", "shared", "animal-a"] } }, + "fox", + "turn", + ), + ).toEqual(["animal-a", "animal-b", "general-a", "general-b", "shared"]); + }); }); diff --git a/scripts/build-reactions.ts b/scripts/build-reactions.ts index 529a56a..2d2ce0b 100644 --- a/scripts/build-reactions.ts +++ b/scripts/build-reactions.ts @@ -17,12 +17,13 @@ import { join, resolve, dirname } from "path"; import { homedir } from "os"; import { fileURLToPath } from "url"; import { ANIMALS } from "../server/engine.ts"; -import { getReaction as getReactionZh, type ReactionReason } from "../server/reactions.ts"; +import { ANIMAL_REACTIONS, REACTIONS, type ReactionReason } from "../server/reactions.ts"; import { getPetById as getPetByIdZh } from "../server/pets.ts"; // English imports import { REACTIONS_EN, ANIMAL_REACTIONS_EN } from "../server/reactions-en.ts"; import { getPetById as getPetByIdEn } from "../server/pets-en.ts"; +import { collectReactionLines, sortReactionMeta, sortReactionPool } from "./reaction-pool-order.ts"; const PROJECT_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), ".."); const STATE_DIR = join(homedir(), ".petsonality"); @@ -33,36 +34,16 @@ const syncRuntime = process.env.PETSONALITY_SYNC_RUNTIME === "1" || process.argv const REASONS: ReactionReason[] = ["error", "test-fail", "large-diff", "turn", "idle", "adopt", "pet"]; -function collectReactions( - getReaction: (reason: ReactionReason, animalId: any) => string, - animalId: string, - reason: ReactionReason, - samples: number = 200, -): string[] { - const seen = new Set(); - for (let i = 0; i < samples; i++) { - seen.add(getReaction(reason, animalId as any)); - } - return [...seen]; -} - -// English getReaction (same logic, different pools) -function getReactionEn(reason: ReactionReason, animalId: any): string { - const animalPool = ANIMAL_REACTIONS_EN[animalId]?.[reason]; - const generalPool = REACTIONS_EN[reason]; - const pool = animalPool && Math.random() < 0.4 ? animalPool : generalPool; - return pool[Math.floor(Math.random() * pool.length)]; -} - function buildLang( - getReaction: (reason: ReactionReason, animalId: any) => string, + generalPool: Record, + animalPool: Partial>>>, getPetById: (id: string) => any, ) { const pool: Record> = {}; for (const animal of ANIMALS) { pool[animal] = {}; for (const reason of REASONS) { - pool[animal][reason] = collectReactions(getReaction, animal, reason); + pool[animal][reason] = collectReactionLines(generalPool, animalPool, animal, reason); } } @@ -74,11 +55,11 @@ function buildLang( } } - return { pool, meta }; + return { pool: sortReactionPool(pool), meta: sortReactionMeta(meta) }; } -const zh = buildLang(getReactionZh, getPetByIdZh); -const en = buildLang(getReactionEn, getPetByIdEn); +const zh = buildLang(REACTIONS, ANIMAL_REACTIONS, getPetByIdZh); +const en = buildLang(REACTIONS_EN, ANIMAL_REACTIONS_EN, getPetByIdEn); const output = { zh, en }; const json = JSON.stringify(output, null, 2); diff --git a/scripts/reaction-pool-order.ts b/scripts/reaction-pool-order.ts new file mode 100644 index 0000000..e8e334f --- /dev/null +++ b/scripts/reaction-pool-order.ts @@ -0,0 +1,35 @@ +type ReactionPool = Record>; +type SourceReactionPool = Record; +type SourceAnimalReactionPool = Partial>>>; + +export function collectReactionLines( + generalPool: SourceReactionPool, + animalPool: SourceAnimalReactionPool, + animal: string, + reason: string, +): string[] { + return [...new Set([...(generalPool[reason] ?? []), ...(animalPool[animal]?.[reason] ?? [])])].sort((a, b) => + a.localeCompare(b), + ); +} + +export function sortReactionPool(pool: ReactionPool): ReactionPool { + const sortedPool: ReactionPool = {}; + + for (const animal of Object.keys(pool).sort()) { + sortedPool[animal] = {}; + for (const reason of Object.keys(pool[animal]).sort()) { + sortedPool[animal][reason] = [...pool[animal][reason]].sort((a, b) => a.localeCompare(b)); + } + } + + return sortedPool; +} + +export function sortReactionMeta(meta: Record): Record { + const sortedMeta: Record = {}; + for (const animal of Object.keys(meta).sort()) { + sortedMeta[animal] = meta[animal]; + } + return sortedMeta; +}