claude-minipet 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 (53) hide show
  1. package/README.md +113 -0
  2. package/dist/cli/index.d.ts +2 -0
  3. package/dist/cli/index.js +351 -0
  4. package/dist/cli/index.js.map +1 -0
  5. package/dist/cli/install.d.ts +4 -0
  6. package/dist/cli/install.js +89 -0
  7. package/dist/cli/install.js.map +1 -0
  8. package/dist/cli/setup.d.ts +11 -0
  9. package/dist/cli/setup.js +203 -0
  10. package/dist/cli/setup.js.map +1 -0
  11. package/dist/core/dna.d.ts +14 -0
  12. package/dist/core/dna.js +95 -0
  13. package/dist/core/dna.js.map +1 -0
  14. package/dist/core/evolution.d.ts +16 -0
  15. package/dist/core/evolution.js +252 -0
  16. package/dist/core/evolution.js.map +1 -0
  17. package/dist/core/pet.d.ts +25 -0
  18. package/dist/core/pet.js +224 -0
  19. package/dist/core/pet.js.map +1 -0
  20. package/dist/core/rarity.d.ts +17 -0
  21. package/dist/core/rarity.js +55 -0
  22. package/dist/core/rarity.js.map +1 -0
  23. package/dist/core/sync.d.ts +37 -0
  24. package/dist/core/sync.js +94 -0
  25. package/dist/core/sync.js.map +1 -0
  26. package/dist/core/types.d.ts +92 -0
  27. package/dist/core/types.js +22 -0
  28. package/dist/core/types.js.map +1 -0
  29. package/dist/daemon/server.d.ts +8 -0
  30. package/dist/daemon/server.js +137 -0
  31. package/dist/daemon/server.js.map +1 -0
  32. package/dist/hooks/handler.d.ts +2 -0
  33. package/dist/hooks/handler.js +99 -0
  34. package/dist/hooks/handler.js.map +1 -0
  35. package/dist/render/anim-state.d.ts +5 -0
  36. package/dist/render/anim-state.js +24 -0
  37. package/dist/render/anim-state.js.map +1 -0
  38. package/dist/render/animation.d.ts +15 -0
  39. package/dist/render/animation.js +94 -0
  40. package/dist/render/animation.js.map +1 -0
  41. package/dist/render/frames.d.ts +51 -0
  42. package/dist/render/frames.js +151 -0
  43. package/dist/render/frames.js.map +1 -0
  44. package/dist/render/pixel.d.ts +44 -0
  45. package/dist/render/pixel.js +169 -0
  46. package/dist/render/pixel.js.map +1 -0
  47. package/dist/render/sprites.d.ts +8 -0
  48. package/dist/render/sprites.js +300 -0
  49. package/dist/render/sprites.js.map +1 -0
  50. package/dist/render/statusline.d.ts +3 -0
  51. package/dist/render/statusline.js +117 -0
  52. package/dist/render/statusline.js.map +1 -0
  53. package/package.json +44 -0
