petdex-cc 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +247 -0
  3. package/README_CN.md +247 -0
  4. package/dist/bin/cli.d.ts +3 -0
  5. package/dist/bin/cli.d.ts.map +1 -0
  6. package/dist/bin/cli.js +78 -0
  7. package/dist/bin/cli.js.map +1 -0
  8. package/dist/src/assets/tray-icon.png +0 -0
  9. package/dist/src/cli/config.d.ts +9 -0
  10. package/dist/src/cli/config.d.ts.map +1 -0
  11. package/dist/src/cli/config.js +41 -0
  12. package/dist/src/cli/config.js.map +1 -0
  13. package/dist/src/cli/install.d.ts +2 -0
  14. package/dist/src/cli/install.d.ts.map +1 -0
  15. package/dist/src/cli/install.js +62 -0
  16. package/dist/src/cli/install.js.map +1 -0
  17. package/dist/src/cli/list.d.ts +2 -0
  18. package/dist/src/cli/list.d.ts.map +1 -0
  19. package/dist/src/cli/list.js +20 -0
  20. package/dist/src/cli/list.js.map +1 -0
  21. package/dist/src/cli/start.d.ts +3 -0
  22. package/dist/src/cli/start.d.ts.map +1 -0
  23. package/dist/src/cli/start.js +37 -0
  24. package/dist/src/cli/start.js.map +1 -0
  25. package/dist/src/cli/status.d.ts +2 -0
  26. package/dist/src/cli/status.d.ts.map +1 -0
  27. package/dist/src/cli/status.js +8 -0
  28. package/dist/src/cli/status.js.map +1 -0
  29. package/dist/src/cli/stop.d.ts +2 -0
  30. package/dist/src/cli/stop.d.ts.map +1 -0
  31. package/dist/src/cli/stop.js +39 -0
  32. package/dist/src/cli/stop.js.map +1 -0
  33. package/dist/src/cli/switch.d.ts +2 -0
  34. package/dist/src/cli/switch.d.ts.map +1 -0
  35. package/dist/src/cli/switch.js +34 -0
  36. package/dist/src/cli/switch.js.map +1 -0
  37. package/dist/src/cli/uninstall.d.ts +2 -0
  38. package/dist/src/cli/uninstall.d.ts.map +1 -0
  39. package/dist/src/cli/uninstall.js +18 -0
  40. package/dist/src/cli/uninstall.js.map +1 -0
  41. package/dist/src/hooks/register.d.ts +3 -0
  42. package/dist/src/hooks/register.d.ts.map +1 -0
  43. package/dist/src/hooks/register.js +113 -0
  44. package/dist/src/hooks/register.js.map +1 -0
  45. package/dist/src/hooks/write-scripts.d.ts +2 -0
  46. package/dist/src/hooks/write-scripts.d.ts.map +1 -0
  47. package/dist/src/hooks/write-scripts.js +39 -0
  48. package/dist/src/hooks/write-scripts.js.map +1 -0
  49. package/dist/src/main/ai-speech.d.ts +22 -0
  50. package/dist/src/main/ai-speech.d.ts.map +1 -0
  51. package/dist/src/main/ai-speech.js +131 -0
  52. package/dist/src/main/ai-speech.js.map +1 -0
  53. package/dist/src/main/event-mapper.d.ts +10 -0
  54. package/dist/src/main/event-mapper.d.ts.map +1 -0
  55. package/dist/src/main/event-mapper.js +92 -0
  56. package/dist/src/main/event-mapper.js.map +1 -0
  57. package/dist/src/main/index.d.ts +2 -0
  58. package/dist/src/main/index.d.ts.map +1 -0
  59. package/dist/src/main/index.js +175 -0
  60. package/dist/src/main/index.js.map +1 -0
  61. package/dist/src/main/server.d.ts +8 -0
  62. package/dist/src/main/server.d.ts.map +1 -0
  63. package/dist/src/main/server.js +81 -0
  64. package/dist/src/main/server.js.map +1 -0
  65. package/dist/src/main/storage.d.ts +15 -0
  66. package/dist/src/main/storage.d.ts.map +1 -0
  67. package/dist/src/main/storage.js +90 -0
  68. package/dist/src/main/storage.js.map +1 -0
  69. package/dist/src/main/tray.d.ts +3 -0
  70. package/dist/src/main/tray.d.ts.map +1 -0
  71. package/dist/src/main/tray.js +156 -0
  72. package/dist/src/main/tray.js.map +1 -0
  73. package/dist/src/petdex-api/client.d.ts +21 -0
  74. package/dist/src/petdex-api/client.d.ts.map +1 -0
  75. package/dist/src/petdex-api/client.js +23 -0
  76. package/dist/src/petdex-api/client.js.map +1 -0
  77. package/dist/src/petdex-api/download.d.ts +8 -0
  78. package/dist/src/petdex-api/download.d.ts.map +1 -0
  79. package/dist/src/petdex-api/download.js +45 -0
  80. package/dist/src/petdex-api/download.js.map +1 -0
  81. package/dist/src/renderer/bubble.d.ts +30 -0
  82. package/dist/src/renderer/bubble.d.ts.map +1 -0
  83. package/dist/src/renderer/bubble.js +69 -0
  84. package/dist/src/renderer/bubble.js.map +1 -0
  85. package/dist/src/renderer/click-through.d.ts +21 -0
  86. package/dist/src/renderer/click-through.d.ts.map +1 -0
  87. package/dist/src/renderer/click-through.js +29 -0
  88. package/dist/src/renderer/click-through.js.map +1 -0
  89. package/dist/src/renderer/context-menu.d.ts +24 -0
  90. package/dist/src/renderer/context-menu.d.ts.map +1 -0
  91. package/dist/src/renderer/context-menu.js +83 -0
  92. package/dist/src/renderer/context-menu.js.map +1 -0
  93. package/dist/src/renderer/drag.d.ts +3 -0
  94. package/dist/src/renderer/drag.d.ts.map +1 -0
  95. package/dist/src/renderer/drag.js +57 -0
  96. package/dist/src/renderer/drag.js.map +1 -0
  97. package/dist/src/renderer/index.html +264 -0
  98. package/dist/src/renderer/pet-sprite.d.ts +25 -0
  99. package/dist/src/renderer/pet-sprite.d.ts.map +1 -0
  100. package/dist/src/renderer/pet-sprite.js +59 -0
  101. package/dist/src/renderer/pet-sprite.js.map +1 -0
  102. package/dist/src/renderer/renderer.d.ts +2 -0
  103. package/dist/src/renderer/renderer.d.ts.map +1 -0
  104. package/dist/src/renderer/renderer.js +244 -0
  105. package/dist/src/renderer/renderer.js.map +1 -0
  106. package/dist/src/renderer/wander.d.ts +8 -0
  107. package/dist/src/renderer/wander.d.ts.map +1 -0
  108. package/dist/src/renderer/wander.js +137 -0
  109. package/dist/src/renderer/wander.js.map +1 -0
  110. package/dist/src/shared/events.d.ts +62 -0
  111. package/dist/src/shared/events.d.ts.map +1 -0
  112. package/dist/src/shared/events.js +2 -0
  113. package/dist/src/shared/events.js.map +1 -0
  114. package/dist/src/shared/levels.d.ts +18 -0
  115. package/dist/src/shared/levels.d.ts.map +1 -0
  116. package/dist/src/shared/levels.js +20 -0
  117. package/dist/src/shared/levels.js.map +1 -0
  118. package/dist/src/shared/pet-states.d.ts +72 -0
  119. package/dist/src/shared/pet-states.d.ts.map +1 -0
  120. package/dist/src/shared/pet-states.js +20 -0
  121. package/dist/src/shared/pet-states.js.map +1 -0
  122. package/package.json +48 -0
  123. package/src/assets/tray-icon.png +0 -0
  124. package/src/hooks/bridge.ps1 +11 -0
  125. package/src/hooks/bridge.sh +9 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 devnomad-byte
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,247 @@
1
+ <p align="center">
2
+ <img src="https://img.shields.io/badge/version-0.1.0-8b5cf6?style=flat-square" />
3
+ <img src="https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-0ea5e9?style=flat-square" />
4
+ <img src="https://img.shields.io/badge/node-%3E%3D18-22c55e?style=flat-square" />
5
+ <img src="https://img.shields.io/badge/license-MIT-f59e0b?style=flat-square" />
6
+ <img src="https://img.shields.io/badge/pets-1569%20available-ec4899?style=flat-square" />
7
+ </p>
8
+
9
+ <h1 align="center">
10
+ <br />
11
+ <code>petdex-cc</code>
12
+ <br />
13
+ <sub><b>Desktop Pet Companion for Claude Code</b></sub>
14
+ <br />
15
+ <sub><i>Animated pets that react to your coding in real-time</i></sub>
16
+ </h1>
17
+
18
+ <p align="center">
19
+ <a href="./README_CN.md">中文文档</a>
20
+ </p>
21
+
22
+ ---
23
+
24
+ <br />
25
+
26
+ > Pick a companion from [**petdex.crafter.run**](https://petdex.crafter.run/) — 1,569 pets to choose from.
27
+ > Install with one command. Watch your pet come alive as you code.
28
+
29
+ <br />
30
+
31
+ ## What It Does
32
+
33
+ Your desktop pet lives in a transparent, always-on-top window and **reacts to your Claude Code activity in real-time**:
34
+
35
+ | What happens in Claude Code | What your pet does |
36
+ |---|---|
37
+ | You read a file | Pet reviews the code with you |
38
+ | You edit or write a file | Pet watches your changes |
39
+ | You run a shell command | Pet runs alongside you |
40
+ | A task completes | Pet celebrates with a happy jump |
41
+ | An error occurs | Pet shows concern and encouragement |
42
+ | You go idle | Pet waves and sends time-appropriate greetings |
43
+ | You level up | Pet glows, sparkles, and celebrates |
44
+
45
+ <br />
46
+
47
+ ## Quick Start
48
+
49
+ ### Prerequisites
50
+
51
+ - [Node.js](https://nodejs.org/) >= 18
52
+ - [Claude Code](https://docs.anthropic.com/en/docs/claude-code) installed (`~/.claude/` exists)
53
+
54
+ ### Install a Pet
55
+
56
+ ```bash
57
+ # Browse pets → https://petdex.crafter.run/
58
+ # Pick one, then install it with the slug:
59
+
60
+ npx petdex-cc install boba
61
+ ```
62
+
63
+ That's it. Your pet appears on your desktop immediately.
64
+
65
+ > **Popular pets:** `boba` (otter) · `doraemon` · `noir-webling` (spider detective) · `ikun-hoops` (basketball chick)
66
+
67
+ <br />
68
+
69
+ ## CLI Commands
70
+
71
+ ```
72
+ petdex-cc install <slug> Install a pet and configure hooks
73
+ petdex-cc start Start the desktop pet
74
+ petdex-cc stop Stop the desktop pet
75
+ petdex-cc list Browse available pets from Petdex
76
+ petdex-cc switch <slug> Switch to a different pet
77
+ petdex-cc status Show current pet status & level
78
+ petdex-cc uninstall Remove hooks and pet data
79
+ petdex-cc config Configure API key and settings
80
+ ```
81
+
82
+ <br />
83
+
84
+ ## Level System
85
+
86
+ Your pet grows as you code. Every Claude Code action counts as an event.
87
+
88
+ | Level | Name | Events Needed | Visual Effect |
89
+ |:---:|---|---:|---|
90
+ | 1 | **Byte** | 0 | Base pet |
91
+ | 2 | **Process** | 50 | Soft breathing glow |
92
+ | 3 | **Thread** | 200 | Rotating aura ring |
93
+ | 4 | **Module** | 500 | Stronger effects |
94
+ | 5 | **Kernel** | 1,000 | Floating light particles |
95
+ | 6 | **Neural** | 2,000 | Pink particle storm |
96
+ | 7 | **Quantum** | 5,000 | Cyan energy field |
97
+ | 8 | **Singularity** | 10,000 | Golden halo + all effects |
98
+
99
+ <br />
100
+
101
+ ## AI Speech
102
+
103
+ When you have an Anthropic API key configured (via `petdex-cc config` or Claude Code settings), your pet generates **context-aware speech bubbles**:
104
+
105
+ - Task completed → AI-generated encouragement
106
+ - Error occurred → Comforting words
107
+ - Idle for too long → Time-appropriate greetings
108
+ - Level up → Celebration message
109
+
110
+ No API key? Built-in preset lines work great too.
111
+
112
+ <br />
113
+
114
+ ## Developer Setup
115
+
116
+ ```bash
117
+ # Clone the repo
118
+ git clone https://github.com/devnomad-byte/petdex-cc.git
119
+ cd petdex-cc
120
+
121
+ # Install dependencies
122
+ npm install
123
+
124
+ # Build
125
+ npm run build
126
+
127
+ # Start the pet (development)
128
+ npx electron .
129
+
130
+ # Or install globally for CLI access
131
+ npm link
132
+ petdex-cc install boba
133
+ ```
134
+
135
+ ### Project Structure
136
+
137
+ ```
138
+ petdex-cc/
139
+ ├── bin/cli.ts CLI entry point
140
+ ├── src/
141
+ │ ├── main/ Electron main process
142
+ │ │ ├── index.ts Window & event loop
143
+ │ │ ├── server.ts HTTP event receiver (hooks → pet)
144
+ │ │ ├── ai-speech.ts AI speech generation
145
+ │ │ ├── storage.ts State persistence with HMAC signing
146
+ │ │ ├── tray.ts System tray menu
147
+ │ │ └── event-mapper.ts Hook events → pet actions
148
+ │ ├── renderer/ Electron renderer (pet UI)
149
+ │ │ ├── index.html Transparent window HTML/CSS
150
+ │ │ ├── renderer.ts Main renderer logic
151
+ │ │ ├── pet-sprite.ts Spritesheet animation engine
152
+ │ │ ├── bubble.ts Speech bubble system
153
+ │ │ ├── click-through.ts Click transparency
154
+ │ │ └── drag.ts Draggable pet
155
+ │ ├── cli/ CLI commands
156
+ │ ├── hooks/ Claude Code hooks registration
157
+ │ └── petdex-api/ Petdex API client & download
158
+ ```
159
+
160
+ ### Build Commands
161
+
162
+ | Command | What it does |
163
+ |---|---|
164
+ | `npm run build` | TypeScript compile + bundle renderer |
165
+ | `npm run check` | Type-check without emitting |
166
+ | `npx electron .` | Start pet from compiled output |
167
+
168
+ <br />
169
+
170
+ ## How It Works
171
+
172
+ ```
173
+ Claude Code ──hooks──▶ ~/.claude/settings.json
174
+
175
+
176
+ bridge.ps1 / bridge.sh
177
+
178
+
179
+ HTTP POST /event (localhost)
180
+
181
+
182
+ ┌───────────────┐
183
+ │ petdex-cc │
184
+ │ (Electron) │
185
+ │ │
186
+ │ event-mapper │──▶ pet action + speech bubble
187
+ │ storage │──▶ level up detection
188
+ │ ai-speech │──▶ AI-generated responses
189
+ └───────────────┘
190
+
191
+
192
+ Desktop pet window
193
+ ```
194
+
195
+ <br />
196
+
197
+ ## Configuration
198
+
199
+ ### API Key (optional, for AI speech)
200
+
201
+ ```bash
202
+ # Set via config command
203
+ petdex-cc config --api-key <your-key> --api-base-url <url>
204
+
205
+ # Or it auto-detects from Claude Code settings (~/.claude/settings.json)
206
+ ```
207
+
208
+ ### Hook Events
209
+
210
+ petdex-cc registers these Claude Code hooks automatically:
211
+
212
+ | Hook Event | Trigger |
213
+ |---|---|
214
+ | `PostToolUse` | After Read, Edit, Write, Bash, Glob, Grep |
215
+ | `PostToolUseFailure` | After any tool fails |
216
+ | `Stop` | Claude finishes responding |
217
+ | `StopFailure` | Claude stops with an error |
218
+ | `Notification` | Idle notification |
219
+ | `SessionStart` | Claude Code starts or resumes |
220
+ | `SessionEnd` | Claude Code session ends |
221
+ | `TaskCompleted` | A task is marked complete |
222
+
223
+ <br />
224
+
225
+ ## Find Your Pet
226
+
227
+ Visit [**petdex.crafter.run**](https://petdex.crafter.run/) to browse all 1,569+ community pets. Each pet has a unique slug you use to install:
228
+
229
+ ```bash
230
+ # Find a pet you like, copy its slug, then:
231
+ petdex-cc install <slug>
232
+ ```
233
+
234
+ <br />
235
+
236
+ ## License
237
+
238
+ MIT — see [LICENSE](./LICENSE) for details.
239
+
240
+ <br />
241
+
242
+ ---
243
+
244
+ <p align="center">
245
+ <sub>Built with love for the Claude Code community</sub><br />
246
+ <sub>Pets powered by <a href="https://petdex.crafter.run/">Petdex</a></sub>
247
+ </p>
package/README_CN.md ADDED
@@ -0,0 +1,247 @@
1
+ <p align="center">
2
+ <img src="https://img.shields.io/badge/version-0.1.0-8b5cf6?style=flat-square" />
3
+ <img src="https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-0ea5e9?style=flat-square" />
4
+ <img src="https://img.shields.io/badge/node-%3E%3D18-22c55e?style=flat-square" />
5
+ <img src="https://img.shields.io/badge/license-MIT-f59e0b?style=flat-square" />
6
+ <img src="https://img.shields.io/badge/pets-1569%20%E6%AC%BE-ec4899?style=flat-square" />
7
+ </p>
8
+
9
+ <h1 align="center">
10
+ <br />
11
+ <code>petdex-cc</code>
12
+ <br />
13
+ <sub><b>Claude Code 桌面宠物伴侣</b></sub>
14
+ <br />
15
+ <sub><i>实时响应你编码行为的动画宠物</i></sub>
16
+ </h1>
17
+
18
+ <p align="center">
19
+ <a href="./README.md">English</a>
20
+ </p>
21
+
22
+ ---
23
+
24
+ <br />
25
+
26
+ > 从 [**petdex.crafter.run**](https://petdex.crafter.run/) 挑选你的伙伴 — 1,569 款宠物任你选。
27
+ > 一条命令安装,宠物立刻出现在你的桌面上。
28
+
29
+ <br />
30
+
31
+ ## 它能做什么
32
+
33
+ 你的桌面宠物住在一个透明、始终置顶的窗口中,**实时响应你在 Claude Code 中的每一次操作**:
34
+
35
+ | Claude Code 中发生的事 | 你的宠物在做什么 |
36
+ |---|---|
37
+ | 你读取文件 | 宠物陪你一起看代码 |
38
+ | 你编辑或写入文件 | 宠物关注你的修改 |
39
+ | 你运行终端命令 | 宠物跟你一起跑起来 |
40
+ | 任务完成 | 宠物开心跳跃庆祝 |
41
+ | 出现错误 | 宠物送上鼓励和安慰 |
42
+ | 你离开太久 | 宠物挥手并问候(早上好/午安/晚安) |
43
+ | 你升级了 | 宠物发光、闪烁、庆祝 |
44
+
45
+ <br />
46
+
47
+ ## 快速开始
48
+
49
+ ### 环境要求
50
+
51
+ - [Node.js](https://nodejs.org/) >= 18
52
+ - 已安装 [Claude Code](https://docs.anthropic.com/en/docs/claude-code)(存在 `~/.claude/` 目录)
53
+
54
+ ### 安装宠物
55
+
56
+ ```bash
57
+ # 浏览宠物 → https://petdex.crafter.run/
58
+ # 看中哪个,用它的 slug 安装:
59
+
60
+ npx petdex-cc install boba
61
+ ```
62
+
63
+ 就这样。宠物立刻出现在桌面上。
64
+
65
+ > **热门宠物:** `boba`(水獭) · `doraemon`(哆啦A梦) · `noir-webling`(蜘蛛侦探) · `ikun-hoops`(篮球小鸡) · `星星人`(星星头)
66
+
67
+ <br />
68
+
69
+ ## 命令一览
70
+
71
+ ```
72
+ petdex-cc install <slug> 安装宠物并配置 hooks
73
+ petdex-cc start 启动桌面宠物
74
+ petdex-cc stop 停止桌面宠物
75
+ petdex-cc list 浏览 Petdex 上的可用宠物
76
+ petdex-cc switch <slug> 切换到另一只宠物
77
+ petdex-cc status 查看当前宠物状态和等级
78
+ petdex-cc uninstall 移除 hooks 和宠物数据
79
+ petdex-cc config 配置 API Key 和设置
80
+ ```
81
+
82
+ <br />
83
+
84
+ ## 等级系统
85
+
86
+ 你的宠物随你的编码而成长。每次 Claude Code 操作都算作一次事件。
87
+
88
+ | 等级 | 名称 | 所需事件数 | 视觉效果 |
89
+ |:---:|---|---:|---|
90
+ | 1 | **Byte** | 0 | 基础宠物 |
91
+ | 2 | **Process** | 50 | 柔和呼吸发光 |
92
+ | 3 | **Thread** | 200 | 旋转光环 |
93
+ | 4 | **Module** | 500 | 效果增强 |
94
+ | 5 | **Kernel** | 1,000 | 漂浮光点粒子 |
95
+ | 6 | **Neural** | 2,000 | 粉色粒子风暴 |
96
+ | 7 | **Quantum** | 5,000 | 青色能量场 |
97
+ | 8 | **Singularity** | 10,000 | 金色光环 + 全部特效 |
98
+
99
+ <br />
100
+
101
+ ## AI 语音
102
+
103
+ 当你配置了 Anthropic API Key(通过 `petdex-cc config` 或 Claude Code 设置),宠物会生成**上下文感知的中文语音气泡**:
104
+
105
+ - 任务完成 → AI 生成的鼓励语
106
+ - 出现错误 → 安慰的话语
107
+ - 空闲太久 → 时段问候
108
+ - 升级 → 庆祝语
109
+
110
+ 没有 API Key?内置预设台词也很好用。
111
+
112
+ <br />
113
+
114
+ ## 开发者安装
115
+
116
+ ```bash
117
+ # 克隆仓库
118
+ git clone https://github.com/devnomad-byte/petdex-cc.git
119
+ cd petdex-cc
120
+
121
+ # 安装依赖
122
+ npm install
123
+
124
+ # 构建
125
+ npm run build
126
+
127
+ # 启动宠物(开发模式)
128
+ npx electron .
129
+
130
+ # 或者全局安装以使用 CLI
131
+ npm link
132
+ petdex-cc install boba
133
+ ```
134
+
135
+ ### 项目结构
136
+
137
+ ```
138
+ petdex-cc/
139
+ ├── bin/cli.ts CLI 入口
140
+ ├── src/
141
+ │ ├── main/ Electron 主进程
142
+ │ │ ├── index.ts 窗口 & 事件循环
143
+ │ │ ├── server.ts HTTP 事件接收器(hooks → 宠物)
144
+ │ │ ├── ai-speech.ts AI 语音生成
145
+ │ │ ├── storage.ts 状态持久化(HMAC 签名)
146
+ │ │ ├── tray.ts 系统托盘菜单
147
+ │ │ └── event-mapper.ts Hook 事件 → 宠物动作
148
+ │ ├── renderer/ Electron 渲染进程(宠物 UI)
149
+ │ │ ├── index.html 透明窗口 HTML/CSS
150
+ │ │ ├── renderer.ts 主渲染逻辑
151
+ │ │ ├── pet-sprite.ts 精灵图动画引擎
152
+ │ │ ├── bubble.ts 语音气泡系统
153
+ │ │ ├── click-through.ts 点击穿透
154
+ │ │ └── drag.ts 可拖拽宠物
155
+ │ ├── cli/ CLI 命令
156
+ │ ├── hooks/ Claude Code hooks 注册
157
+ │ └── petdex-api/ Petdex API 客户端 & 下载
158
+ ```
159
+
160
+ ### 构建命令
161
+
162
+ | 命令 | 说明 |
163
+ |---|---|
164
+ | `npm run build` | TypeScript 编译 + 打包渲染器 |
165
+ | `npm run check` | 仅类型检查 |
166
+ | `npx electron .` | 从编译输出启动宠物 |
167
+
168
+ <br />
169
+
170
+ ## 工作原理
171
+
172
+ ```
173
+ Claude Code ──hooks──▶ ~/.claude/settings.json
174
+
175
+
176
+ bridge.ps1 / bridge.sh
177
+
178
+
179
+ HTTP POST /event (localhost)
180
+
181
+
182
+ ┌───────────────┐
183
+ │ petdex-cc │
184
+ │ (Electron) │
185
+ │ │
186
+ │ event-mapper │──▶ 宠物动作 + 语音气泡
187
+ │ storage │──▶ 升级检测
188
+ │ ai-speech │──▶ AI 生成的回复
189
+ └───────────────┘
190
+
191
+
192
+ 桌面宠物窗口
193
+ ```
194
+
195
+ <br />
196
+
197
+ ## 配置
198
+
199
+ ### API Key(可选,用于 AI 语音)
200
+
201
+ ```bash
202
+ # 通过 config 命令设置
203
+ petdex-cc config --api-key <your-key> --api-base-url <url>
204
+
205
+ # 或者自动从 Claude Code 设置中读取(~/.claude/settings.json)
206
+ ```
207
+
208
+ ### Hook 事件
209
+
210
+ petdex-cc 自动注册以下 Claude Code hooks:
211
+
212
+ | Hook 事件 | 触发时机 |
213
+ |---|---|
214
+ | `PostToolUse` | Read、Edit、Write、Bash、Glob、Grep 之后 |
215
+ | `PostToolUseFailure` | 工具执行失败时 |
216
+ | `Stop` | Claude 完成响应时 |
217
+ | `StopFailure` | Claude 停止并报错时 |
218
+ | `Notification` | 空闲通知 |
219
+ | `SessionStart` | Claude Code 启动或恢复时 |
220
+ | `SessionEnd` | Claude Code 会话结束时 |
221
+ | `TaskCompleted` | 任务标记完成时 |
222
+
223
+ <br />
224
+
225
+ ## 挑选你的宠物
226
+
227
+ 访问 [**petdex.crafter.run**](https://petdex.crafter.run/) 浏览全部 1,569+ 款社区宠物。每只宠物都有唯一的 slug,用它来安装:
228
+
229
+ ```bash
230
+ # 找到喜欢的宠物,复制它的 slug,然后:
231
+ petdex-cc install <slug>
232
+ ```
233
+
234
+ <br />
235
+
236
+ ## 许可证
237
+
238
+ MIT — 详见 [LICENSE](./LICENSE)。
239
+
240
+ <br />
241
+
242
+ ---
243
+
244
+ <p align="center">
245
+ <sub>为 Claude Code 社区用心打造</sub><br />
246
+ <sub>宠物来自 <a href="https://petdex.crafter.run/">Petdex</a></sub>
247
+ </p>
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env node
2
+ import { install } from "../src/cli/install.js";
3
+ import { start } from "../src/cli/start.js";
4
+ import { stop } from "../src/cli/stop.js";
5
+ import { list } from "../src/cli/list.js";
6
+ import { switchPet } from "../src/cli/switch.js";
7
+ import { status } from "../src/cli/status.js";
8
+ import { uninstall } from "../src/cli/uninstall.js";
9
+ import { config } from "../src/cli/config.js";
10
+ const args = process.argv.slice(2);
11
+ const command = args[0];
12
+ const rest = args.slice(1);
13
+ async function main() {
14
+ switch (command) {
15
+ case "install":
16
+ if (!rest[0]) {
17
+ console.error("Usage: petdex-cc install <pet-slug>");
18
+ process.exit(1);
19
+ }
20
+ await install(rest[0]);
21
+ break;
22
+ case "start":
23
+ start();
24
+ break;
25
+ case "stop":
26
+ stop();
27
+ break;
28
+ case "list":
29
+ await list();
30
+ break;
31
+ case "switch":
32
+ if (!rest[0]) {
33
+ console.error("Usage: petdex-cc switch <pet-slug>");
34
+ process.exit(1);
35
+ }
36
+ await switchPet(rest[0]);
37
+ break;
38
+ case "status":
39
+ status();
40
+ break;
41
+ case "uninstall":
42
+ uninstall();
43
+ break;
44
+ case "config":
45
+ config(rest);
46
+ break;
47
+ case "help":
48
+ case "--help":
49
+ case "-h":
50
+ printHelp();
51
+ break;
52
+ default:
53
+ console.log(`Unknown command: ${command ?? ""}`);
54
+ printHelp();
55
+ process.exit(1);
56
+ }
57
+ }
58
+ function printHelp() {
59
+ console.log(`
60
+ petdex-cc - Desktop pet companion for Claude Code
61
+
62
+ Commands:
63
+ install <slug> Install a pet from Petdex and configure hooks
64
+ start Start the desktop pet
65
+ stop Stop the desktop pet
66
+ list List available pets from Petdex
67
+ switch <slug> Switch to a different pet
68
+ status Show current pet status and level
69
+ uninstall Remove petdex-cc hooks and data
70
+ config Configure API key and settings
71
+ help Show this help message
72
+ `);
73
+ }
74
+ main().catch((err) => {
75
+ console.error(err.message);
76
+ process.exit(1);
77
+ });
78
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE3B,KAAK,UAAU,IAAI;IACjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,SAAS;YACZ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM;QACR,KAAK,OAAO;YACV,KAAK,EAAE,CAAC;YACR,MAAM;QACR,KAAK,MAAM;YACT,IAAI,EAAE,CAAC;YACP,MAAM;QACR,KAAK,MAAM;YACT,MAAM,IAAI,EAAE,CAAC;YACb,MAAM;QACR,KAAK,QAAQ;YACX,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,EAAE,CAAC;YACT,MAAM;QACR,KAAK,WAAW;YACd,SAAS,EAAE,CAAC;YACZ,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,CAAC,IAAI,CAAC,CAAC;YACb,MAAM;QACR,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,SAAS,EAAE,CAAC;YACZ,MAAM;QACR;YACE,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;YACjD,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;CAab,CAAC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
Binary file
@@ -0,0 +1,9 @@
1
+ export interface UserConfig {
2
+ apiKey?: string;
3
+ apiBaseUrl?: string;
4
+ cooldownMinutes?: number;
5
+ }
6
+ export declare function loadConfig(): UserConfig;
7
+ export declare function saveConfig(config: UserConfig): void;
8
+ export declare function config(args: string[]): void;
9
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/config.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,UAAU,IAAI,UAAU,CAOvC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAKnD;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqB3C"}
@@ -0,0 +1,41 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ const CONFIG_PATH = join(homedir(), ".petdex-cc", "config.json");
5
+ export function loadConfig() {
6
+ if (!existsSync(CONFIG_PATH))
7
+ return {};
8
+ try {
9
+ return JSON.parse(readFileSync(CONFIG_PATH, "utf8"));
10
+ }
11
+ catch {
12
+ return {};
13
+ }
14
+ }
15
+ export function saveConfig(config) {
16
+ const dir = join(homedir(), ".petdex-cc");
17
+ mkdirSync(dir, { recursive: true });
18
+ writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
19
+ console.log("Configuration saved.");
20
+ }
21
+ export function config(args) {
22
+ const config = loadConfig();
23
+ for (let i = 0; i < args.length; i += 2) {
24
+ const key = args[i];
25
+ const value = args[i + 1];
26
+ switch (key) {
27
+ case "--api-key":
28
+ config.apiKey = value;
29
+ break;
30
+ case "--api-base-url":
31
+ config.apiBaseUrl = value;
32
+ break;
33
+ case "--cooldown":
34
+ config.cooldownMinutes = Number(value);
35
+ break;
36
+ }
37
+ }
38
+ saveConfig(config);
39
+ console.log("Current config:", JSON.stringify(config, null, 2));
40
+ }
41
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;AAQjE,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAkB;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;IAC1C,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAc;IACnC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,WAAW;gBACd,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;gBACtB,MAAM;YACR,KAAK,gBAAgB;gBACnB,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC;gBAC1B,MAAM;YACR,KAAK,YAAY;gBACf,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvC,MAAM;QACV,CAAC;IACH,CAAC;IAED,UAAU,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function install(slug: string): Promise<void>;
2
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/cli/install.ts"],"names":[],"mappings":"AAeA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CzD"}