@myhpmp/cli 1.6.0 → 1.7.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.
package/README.ko.md CHANGED
@@ -108,6 +108,7 @@ myhpmp locale
108
108
  | `myhpmp statusline off` | 상태 바 끄기 |
109
109
  | `myhpmp locale` | 표시 언어 변경 (한국어/English) |
110
110
  | `myhpmp init` | 인증 설정 (크로스 디바이스 동기화) |
111
+ | `myhpmp uninstall` | 모든 Hook, 상태 바 제거 및 로컬 데이터 삭제 (선택) |
111
112
 
112
113
  ## 크로스 디바이스 동기화
113
114
 
package/README.md CHANGED
@@ -108,6 +108,7 @@ That's it! EXP tracking starts via hooks. Status line is available for Claude Co
108
108
  | `myhpmp statusline off` | Disable status line |
109
109
  | `myhpmp locale` | Change display language (한국어/English) |
110
110
  | `myhpmp init` | Set up authentication (cross-device sync) |
111
+ | `myhpmp uninstall` | Remove all hooks, status line, and optionally local data |
111
112
 
112
113
  ## Cross-Device Sync
113
114
 
package/dist/cli.js CHANGED
@@ -25,6 +25,9 @@ async function main() {
25
25
  case 'statusline':
26
26
  await import('./commands/statusline-toggle.js');
27
27
  break;
28
+ case 'uninstall':
29
+ await import('./commands/uninstall.js');
30
+ break;
28
31
  default:
29
32
  console.log('🎮 My HP/MP - Gamified Usage Dashboard\n');
30
33
  console.log('Supported: Claude Code, Codex CLI\n');
@@ -35,6 +38,7 @@ async function main() {
35
38
  console.log(' sync — Manually sync stats to cloud');
36
39
  console.log(' statusline — Toggle status line on/off (Claude Code only)');
37
40
  console.log(' locale — Change display language (한국어/English)');
41
+ console.log(' uninstall — Remove all hooks and settings');
38
42
  console.log('\nQuick start:');
39
43
  console.log(' myhpmp setup # Auto-configure everything');
40
44
  console.log(' myhpmp locale # Set language');
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AAEA,kEAAkE;AAClE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAExB,KAAK,UAAU,IAAI;IACjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACnC,MAAM;QACR,KAAK,OAAO;YACV,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;YACpC,MAAM;QACR,KAAK,OAAO,CAAC;QACb,KAAK,QAAQ;YACX,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;YACpC,MAAM;QACR,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM;YACT,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;YACrC,MAAM;QACR,KAAK,MAAM;YACT,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACnC,MAAM;QACR,KAAK,YAAY;YACf,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;YAChD,MAAM;QACR;YACE,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;YACnF,MAAM;IACV,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AAEA,kEAAkE;AAClE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAExB,KAAK,UAAU,IAAI;IACjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACnC,MAAM;QACR,KAAK,OAAO;YACV,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;YACpC,MAAM;QACR,KAAK,OAAO,CAAC;QACb,KAAK,QAAQ;YACX,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;YACpC,MAAM;QACR,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM;YACT,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;YACrC,MAAM;QACR,KAAK,MAAM;YACT,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACnC,MAAM;QACR,KAAK,YAAY;YACf,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;YAChD,MAAM;QACR,KAAK,WAAW;YACd,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;YACxC,MAAM;QACR;YACE,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;YACnF,MAAM;IACV,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Remove all myhpmp hooks, status line config, and optionally local data.
3
+ * Run: myhpmp uninstall
4
+ */
5
+ import fs from 'node:fs/promises';
6
+ import path from 'node:path';
7
+ import os from 'node:os';
8
+ import readline from 'node:readline';
9
+ import { listProviders, getProvider } from '../adapter/index.js';
10
+ const RUNTIME_DIR = path.join(os.homedir(), '.myhpmp');
11
+ function ask(rl, question) {
12
+ return new Promise((resolve) => rl.question(question, resolve));
13
+ }
14
+ async function loadJsonFile(filePath) {
15
+ try {
16
+ const raw = await fs.readFile(filePath, 'utf-8');
17
+ return JSON.parse(raw);
18
+ }
19
+ catch {
20
+ return {};
21
+ }
22
+ }
23
+ async function saveJsonFile(filePath, data) {
24
+ await fs.writeFile(filePath, JSON.stringify(data, null, 2), 'utf-8');
25
+ }
26
+ function removeMyhpmpHooks(hooks) {
27
+ const cleaned = {};
28
+ for (const [event, entries] of Object.entries(hooks)) {
29
+ const filtered = entries.filter((entry) => !JSON.stringify(entry).includes('myhpmp'));
30
+ if (filtered.length > 0) {
31
+ cleaned[event] = filtered;
32
+ }
33
+ }
34
+ return cleaned;
35
+ }
36
+ async function removeProviderConfig(providerName) {
37
+ const provider = getProvider(providerName);
38
+ const config = provider.generateHookConfig('');
39
+ const settingsPath = config.settingsPath;
40
+ try {
41
+ await fs.access(settingsPath);
42
+ }
43
+ catch {
44
+ return false;
45
+ }
46
+ const settings = await loadJsonFile(settingsPath);
47
+ let changed = false;
48
+ // Remove hooks
49
+ if (settings.hooks) {
50
+ const before = JSON.stringify(settings.hooks);
51
+ settings.hooks = removeMyhpmpHooks(settings.hooks);
52
+ if (Object.keys(settings.hooks).length === 0) {
53
+ delete settings.hooks;
54
+ }
55
+ if (JSON.stringify(settings.hooks) !== before)
56
+ changed = true;
57
+ }
58
+ // Remove statusLine
59
+ if (settings.statusLine && JSON.stringify(settings.statusLine).includes('myhpmp')) {
60
+ delete settings.statusLine;
61
+ changed = true;
62
+ }
63
+ if (changed) {
64
+ await saveJsonFile(settingsPath, settings);
65
+ }
66
+ return changed;
67
+ }
68
+ async function main() {
69
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
70
+ console.log('🗑️ My HP/MP Uninstall');
71
+ console.log('━'.repeat(30));
72
+ // Remove hooks from all providers
73
+ for (const providerName of listProviders()) {
74
+ const removed = await removeProviderConfig(providerName);
75
+ if (removed) {
76
+ const provider = getProvider(providerName);
77
+ const hookNames = Object.keys(provider.generateHookConfig('').hooks).join(', ');
78
+ console.log(`\n⚙️ Removing ${providerName} hooks...`);
79
+ console.log(` ✅ Hooks removed (${hookNames})`);
80
+ if (provider.supportsStatusLine) {
81
+ console.log(' ✅ Status line removed');
82
+ }
83
+ }
84
+ }
85
+ // Ask about local data
86
+ try {
87
+ await fs.access(RUNTIME_DIR);
88
+ console.log('');
89
+ const answer = await ask(rl, 'Delete local data (~/.myhpmp)? This will remove all EXP/level data. (y/N) > ');
90
+ if (answer.trim().toLowerCase() === 'y') {
91
+ await fs.rm(RUNTIME_DIR, { recursive: true, force: true });
92
+ console.log(' ✅ Local data deleted');
93
+ }
94
+ else {
95
+ console.log(' ⏭️ Local data preserved');
96
+ }
97
+ }
98
+ catch {
99
+ // ~/.myhpmp doesn't exist
100
+ }
101
+ rl.close();
102
+ console.log('\n🎉 Uninstall complete!');
103
+ console.log(' Run "npm uninstall -g @myhpmp/cli" to remove the package.\n');
104
+ }
105
+ main().catch((err) => {
106
+ console.error('❌ Uninstall failed:', err.message);
107
+ process.exit(1);
108
+ });
109
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myhpmp/cli",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "description": "RPG-style gamified usage dashboard for AI coding tools (Claude Code full support, Codex CLI EXP/level only)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",