claude-pet 2.0.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.

Potentially problematic release.


This version of claude-pet might be problematic. Click here for more details.

Files changed (133) hide show
  1. package/.claude/commands/feed.md +28 -0
  2. package/.claude/commands/name.md +28 -0
  3. package/.claude/commands/pet.md +29 -0
  4. package/.claude/commands/play.md +29 -0
  5. package/.claude/settings.local.json +41 -0
  6. package/.github/workflows/AGENTS.md +60 -0
  7. package/.github/workflows/build.yml +87 -0
  8. package/AGENTS.md +66 -0
  9. package/LICENSE +15 -0
  10. package/README.md +292 -0
  11. package/bin/claude-pet.js +42 -0
  12. package/build/AGENTS.md +50 -0
  13. package/build/dmg-background.png +0 -0
  14. package/build/entitlements.mac.plist +14 -0
  15. package/build/icon.ico +0 -0
  16. package/build/icon.png +0 -0
  17. package/build/installerHeader.bmp +0 -0
  18. package/build/installerSidebar.bmp +0 -0
  19. package/build/tray-icon.png +0 -0
  20. package/dist/main/core/badge-manager.js +49 -0
  21. package/dist/main/core/badge-registry.js +72 -0
  22. package/dist/main/core/badge-triggers.js +45 -0
  23. package/dist/main/core/contextual-messages.js +372 -0
  24. package/dist/main/core/messages.js +440 -0
  25. package/dist/main/core/mood-engine.js +145 -0
  26. package/dist/main/core/pet-messages.js +612 -0
  27. package/dist/main/core/pet-state-engine.js +232 -0
  28. package/dist/main/core/quote-collection.js +60 -0
  29. package/dist/main/core/quote-registry.js +175 -0
  30. package/dist/main/core/quote-triggers.js +62 -0
  31. package/dist/main/core/usage-tracker.js +625 -0
  32. package/dist/main/main/auto-launch.js +39 -0
  33. package/dist/main/main/auto-updater.js +98 -0
  34. package/dist/main/main/event-watcher.js +174 -0
  35. package/dist/main/main/ipc-handlers.js +89 -0
  36. package/dist/main/main/main.js +422 -0
  37. package/dist/main/main/preload.js +93 -0
  38. package/dist/main/main/settings-window.js +49 -0
  39. package/dist/main/main/share-card.js +139 -0
  40. package/dist/main/main/skin-manager.js +118 -0
  41. package/dist/main/main/tray.js +88 -0
  42. package/dist/main/shared/i18n.js +392 -0
  43. package/dist/main/shared/types.js +25 -0
  44. package/dist/main/shared/utils.js +9 -0
  45. package/dist/renderer/assets/claude-pet.png +0 -0
  46. package/dist/renderer/assets/index-BMnMEuOf.js +9 -0
  47. package/dist/renderer/assets/index-qzlrlqpX.css +1 -0
  48. package/dist/renderer/index.html +30 -0
  49. package/dist/renderer/share-card-template/card.html +148 -0
  50. package/docs/AGENTS.md +42 -0
  51. package/docs/images/angry.png +0 -0
  52. package/docs/images/character.webp +0 -0
  53. package/docs/images/claude-mama.png +0 -0
  54. package/docs/images/happy.png +0 -0
  55. package/docs/images/proud.png +0 -0
  56. package/docs/images/share-card-example.png +0 -0
  57. package/docs/images/worried_1.png +0 -0
  58. package/docs/images/worried_2.png +0 -0
  59. package/docs/spritesheet-bugs.md +240 -0
  60. package/docs/superpowers/plans/2026-03-10-compact-widget.md +888 -0
  61. package/docs/superpowers/plans/2026-03-10-viral-features.md +1874 -0
  62. package/docs/superpowers/plans/2026-03-14-update-ux.md +362 -0
  63. package/docs/superpowers/plans/2026-03-14-v1.1-features.md +2139 -0
  64. package/docs/superpowers/specs/2026-03-10-compact-widget-design.md +150 -0
  65. package/docs/superpowers/specs/2026-03-10-viral-features-design.md +217 -0
  66. package/docs/superpowers/specs/2026-03-14-streak-calendar-design.md +26 -0
  67. package/docs/superpowers/specs/2026-03-14-update-ux-design.md +172 -0
  68. package/docs/superpowers/specs/2026-03-14-v1.1-features-design.md +342 -0
  69. package/electron-builder.yml +75 -0
  70. package/package.json +48 -0
  71. package/scripts/AGENTS.md +60 -0
  72. package/scripts/install.ps1 +47 -0
  73. package/scripts/install.sh +98 -0
  74. package/scripts/make-icon.js +119 -0
  75. package/scripts/notarize.js +18 -0
  76. package/src/AGENTS.md +47 -0
  77. package/src/core/AGENTS.md +58 -0
  78. package/src/core/__tests__/AGENTS.md +60 -0
  79. package/src/core/__tests__/badge-triggers.test.ts +83 -0
  80. package/src/core/__tests__/contextual-messages.test.ts +87 -0
  81. package/src/core/__tests__/pet-state-engine.test.ts +350 -0
  82. package/src/core/__tests__/quote-collection.test.ts +62 -0
  83. package/src/core/__tests__/quote-triggers.test.ts +110 -0
  84. package/src/core/badge-manager.ts +50 -0
  85. package/src/core/badge-registry.ts +71 -0
  86. package/src/core/badge-triggers.ts +41 -0
  87. package/src/core/contextual-messages.ts +381 -0
  88. package/src/core/pet-messages.ts +615 -0
  89. package/src/core/pet-state-engine.ts +272 -0
  90. package/src/core/quote-collection.ts +63 -0
  91. package/src/core/quote-registry.ts +181 -0
  92. package/src/core/quote-triggers.ts +64 -0
  93. package/src/core/usage-tracker.ts +680 -0
  94. package/src/main/AGENTS.md +70 -0
  95. package/src/main/auto-launch.ts +38 -0
  96. package/src/main/auto-updater.ts +106 -0
  97. package/src/main/event-watcher.ts +159 -0
  98. package/src/main/ipc-handlers.ts +107 -0
  99. package/src/main/main.ts +425 -0
  100. package/src/main/preload.ts +111 -0
  101. package/src/main/settings-window.ts +50 -0
  102. package/src/main/share-card.ts +153 -0
  103. package/src/main/skin-manager.ts +119 -0
  104. package/src/main/tray.ts +94 -0
  105. package/src/renderer/AGENTS.md +62 -0
  106. package/src/renderer/App.tsx +270 -0
  107. package/src/renderer/assets/claude-mama.png +0 -0
  108. package/src/renderer/assets/claude-pet.png +0 -0
  109. package/src/renderer/components/AGENTS.md +50 -0
  110. package/src/renderer/components/Character.tsx +327 -0
  111. package/src/renderer/components/SpeechBubble.tsx +182 -0
  112. package/src/renderer/components/UsageIndicator.tsx +268 -0
  113. package/src/renderer/electron.d.ts +34 -0
  114. package/src/renderer/hooks/AGENTS.md +55 -0
  115. package/src/renderer/hooks/usePetState.ts +59 -0
  116. package/src/renderer/hooks/useWidgetMode.ts +18 -0
  117. package/src/renderer/index.html +29 -0
  118. package/src/renderer/main.tsx +13 -0
  119. package/src/renderer/pages/AGENTS.md +53 -0
  120. package/src/renderer/pages/Collection.tsx +252 -0
  121. package/src/renderer/pages/Settings.tsx +815 -0
  122. package/src/renderer/share-card-template/card.html +148 -0
  123. package/src/renderer/styles/AGENTS.md +50 -0
  124. package/src/renderer/styles/styles.css +166 -0
  125. package/src/shared/AGENTS.md +48 -0
  126. package/src/shared/i18n.ts +395 -0
  127. package/src/shared/types.ts +163 -0
  128. package/src/shared/utils.ts +6 -0
  129. package/tsconfig.json +16 -0
  130. package/tsconfig.main.json +12 -0
  131. package/tsconfig.renderer.json +12 -0
  132. package/vite.config.ts +47 -0
  133. package/vitest.config.ts +9 -0