@@ -0,0 +1,203 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Postinstall script — runs automatically after `npm install -g claude-minipet`.
4
+ *
5
+ * Full guided flow:
6
+ * 1. Login with email verification code → server creates user
7
+ * 2. Generate pet (DNA, species, rarity) → save locally + upload to server
8
+ * 3. Configure Claude Code hooks + status line
9
+ * 4. Start daemon
10
+ */
11
+ import { loadState, saveState, saveConfig, createPet, ensureDataDir } from '../core/pet.js';
12
+ import { generateDNA } from '../core/dna.js';
13
+ import { getRarityDisplay, RARITY_INFO } from '../core/rarity.js';
14
+ import { SPECIES_NAMES } from '../render/sprites.js';
15
+ import { renderStatusLine } from '../render/statusline.js';
16
+ import { installHooks } from './install.js';
17
+ import { fg, RESET, BOLD } from '../render/pixel.js';
18
+ import { isDaemonRunning } from '../daemon/server.js';
19
+ import { loadAuth, saveAuth, sendCode, verifyCode, syncPetToServer, fetchPetFromServer } from '../core/sync.js';
20
+ import { spawn } from 'node:child_process';
21
+ import { createInterface } from 'node:readline';
22
+ // Default server URL — change this to your production server
23
+ const DEFAULT_SERVER = 'https://minipet.crazyma99.xyz';
24
+ /** Prompt user for input */
25
+ function prompt(question) {
26
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
27
+ return new Promise(resolve => {
28
+ rl.question(question, answer => {
29
+ rl.close();
30
+ resolve(answer.trim());
31
+ });
32
+ });
33
+ }
34
+ async function main() {
35
+ // Skip in CI environments
36
+ if (process.env.CI || process.env.DOCKER) {
37
+ return;
38
+ }
39
+ try {
40
+ ensureDataDir();
41
+ console.log('');
42
+ console.log(` ${BOLD}🐾 欢迎使用 Claude MiniPet!${RESET}`);
43
+ console.log('');
44
+ // ========== Step 1: Login ==========
45
+ const existingAuth = loadAuth();
46
+ if (!existingAuth) {
47
+ console.log(` 首先,让我们创建你的账号。`);
48
+ console.log('');
49
+ const email = await prompt(' 📧 请输入你的邮箱: ');
50
+ if (!email || !email.includes('@')) {
51
+ console.log(' ❌ 邮箱格式不正确,请稍后运行 claude-minipet login 重试');
52
+ await setupLocalOnly();
53
+ return;
54
+ }
55
+ console.log(' 📤 发送验证码中...');
56
+ const sendResult = await sendCode(DEFAULT_SERVER, email);
57
+ if (!sendResult.ok) {
58
+ console.log(` ❌ ${sendResult.error ?? '无法连接服务器'}`);
59
+ console.log(' 将以离线模式运行,稍后可用 claude-minipet login 登录');
60
+ await setupLocalOnly();
61
+ return;
62
+ }
63
+ console.log(' ✅ 验证码已发送到你的邮箱');
64
+ console.log('');
65
+ const code = await prompt(' 🔑 请输入验证码: ');
66
+ if (!code) {
67
+ console.log(' 已跳过登录,稍后可用 claude-minipet login 登录');
68
+ await setupLocalOnly();
69
+ return;
70
+ }
71
+ const verifyResult = await verifyCode(DEFAULT_SERVER, email, code);
72
+ if (!verifyResult.ok || !verifyResult.token) {
73
+ console.log(` ❌ ${verifyResult.error ?? '验证失败'}`);
74
+ console.log(' 将以离线模式运行,稍后可用 claude-minipet login 重试');
75
+ await setupLocalOnly();
76
+ return;
77
+ }
78
+ saveAuth({
79
+ token: verifyResult.token,
80
+ email,
81
+ userId: verifyResult.userId,
82
+ serverUrl: DEFAULT_SERVER,
83
+ });
84
+ console.log(` ✅ 登录成功! (${email})`);
85
+ console.log('');
86
+ }
87
+ else {
88
+ console.log(` ✅ 已登录: ${existingAuth.email}`);
89
+ }
90
+ // ========== Step 2: Create or sync pet ==========
91
+ const existingState = loadState();
92
+ if (existingState) {
93
+ console.log(` 🐾 宠物已存在: ${existingState.name} (${SPECIES_NAMES[existingState.species].zh})`);
94
+ // Sync to server
95
+ if (loadAuth()) {
96
+ await syncPetToServer(existingState);
97
+ console.log(' ☁️ 数据已同步到云端');
98
+ }
99
+ }
100
+ else {
101
+ // Try to fetch from server first (returning user on new device)
102
+ let state = null;
103
+ if (loadAuth()) {
104
+ console.log(' ☁️ 检查云端数据...');
105
+ state = await fetchPetFromServer();
106
+ if (state) {
107
+ saveState(state);
108
+ console.log(` ✅ 从云端恢复了你的宠物: ${state.name}!`);
109
+ }
110
+ }
111
+ // No cloud data — create new pet
112
+ if (!state) {
113
+ const dna = generateDNA();
114
+ const speciesInfo = SPECIES_NAMES[dna.species];
115
+ const rarityInfo = RARITY_INFO[dna.rarity];
116
+ const rc = fg(rarityInfo.color);
117
+ state = createPet(speciesInfo.zh, dna.species, dna.raw, dna.rarity);
118
+ saveState(state);
119
+ const config = { language: 'zh', animationsEnabled: true, statusLineRows: 3 };
120
+ saveConfig(config);
121
+ console.log('');
122
+ console.log(` ✨ ${BOLD}一只新的宠物诞生了!${RESET} ✨`);
123
+ console.log('');
124
+ console.log(` 种族: ${fg(dna.primaryColor)}${BOLD}${speciesInfo.zh}${RESET} (${speciesInfo.en})`);
125
+ console.log(` 稀有度: ${rc}${getRarityDisplay(dna.rarity, 'zh')}${RESET}`);
126
+ console.log(` 🧬 DNA: ${dna.raw}`);
127
+ console.log('');
128
+ console.log(renderStatusLine(state));
129
+ console.log('');
130
+ console.log(` 用 ${BOLD}claude-minipet rename <名字>${RESET} 给它起个名字吧!`);
131
+ // Upload new pet to server
132
+ if (loadAuth()) {
133
+ await syncPetToServer(state);
134
+ console.log(' ☁️ 宠物数据已上传到云端');
135
+ }
136
+ }
137
+ }
138
+ // ========== Step 3: Install hooks ==========
139
+ installHooks();
140
+ console.log(' ✅ Claude Code hooks 已配置');
141
+ // ========== Step 4: Start daemon ==========
142
+ if (!isDaemonRunning()) {
143
+ try {
144
+ const binPath = new URL('./index.js', import.meta.url).pathname;
145
+ const child = spawn(process.execPath, [binPath, 'daemon', 'start'], {
146
+ detached: true,
147
+ stdio: 'ignore',
148
+ });
149
+ child.unref();
150
+ console.log(' ✅ 守护进程已启动');
151
+ }
152
+ catch {
153
+ console.log(' ⚠️ 守护进程启动失败,可手动运行: claude-minipet daemon start');
154
+ }
155
+ }
156
+ console.log('');
157
+ console.log(` ${BOLD}重启 Claude Code 就能看到你的宠物了! 🎉${RESET}`);
158
+ console.log('');
159
+ }
160
+ catch (err) {
161
+ console.log(` ⚠️ 配置失败: ${err}`);
162
+ console.log(' 请手动运行: claude-minipet init');
163
+ }
164
+ }
165
+ /** Fallback: setup without server login */
166
+ async function setupLocalOnly() {
167
+ const existing = loadState();
168
+ if (!existing) {
169
+ ensureDataDir();
170
+ const dna = generateDNA();
171
+ const speciesInfo = SPECIES_NAMES[dna.species];
172
+ const state = createPet(speciesInfo.zh, dna.species, dna.raw, dna.rarity);
173
+ saveState(state);
174
+ const config = { language: 'zh', animationsEnabled: true, statusLineRows: 3 };
175
+ saveConfig(config);
176
+ console.log('');
177
+ console.log(` ✨ ${BOLD}一只新的宠物诞生了!${RESET} ✨`);
178
+ console.log(` 种族: ${speciesInfo.zh} (${speciesInfo.en})`);
179
+ console.log(` 🧬 DNA: ${dna.raw}`);
180
+ console.log('');
181
+ console.log(renderStatusLine(state));
182
+ }
183
+ installHooks();
184
+ console.log(' ✅ Claude Code hooks 已配置');
185
+ if (!isDaemonRunning()) {
186
+ try {
187
+ const binPath = new URL('./index.js', import.meta.url).pathname;
188
+ const child = spawn(process.execPath, [binPath, 'daemon', 'start'], {
189
+ detached: true,
190
+ stdio: 'ignore',
191
+ });
192
+ child.unref();
193
+ console.log(' ✅ 守护进程已启动');
194
+ }
195
+ catch { /* ignore */ }
196
+ }
197
+ console.log('');
198
+ console.log(` ${BOLD}重启 Claude Code 就能看到你的宠物了! 🎉${RESET}`);
199
+ console.log(' (离线模式,稍后可用 claude-minipet login 登录同步)');
200
+ console.log('');
201
+ }
202
+ main();
203
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAChH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,6DAA6D;AAC7D,MAAM,cAAc,GAAG,+BAA+B,CAAC;AAEvD,4BAA4B;AAC5B,SAAS,MAAM,CAAC,QAAgB;IAC9B,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;YAC7B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,0BAA0B;IAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACzC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,aAAa,EAAE,CAAC;QAEhB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,0BAA0B,KAAK,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,sCAAsC;QACtC,MAAM,YAAY,GAAG,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAC7C,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;gBACzD,MAAM,cAAc,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YACzD,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;gBACvD,MAAM,cAAc,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;gBACpD,MAAM,cAAc,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,cAAc,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACnE,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,OAAO,YAAY,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;gBACnD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;gBACvD,MAAM,cAAc,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,QAAQ,CAAC;gBACP,KAAK,EAAE,YAAY,CAAC,KAAK;gBACzB,KAAK;gBACL,MAAM,EAAE,YAAY,CAAC,MAAO;gBAC5B,SAAS,EAAE,cAAc;aAC1B,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,YAAY,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,mDAAmD;QACnD,MAAM,aAAa,GAAG,SAAS,EAAE,CAAC;QAClC,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,eAAe,aAAa,CAAC,IAAI,KAAK,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC9F,iBAAiB;YACjB,IAAI,QAAQ,EAAE,EAAE,CAAC;gBACf,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,gEAAgE;YAChE,IAAI,KAAK,GAAG,IAAI,CAAC;YACjB,IAAI,QAAQ,EAAE,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBAC/B,KAAK,GAAG,MAAM,kBAAkB,EAAE,CAAC;gBACnC,IAAI,KAAK,EAAE,CAAC;oBACV,SAAS,CAAC,KAAK,CAAC,CAAC;oBACjB,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;YAED,iCAAiC;YACjC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;gBAC1B,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC/C,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC3C,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAEhC,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;gBACpE,SAAS,CAAC,KAAK,CAAC,CAAC;gBAEjB,MAAM,MAAM,GAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;gBACzF,UAAU,CAAC,MAAM,CAAC,CAAC;gBAEnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,aAAa,KAAK,IAAI,CAAC,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,IAAI,GAAG,WAAW,CAAC,EAAE,GAAG,KAAK,KAAK,WAAW,CAAC,EAAE,GAAG,CAAC,CAAC;gBACjG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;gBACzE,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,6BAA6B,KAAK,WAAW,CAAC,CAAC;gBAEtE,2BAA2B;gBAC3B,IAAI,QAAQ,EAAE,EAAE,CAAC;oBACf,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;oBAC7B,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,YAAY,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAEzC,6CAA6C;QAC7C,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;gBAChE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE;oBAClE,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,QAAQ;iBAChB,CAAC,CAAC;gBACH,KAAK,CAAC,KAAK,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,+BAA+B,KAAK,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAElB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,2CAA2C;AAC3C,KAAK,UAAU,cAAc;IAC3B,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;IAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,aAAa,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1E,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,MAAM,MAAM,GAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;QACzF,UAAU,CAAC,MAAM,CAAC,CAAC;QAEnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,aAAa,KAAK,IAAI,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,YAAY,EAAE,CAAC;IACf,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAEzC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;YAChE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE;gBAClE,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;YACH,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,+BAA+B,KAAK,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { DNA, Rarity, Color } from './types.js';
2
+ /** Generate a raw DNA hex string from seed inputs */
3
+ export declare function generateDNAString(username?: string, machineId?: string): string;
4
+ /** Determine rarity from the last DNA byte */
5
+ export declare function determineRarity(lastByte: number): Rarity;
6
+ /** Parse a DNA hex string into a full DNA object */
7
+ export declare function parseDNA(dnaString: string): DNA;
8
+ /** Generate a complete DNA object */
9
+ export declare function generateDNA(username?: string, machineId?: string): DNA;
10
+ /** Invert colors for shiny variants */
11
+ export declare function getShinyColors(dna: DNA): {
12
+ primary: Color;
13
+ secondary: Color;
14
+ };
@@ -0,0 +1,95 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { hostname, userInfo } from 'node:os';
3
+ const SPECIES_LIST = ['bitcat', 'shelldragon', 'codeslime', 'gitfox', 'bugowl', 'pixiebot'];
4
+ const PATTERN_LIST = ['solid', 'stripes', 'spots', 'gradient', 'zigzag', 'diamond', 'swirl', 'dots'];
5
+ const EYE_LIST = ['round', 'star', 'squint', 'heterochromia', 'dot', 'wide', 'angry', 'sleepy'];
6
+ const ACCESSORY_LIST = ['none', 'hat', 'scarf', 'bow', 'horns', 'crown', 'glasses', 'bandana'];
7
+ /** Curated color palette for pet primary/secondary colors */
8
+ const COLOR_PALETTE = [
9
+ { r: 255, g: 107, b: 107 }, // coral red
10
+ { r: 255, g: 159, b: 67 }, // orange
11
+ { r: 255, g: 214, b: 10 }, // yellow
12
+ { r: 72, g: 219, b: 95 }, // green
13
+ { r: 29, g: 209, b: 161 }, // teal
14
+ { r: 69, g: 170, b: 242 }, // sky blue
15
+ { r: 108, g: 92, b: 231 }, // purple
16
+ { r: 200, g: 80, b: 192 }, // pink
17
+ { r: 225, g: 112, b: 85 }, // salmon
18
+ { r: 116, g: 185, b: 255 }, // light blue
19
+ { r: 162, g: 155, b: 254 }, // lavender
20
+ { r: 255, g: 177, b: 66 }, // amber
21
+ { r: 99, g: 205, b: 218 }, // cyan
22
+ { r: 253, g: 150, b: 68 }, // tangerine
23
+ { r: 149, g: 225, b: 211 }, // mint
24
+ { r: 243, g: 104, b: 224 }, // magenta
25
+ { r: 209, g: 216, b: 224 }, // silver
26
+ { r: 72, g: 52, b: 212 }, // indigo
27
+ { r: 255, g: 234, b: 167 }, // cream
28
+ { r: 46, g: 213, b: 115 }, // emerald
29
+ { r: 30, g: 39, b: 46 }, // dark
30
+ { r: 255, g: 255, b: 255 }, // white
31
+ { r: 164, g: 176, b: 190 }, // gray
32
+ { r: 238, g: 82, b: 83 }, // red
33
+ ];
34
+ /** Generate a raw DNA hex string from seed inputs */
35
+ export function generateDNAString(username, machineId) {
36
+ const user = username ?? userInfo().username;
37
+ const machine = machineId ?? hostname();
38
+ const seed = `${user}:${machine}:${Date.now()}:${Math.random()}`;
39
+ const hash = createHash('sha256').update(seed).digest('hex');
40
+ // Take first 8 bytes (16 hex chars) and format as DNA
41
+ const bytes = [];
42
+ for (let i = 0; i < 16; i += 2) {
43
+ bytes.push(hash.slice(i, i + 2).toUpperCase());
44
+ }
45
+ return bytes.join('-');
46
+ }
47
+ /** Determine rarity from the last DNA byte */
48
+ export function determineRarity(lastByte) {
49
+ if (lastByte <= 0x02)
50
+ return 'shiny'; // ~1.17%
51
+ if (lastByte <= 0x0c)
52
+ return 'legendary'; // ~3.9%
53
+ if (lastByte <= 0x20)
54
+ return 'rare'; // ~7.8%
55
+ if (lastByte <= 0x5f)
56
+ return 'uncommon'; // ~24.6%
57
+ return 'common'; // ~62.5%
58
+ }
59
+ /** Parse a DNA hex string into a full DNA object */
60
+ export function parseDNA(dnaString) {
61
+ const bytes = dnaString.split('-').map(b => parseInt(b, 16));
62
+ if (bytes.length !== 8 || bytes.some(isNaN)) {
63
+ throw new Error(`Invalid DNA string: ${dnaString}`);
64
+ }
65
+ const [speciesByte, bodyByte, primaryByte, secondaryByte, patternByte, eyeByte, accessoryByte, rarityByte] = bytes;
66
+ return {
67
+ raw: dnaString,
68
+ species: SPECIES_LIST[speciesByte % SPECIES_LIST.length],
69
+ bodyVariation: bodyByte,
70
+ primaryColor: COLOR_PALETTE[primaryByte % COLOR_PALETTE.length],
71
+ secondaryColor: COLOR_PALETTE[secondaryByte % COLOR_PALETTE.length],
72
+ pattern: PATTERN_LIST[patternByte % PATTERN_LIST.length],
73
+ eyeStyle: EYE_LIST[eyeByte % EYE_LIST.length],
74
+ accessory: ACCESSORY_LIST[accessoryByte % ACCESSORY_LIST.length],
75
+ rarity: determineRarity(rarityByte),
76
+ };
77
+ }
78
+ /** Generate a complete DNA object */
79
+ export function generateDNA(username, machineId) {
80
+ const raw = generateDNAString(username, machineId);
81
+ return parseDNA(raw);
82
+ }
83
+ /** Invert colors for shiny variants */
84
+ export function getShinyColors(dna) {
85
+ const invert = (c) => ({
86
+ r: 255 - c.r,
87
+ g: 255 - c.g,
88
+ b: 255 - c.b,
89
+ });
90
+ return {
91
+ primary: invert(dna.primaryColor),
92
+ secondary: invert(dna.secondaryColor),
93
+ };
94
+ }
95
+ //# sourceMappingURL=dna.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dna.js","sourceRoot":"","sources":["../../src/core/dna.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { PetState, Species } from './types.js';
2
+ /** Evolution branch definition */
3
+ export interface EvolutionBranch {
4
+ name: string;
5
+ nameZh: string;
6
+ condition: (state: PetState) => boolean;
7
+ description: string;
8
+ }
9
+ /** Evolution tree: species → stage → branches */
10
+ export declare const EVOLUTION_TREE: Record<Species, Record<string, EvolutionBranch[]>>;
11
+ /** Check if pet is ready to evolve, return the branch name or null */
12
+ export declare function checkEvolution(state: PetState): string | null;
13
+ /** Get evolution info by name */
14
+ export declare function getEvolutionInfo(species: Species, name: string): EvolutionBranch | null;
15
+ /** Apply evolution to pet state */
16
+ export declare function applyEvolution(state: PetState, branchName: string): void;
@@ -0,0 +1,252 @@
1
+ /** Evolution tree: species → stage → branches */
2
+ export const EVOLUTION_TREE = {
3
+ bitcat: {
4
+ growth: [
5
+ {
6
+ name: 'shadow_cat',
7
+ nameZh: '影猫',
8
+ condition: (s) => editRatio(s) > 0.6,
9
+ description: 'Born from countless lines of code written in silence',
10
+ },
11
+ {
12
+ name: 'solar_cat',
13
+ nameZh: '日猫',
14
+ condition: (s) => bashRatio(s) > 0.6,
15
+ description: 'Empowered by the blazing speed of shell commands',
16
+ },
17
+ ],
18
+ final: [
19
+ {
20
+ name: 'void_cat',
21
+ nameZh: '虚空猫',
22
+ condition: (s) => s.bond > 80,
23
+ description: 'Deep bond transcends the digital realm',
24
+ },
25
+ {
26
+ name: 'storm_cat',
27
+ nameZh: '雷猫',
28
+ condition: (s) => avgMood(s) > 70,
29
+ description: 'Perpetual joy crystallized into lightning',
30
+ },
31
+ ],
32
+ },
33
+ shelldragon: {
34
+ growth: [
35
+ {
36
+ name: 'fire_dragon',
37
+ nameZh: '焰龙',
38
+ condition: (s) => bashRatio(s) > 0.6,
39
+ description: 'Forged in the fires of a thousand shell commands',
40
+ },
41
+ {
42
+ name: 'ice_dragon',
43
+ nameZh: '冰龙',
44
+ condition: (s) => readRatio(s) > 0.5,
45
+ description: 'Cool and methodical, born from careful code reading',
46
+ },
47
+ ],
48
+ final: [
49
+ {
50
+ name: 'storm_dragon',
51
+ nameZh: '雷暴龙',
52
+ condition: (s) => s.stats.totalBash > 500,
53
+ description: 'Absolute mastery of the command line',
54
+ },
55
+ {
56
+ name: 'crystal_dragon',
57
+ nameZh: '晶龙',
58
+ condition: (s) => s.bond > 80,
59
+ description: 'Crystallized from unbreakable trust',
60
+ },
61
+ ],
62
+ },
63
+ codeslime: {
64
+ growth: [
65
+ {
66
+ name: 'gel_cube',
67
+ nameZh: '凝胶方块',
68
+ condition: (s) => s.level >= 16 && editRatio(s) > 0.5,
69
+ description: 'Structured and organized, code given form',
70
+ },
71
+ {
72
+ name: 'plasma_slime',
73
+ nameZh: '等离子史莱姆',
74
+ condition: (s) => s.stats.totalTests > 50,
75
+ description: 'Energized by the spark of passing tests',
76
+ },
77
+ ],
78
+ final: [
79
+ {
80
+ name: 'omega_slime',
81
+ nameZh: '终极史莱姆',
82
+ condition: (s) => s.stats.sessionMinutes > 3000,
83
+ description: 'Evolved through sheer dedication and time',
84
+ },
85
+ {
86
+ name: 'quantum_slime',
87
+ nameZh: '量子史莱姆',
88
+ condition: (s) => avgMood(s) > 75,
89
+ description: 'Exists in superposition of pure happiness',
90
+ },
91
+ ],
92
+ },
93
+ gitfox: {
94
+ growth: [
95
+ {
96
+ name: 'branch_fox',
97
+ nameZh: '分支狐',
98
+ condition: (s) => s.stats.totalCommits > 30,
99
+ description: 'Master of branching timelines',
100
+ },
101
+ {
102
+ name: 'merge_fox',
103
+ nameZh: '合流狐',
104
+ condition: (s) => s.stats.totalPRs > 10,
105
+ description: 'Bringing code together in harmony',
106
+ },
107
+ ],
108
+ final: [
109
+ {
110
+ name: 'origin_fox',
111
+ nameZh: '源狐',
112
+ condition: (s) => s.stats.totalCommits > 100,
113
+ description: 'The origin of all branches, keeper of history',
114
+ },
115
+ {
116
+ name: 'phantom_fox',
117
+ nameZh: '幻影狐',
118
+ condition: (s) => s.stats.loginStreak > 14,
119
+ description: 'Appears faithfully every day without fail',
120
+ },
121
+ ],
122
+ },
123
+ bugowl: {
124
+ growth: [
125
+ {
126
+ name: 'debug_owl',
127
+ nameZh: '调试枭',
128
+ condition: (s) => s.stats.totalTests > 50,
129
+ description: 'Sharp eyes that spot every bug',
130
+ },
131
+ {
132
+ name: 'night_owl',
133
+ nameZh: '夜枭',
134
+ condition: (s) => s.stats.sessionMinutes > 1000,
135
+ description: 'Burns the midnight oil, ever vigilant',
136
+ },
137
+ ],
138
+ final: [
139
+ {
140
+ name: 'sage_owl',
141
+ nameZh: '贤者枭',
142
+ condition: (s) => s.bond > 80 && s.stats.totalTests > 100,
143
+ description: 'Wisdom earned through countless test cycles',
144
+ },
145
+ {
146
+ name: 'spectral_owl',
147
+ nameZh: '幽灵枭',
148
+ condition: (s) => s.stats.loginStreak > 14,
149
+ description: 'A silent presence that never leaves your side',
150
+ },
151
+ ],
152
+ },
153
+ pixiebot: {
154
+ growth: [
155
+ {
156
+ name: 'chrome_bot',
157
+ nameZh: '铬合金机器人',
158
+ condition: (s) => editRatio(s) > 0.5,
159
+ description: 'Polished and refined through code crafting',
160
+ },
161
+ {
162
+ name: 'spark_bot',
163
+ nameZh: '火花机器人',
164
+ condition: (s) => bashRatio(s) > 0.5,
165
+ description: 'Crackling with command-line energy',
166
+ },
167
+ ],
168
+ final: [
169
+ {
170
+ name: 'quantum_bot',
171
+ nameZh: '量子机器人',
172
+ condition: (s) => s.stats.totalEdits > 500,
173
+ description: 'Computing at the edge of possibility',
174
+ },
175
+ {
176
+ name: 'aurora_bot',
177
+ nameZh: '极光机器人',
178
+ condition: (s) => avgMood(s) > 80,
179
+ description: 'Radiating pure digital bliss',
180
+ },
181
+ ],
182
+ },
183
+ };
184
+ // Helper functions for evolution conditions
185
+ function totalActions(s) {
186
+ return s.stats.totalEdits + s.stats.totalBash + s.stats.totalReads + s.stats.totalCommits + s.stats.totalPRs + s.stats.totalTests;
187
+ }
188
+ function editRatio(s) {
189
+ const total = totalActions(s);
190
+ return total === 0 ? 0 : s.stats.totalEdits / total;
191
+ }
192
+ function bashRatio(s) {
193
+ const total = totalActions(s);
194
+ return total === 0 ? 0 : s.stats.totalBash / total;
195
+ }
196
+ function readRatio(s) {
197
+ const total = totalActions(s);
198
+ return total === 0 ? 0 : s.stats.totalReads / total;
199
+ }
200
+ function avgMood(s) {
201
+ const h = s.stats.moodHistory;
202
+ if (h.length === 0)
203
+ return s.mood;
204
+ return h.reduce((a, b) => a + b, 0) / h.length;
205
+ }
206
+ /** Check if pet is ready to evolve, return the branch name or null */
207
+ export function checkEvolution(state) {
208
+ const stage = state.stage;
209
+ const tree = EVOLUTION_TREE[state.species];
210
+ // Already at the evolution for this stage?
211
+ let targetStageKey = null;
212
+ if (stage === 'growth' && !state.evolution) {
213
+ targetStageKey = 'growth';
214
+ }
215
+ else if (stage === 'final' && state.evolution && !isFinalEvolution(state)) {
216
+ targetStageKey = 'final';
217
+ }
218
+ if (!targetStageKey || !tree[targetStageKey])
219
+ return null;
220
+ const branches = tree[targetStageKey];
221
+ for (const branch of branches) {
222
+ if (branch.condition(state)) {
223
+ return branch.name;
224
+ }
225
+ }
226
+ // Default to first branch if at the right level but no condition met
227
+ // (fallback so pets always evolve eventually)
228
+ return branches[0].name;
229
+ }
230
+ /** Check if the pet already has a final-stage evolution */
231
+ function isFinalEvolution(state) {
232
+ const tree = EVOLUTION_TREE[state.species];
233
+ if (!tree.final)
234
+ return false;
235
+ return tree.final.some(b => b.name === state.evolution);
236
+ }
237
+ /** Get evolution info by name */
238
+ export function getEvolutionInfo(species, name) {
239
+ const tree = EVOLUTION_TREE[species];
240
+ for (const branches of Object.values(tree)) {
241
+ const found = branches.find(b => b.name === name);
242
+ if (found)
243
+ return found;
244
+ }
245
+ return null;
246
+ }
247
+ /** Apply evolution to pet state */
248
+ export function applyEvolution(state, branchName) {
249
+ state.evolution = branchName;
250
+ state.pendingEvolution = branchName;
251
+ }
252
+ //# sourceMappingURL=evolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evolution.js","sourceRoot":"","sources":["../../src/core/evolution.ts"],"names":[],"mappings":"AAUA,iDAAiD;AACjD,MAAM,CAAC,MAAM,cAAc,GAAuD;IAChF,MAAM,EAAE;QACN,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG;gBACpC,WAAW,EAAE,sDAAsD;aACpE;YACD;gBACE,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG;gBACpC,WAAW,EAAE,kDAAkD;aAChE;SACF;QACD,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;gBAC7B,WAAW,EAAE,wCAAwC;aACtD;YACD;gBACE,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE;gBACjC,WAAW,EAAE,2CAA2C;aACzD;SACF;KACF;IACD,WAAW,EAAE;QACX,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG;gBACpC,WAAW,EAAE,kDAAkD;aAChE;YACD;gBACE,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG;gBACpC,WAAW,EAAE,qDAAqD;aACnE;SACF;QACD,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG;gBACzC,WAAW,EAAE,sCAAsC;aACpD;YACD;gBACE,IAAI,EAAE,gBAAgB;gBACtB,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;gBAC7B,WAAW,EAAE,qCAAqC;aACnD;SACF;KACF;IACD,SAAS,EAAE;QACT,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,MAAM;gBACd,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG;gBACrD,WAAW,EAAE,2CAA2C;aACzD;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;gBACzC,WAAW,EAAE,yCAAyC;aACvD;SACF;QACD,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI;gBAC/C,WAAW,EAAE,2CAA2C;aACzD;YACD;gBACE,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE;gBACjC,WAAW,EAAE,2CAA2C;aACzD;SACF;KACF;IACD,MAAM,EAAE;QACN,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE;gBAC3C,WAAW,EAAE,+BAA+B;aAC7C;YACD;gBACE,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE;gBACvC,WAAW,EAAE,mCAAmC;aACjD;SACF;QACD,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG;gBAC5C,WAAW,EAAE,+CAA+C;aAC7D;YACD;gBACE,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE;gBAC1C,WAAW,EAAE,2CAA2C;aACzD;SACF;KACF;IACD,MAAM,EAAE;QACN,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;gBACzC,WAAW,EAAE,gCAAgC;aAC9C;YACD;gBACE,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI;gBAC/C,WAAW,EAAE,uCAAuC;aACrD;SACF;QACD,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG;gBACzD,WAAW,EAAE,6CAA6C;aAC3D;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE;gBAC1C,WAAW,EAAE,+CAA+C;aAC7D;SACF;KACF;IACD,QAAQ,EAAE;QACR,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG;gBACpC,WAAW,EAAE,4CAA4C;aAC1D;YACD;gBACE,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG;gBACpC,WAAW,EAAE,oCAAoC;aAClD;SACF;QACD,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG;gBAC1C,WAAW,EAAE,sCAAsC;aACpD;YACD;gBACE,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE;gBACjC,WAAW,EAAE,8BAA8B;aAC5C;SACF;KACF;CACF,CAAC;AAEF,4CAA4C;AAC5C,SAAS,YAAY,CAAC,CAAW;IAC/B,OAAO,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;AACpI,CAAC;AAED,SAAS,SAAS,CAAC,CAAW;IAC5B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9B,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;AACtD,CAAC;AAED,SAAS,SAAS,CAAC,CAAW;IAC5B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9B,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;AACrD,CAAC;AAED,SAAS,SAAS,CAAC,CAAW;IAC5B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9B,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;AACtD,CAAC;AAED,SAAS,OAAO,CAAC,CAAW;IAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;IAC9B,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IAClC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;AACjD,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,cAAc,CAAC,KAAe;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAE3C,2CAA2C;IAC3C,IAAI,cAAc,GAAkB,IAAI,CAAC;IACzC,IAAI,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QAC3C,cAAc,GAAG,QAAQ,CAAC;IAC5B,CAAC;SAAM,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5E,cAAc,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1D,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;IACtC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,8CAA8C;IAC9C,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1B,CAAC;AAED,2DAA2D;AAC3D,SAAS,gBAAgB,CAAC,KAAe;IACvC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;AAC1D,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,gBAAgB,CAAC,OAAgB,EAAE,IAAY;IAC7D,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACrC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAClD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,cAAc,CAAC,KAAe,EAAE,UAAkB;IAChE,KAAK,CAAC,SAAS,GAAG,UAAU,CAAC;IAC7B,KAAK,CAAC,gBAAgB,GAAG,UAAU,CAAC;AACtC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { PetState, PetConfig, Species, Rarity, Stage, HookInput } from './types.js';
2
+ export declare function getDataDir(): string;
3
+ export declare function ensureDataDir(): void;
4
+ /** Read pet state from disk */
5
+ export declare function loadState(): PetState | null;
6
+ /** Write pet state to disk */
7
+ export declare function saveState(state: PetState): void;
8
+ /** Read config from disk */
9
+ export declare function loadConfig(): PetConfig;
10
+ /** Write config to disk */
11
+ export declare function saveConfig(config: PetConfig): void;
12
+ /** Calculate EXP required to reach a given level */
13
+ export declare function expForLevel(level: number): number;
14
+ /** Determine stage from level */
15
+ export declare function stageFromLevel(level: number): Stage;
16
+ /** Create initial pet state */
17
+ export declare function createPet(name: string, species: Species, dna: string, rarity: Rarity): PetState;
18
+ /** Award EXP and handle level ups. Returns messages for display. */
19
+ export declare function awardExp(state: PetState, baseExp: number, type: string): string[];
20
+ /** Process a hook event and return messages */
21
+ export declare function processHookEvent(state: PetState, input: HookInput): string[];
22
+ /** Feed the pet */
23
+ export declare function feedPet(state: PetState): void;
24
+ /** Pat the pet */
25
+ export declare function patPet(state: PetState): void;