@@ -0,0 +1,362 @@
1
+ # Update UX Flow Improvement — Implementation Plan
2
+
3
+ > **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
4
+
5
+ **Goal:** Provide stage-by-stage native dialog feedback when users click "Check for Updates", replacing the current silent/confusing flow.
6
+
7
+ **Architecture:** Centralize all manual update logic in `auto-updater.ts` via a new `checkForUpdatesManual()` function. Use `autoDownload = false` during manual checks to control timing. Localize the existing `update-downloaded` handler. Remove duplicate logic from `tray.ts` and `main.ts`.
8
+
9
+ **Tech Stack:** Electron (dialog API), electron-updater, TypeScript
10
+
11
+ **Spec:** `docs/superpowers/specs/2026-03-14-update-ux-design.md`
12
+
13
+ ---
14
+
15
+ ## Chunk 1: i18n keys and auto-updater refactor
16
+
17
+ ### Task 1: Add i18n translation keys
18
+
19
+ **Files:**
20
+ - Modify: `src/shared/i18n.ts`
21
+
22
+ - [ ] **Step 1: Add new keys to `ko` locale**
23
+
24
+ Add after `update_up_to_date` (line 75) in the `ko` block:
25
+
26
+ ```typescript
27
+ update_downloading: '업데이트 다운로드 중...',
28
+ update_check_failed: '업데이트 확인 실패',
29
+ update_ready_title: '업데이트 준비 완료',
30
+ update_ready_message: 'v{version} 설치 준비 완료. 지금 재시작할까요?',
31
+ update_btn_restart: '지금 재시작',
32
+ update_btn_later: '나중에',
33
+ ```
34
+
35
+ - [ ] **Step 2: Add new keys to `en` locale**
36
+
37
+ Add after `update_up_to_date` (line 146) in the `en` block:
38
+
39
+ ```typescript
40
+ update_downloading: 'Downloading update...',
41
+ update_check_failed: 'Update check failed',
42
+ update_ready_title: 'Update Ready',
43
+ update_ready_message: 'v{version} is ready to install. Restart now?',
44
+ update_btn_restart: 'Restart Now',
45
+ update_btn_later: 'Later',
46
+ ```
47
+
48
+ - [ ] **Step 3: Add new keys to `ja` locale**
49
+
50
+ Add after `update_up_to_date` (line 217) in the `ja` block:
51
+
52
+ ```typescript
53
+ update_downloading: 'アップデートをダウンロード中...',
54
+ update_check_failed: 'アップデートの確認に失敗しました',
55
+ update_ready_title: 'アップデート準備完了',
56
+ update_ready_message: 'v{version}のインストール準備ができました。今すぐ再起動しますか?',
57
+ update_btn_restart: '今すぐ再起動',
58
+ update_btn_later: '後で',
59
+ ```
60
+
61
+ - [ ] **Step 4: Add new keys to `zh` locale**
62
+
63
+ Add after `update_up_to_date` (line 288) in the `zh` block:
64
+
65
+ ```typescript
66
+ update_downloading: '正在下载更新...',
67
+ update_check_failed: '检查更新失败',
68
+ update_ready_title: '更新已准备就绪',
69
+ update_ready_message: 'v{version}已准备好安装。现在重启吗?',
70
+ update_btn_restart: '立即重启',
71
+ update_btn_later: '稍后',
72
+ ```
73
+
74
+ - [ ] **Step 5: Verify build**
75
+
76
+ Run: `cd /c/projects/Personal/claude-mama && npx tsc -p tsconfig.main.json --noEmit`
77
+ Expected: No errors (type checking passes with new keys)
78
+
79
+ - [ ] **Step 6: Commit**
80
+
81
+ ```bash
82
+ git add src/shared/i18n.ts
83
+ git commit -m "feat(i18n): add update UX translation keys for all locales"
84
+ ```
85
+
86
+ ---
87
+
88
+ ### Task 2: Refactor `auto-updater.ts` — localize existing handler + add `checkForUpdatesManual()`
89
+
90
+ **Files:**
91
+ - Modify: `src/main/auto-updater.ts`
92
+
93
+ - [ ] **Step 1: Add imports and concurrency guard**
94
+
95
+ Replace the current imports (line 1-2) with:
96
+
97
+ ```typescript
98
+ import { autoUpdater } from 'electron-updater';
99
+ import { BrowserWindow, app, dialog } from 'electron';
100
+ import { getStore } from './ipc-handlers';
101
+ import { t, DEFAULT_LOCALE } from '../shared/i18n';
102
+ import { Locale } from '../shared/types';
103
+
104
+ let isManualChecking = false;
105
+ ```
106
+
107
+ - [ ] **Step 1b: Update `initAutoUpdater` to use imported `app` directly**
108
+
109
+ In `initAutoUpdater()`, replace line 6:
110
+ ```typescript
111
+ if (!require('electron').app.isPackaged) return;
112
+ ```
113
+ with:
114
+ ```typescript
115
+ if (!app.isPackaged) return;
116
+ ```
117
+
118
+ - [ ] **Step 2: Localize the `update-downloaded` handler**
119
+
120
+ Replace the existing `update-downloaded` handler (lines 15-31) with:
121
+
122
+ ```typescript
123
+ autoUpdater.on('update-downloaded', (info) => {
124
+ console.log(`[auto-updater] Update downloaded: v${info.version}`);
125
+
126
+ const locale = getStore().get('locale', DEFAULT_LOCALE) as Locale;
127
+ const win = BrowserWindow.getFocusedWindow();
128
+ dialog.showMessageBox(win ?? ({} as BrowserWindow), {
129
+ type: 'info',
130
+ title: t(locale, 'update_ready_title'),
131
+ message: t(locale, 'update_ready_message').replace('{version}', info.version),
132
+ buttons: [t(locale, 'update_btn_restart'), t(locale, 'update_btn_later')],
133
+ defaultId: 0,
134
+ }).then(({ response }) => {
135
+ if (response === 0) {
136
+ autoUpdater.quitAndInstall();
137
+ }
138
+ });
139
+ });
140
+ ```
141
+
142
+ - [ ] **Step 3: Add `checkForUpdatesManual()` export**
143
+
144
+ Add after the `initAutoUpdater` function (after line 43):
145
+
146
+ ```typescript
147
+ export async function checkForUpdatesManual(): Promise<void> {
148
+ if (isManualChecking) return;
149
+ if (!app.isPackaged) {
150
+ dialog.showMessageBox({
151
+ type: 'info',
152
+ title: 'Claude Mama',
153
+ message: 'Auto-update is not available in dev mode.',
154
+ });
155
+ return;
156
+ }
157
+
158
+ isManualChecking = true;
159
+ const locale = getStore().get('locale', DEFAULT_LOCALE) as Locale;
160
+
161
+ // Temporarily disable autoDownload to control timing
162
+ autoUpdater.autoDownload = false;
163
+
164
+ try {
165
+ const result = await autoUpdater.checkForUpdates();
166
+
167
+ if (!result || !result.updateInfo || result.updateInfo.version === app.getVersion()) {
168
+ await dialog.showMessageBox({
169
+ type: 'info',
170
+ title: 'Claude Mama',
171
+ message: t(locale, 'update_up_to_date'),
172
+ detail: `v${app.getVersion()}`,
173
+ });
174
+ return;
175
+ }
176
+
177
+ // Update found — ask user to confirm download
178
+ const newVersion = result.updateInfo.version;
179
+ const { response } = await dialog.showMessageBox({
180
+ type: 'info',
181
+ title: 'Claude Mama',
182
+ message: t(locale, 'update_downloading'),
183
+ detail: `v${app.getVersion()} → v${newVersion}`,
184
+ buttons: ['OK', 'Cancel'],
185
+ defaultId: 0,
186
+ });
187
+
188
+ if (response === 0) {
189
+ await autoUpdater.downloadUpdate();
190
+ // update-downloaded handler will show restart prompt
191
+ }
192
+ } catch (err: any) {
193
+ await dialog.showMessageBox({
194
+ type: 'error',
195
+ title: 'Claude Mama',
196
+ message: t(locale, 'update_check_failed'),
197
+ detail: err.message,
198
+ });
199
+ } finally {
200
+ autoUpdater.autoDownload = true;
201
+ isManualChecking = false;
202
+ }
203
+ }
204
+ ```
205
+
206
+ - [ ] **Step 4: Verify build**
207
+
208
+ Run: `cd /c/projects/Personal/claude-mama && npx tsc -p tsconfig.main.json --noEmit`
209
+ Expected: No errors
210
+
211
+ - [ ] **Step 5: Commit**
212
+
213
+ ```bash
214
+ git add src/main/auto-updater.ts
215
+ git commit -m "feat(updater): add checkForUpdatesManual with staged dialogs and localization"
216
+ ```
217
+
218
+ ---
219
+
220
+ ## Chunk 2: Remove duplicate logic from tray.ts and main.ts
221
+
222
+ ### Task 3: Simplify `tray.ts` — use `checkForUpdatesManual()`
223
+
224
+ **Files:**
225
+ - Modify: `src/main/tray.ts`
226
+
227
+ - [ ] **Step 1: Replace `autoUpdater` import with `checkForUpdatesManual`**
228
+
229
+ Replace line 3:
230
+ ```typescript
231
+ import { autoUpdater } from 'electron-updater';
232
+ ```
233
+ with:
234
+ ```typescript
235
+ import { checkForUpdatesManual } from './auto-updater';
236
+ ```
237
+
238
+ - [ ] **Step 2: Replace inline update logic**
239
+
240
+ Replace the entire update menu item click handler (lines 84-97):
241
+
242
+ ```typescript
243
+ click: async () => {
244
+ if (!app.isPackaged) {
245
+ dialog.showMessageBox({ type: 'info', title: 'Claude Mama', message: 'Auto-update is not available in dev mode.' });
246
+ return;
247
+ }
248
+ try {
249
+ const result = await autoUpdater.checkForUpdates();
250
+ if (!result || !result.updateInfo || result.updateInfo.version === app.getVersion()) {
251
+ dialog.showMessageBox({ type: 'info', title: 'Claude Mama', message: t(locale, 'update_up_to_date') });
252
+ }
253
+ } catch (err: any) {
254
+ dialog.showMessageBox({ type: 'error', title: 'Claude Mama', message: `Update check failed: ${err.message}` });
255
+ }
256
+ },
257
+ ```
258
+
259
+ with:
260
+
261
+ ```typescript
262
+ click: () => { void checkForUpdatesManual(); },
263
+ ```
264
+
265
+ - [ ] **Step 3: Remove unused imports**
266
+
267
+ Remove `app` and `dialog` from the Electron import if they are no longer used elsewhere in this file. Check: `app` is used on lines 33, 79, 85-86 — `app` is still needed (line 33, 79). `dialog` is only used in the update handler — remove `dialog` from the import.
268
+
269
+ - [ ] **Step 4: Verify build**
270
+
271
+ Run: `cd /c/projects/Personal/claude-mama && npx tsc -p tsconfig.main.json --noEmit`
272
+ Expected: No errors
273
+
274
+ - [ ] **Step 5: Commit**
275
+
276
+ ```bash
277
+ git add src/main/tray.ts
278
+ git commit -m "refactor(tray): use centralized checkForUpdatesManual"
279
+ ```
280
+
281
+ ---
282
+
283
+ ### Task 4: Simplify `main.ts` — use `checkForUpdatesManual()`
284
+
285
+ **Files:**
286
+ - Modify: `src/main/main.ts`
287
+
288
+ - [ ] **Step 1: Replace inline update logic in context menu**
289
+
290
+ Replace the update menu item click handler (lines 293-306):
291
+
292
+ ```typescript
293
+ click: async () => {
294
+ if (!app.isPackaged) {
295
+ dialog.showMessageBox({ type: 'info', title: 'Claude Mama', message: 'Auto-update is not available in dev mode.' });
296
+ return;
297
+ }
298
+ try {
299
+ const result = await autoUpdater.checkForUpdates();
300
+ if (!result || !result.updateInfo || result.updateInfo.version === app.getVersion()) {
301
+ dialog.showMessageBox({ type: 'info', title: 'Claude Mama', message: t(locale, 'update_up_to_date') });
302
+ }
303
+ } catch (err: any) {
304
+ dialog.showMessageBox({ type: 'error', title: 'Claude Mama', message: `Update check failed: ${err.message}` });
305
+ }
306
+ },
307
+ ```
308
+
309
+ with:
310
+
311
+ ```typescript
312
+ click: () => { void checkForUpdatesManual(); },
313
+ ```
314
+
315
+ - [ ] **Step 2: Update imports**
316
+
317
+ Add `checkForUpdatesManual` to the import from `./auto-updater`:
318
+
319
+ Replace line 14:
320
+ ```typescript
321
+ import { initAutoUpdater } from './auto-updater';
322
+ ```
323
+ with:
324
+ ```typescript
325
+ import { initAutoUpdater, checkForUpdatesManual } from './auto-updater';
326
+ ```
327
+
328
+ Remove `autoUpdater` import (line 18):
329
+ ```typescript
330
+ import { autoUpdater } from 'electron-updater';
331
+ ```
332
+ Delete this line entirely.
333
+
334
+ - [ ] **Step 3: Verify build**
335
+
336
+ Run: `cd /c/projects/Personal/claude-mama && npx tsc -p tsconfig.main.json --noEmit`
337
+ Expected: No errors
338
+
339
+ - [ ] **Step 4: Commit**
340
+
341
+ ```bash
342
+ git add src/main/main.ts
343
+ git commit -m "refactor(main): use centralized checkForUpdatesManual"
344
+ ```
345
+
346
+ ---
347
+
348
+ ### Task 5: Final verification
349
+
350
+ - [ ] **Step 1: Full build**
351
+
352
+ Run: `cd /c/projects/Personal/claude-mama && npm run build`
353
+ Expected: Build succeeds with no errors
354
+
355
+ - [ ] **Step 2: Verify no remaining `autoUpdater` imports in tray/main**
356
+
357
+ Run: `grep -n "from 'electron-updater'" src/main/tray.ts src/main/main.ts`
358
+ Expected: No matches (only `auto-updater.ts` should import from `electron-updater`)
359
+
360
+ - [ ] **Step 3: Commit (if any cleanup needed)**
361
+
362
+ Only if fixups were required in previous steps.