@myhpmp/cli 1.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.
- package/LICENSE +21 -0
- package/README.ko.md +156 -0
- package/README.md +156 -0
- package/dist/adapter/claude-adapter.d.ts +9 -0
- package/dist/adapter/claude-adapter.js +36 -0
- package/dist/adapter/claude-adapter.js.map +1 -0
- package/dist/adapter/codex-adapter.d.ts +14 -0
- package/dist/adapter/codex-adapter.js +84 -0
- package/dist/adapter/codex-adapter.js.map +1 -0
- package/dist/adapter/index.d.ts +6 -0
- package/dist/adapter/index.js +18 -0
- package/dist/adapter/index.js.map +1 -0
- package/dist/adapter/provider.d.ts +23 -0
- package/dist/adapter/provider.js +6 -0
- package/dist/adapter/provider.js.map +1 -0
- package/dist/auth/auth-manager.d.ts +15 -0
- package/dist/auth/auth-manager.js +34 -0
- package/dist/auth/auth-manager.js.map +1 -0
- package/dist/auth/oauth.d.ts +6 -0
- package/dist/auth/oauth.js +113 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +46 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +116 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/locale.d.ts +1 -0
- package/dist/commands/locale.js +40 -0
- package/dist/commands/locale.js.map +1 -0
- package/dist/commands/setup.d.ts +1 -0
- package/dist/commands/setup.js +137 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/statusline-toggle.d.ts +1 -0
- package/dist/commands/statusline-toggle.js +61 -0
- package/dist/commands/statusline-toggle.js.map +1 -0
- package/dist/commands/sync.d.ts +1 -0
- package/dist/commands/sync.js +29 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/usage.d.ts +1 -0
- package/dist/commands/usage.js +56 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.js +35 -0
- package/dist/config.js.map +1 -0
- package/dist/core/exp-calculator.d.ts +1 -0
- package/dist/core/exp-calculator.js +3 -0
- package/dist/core/exp-calculator.js.map +1 -0
- package/dist/core/level-system.d.ts +2 -0
- package/dist/core/level-system.js +3 -0
- package/dist/core/level-system.js.map +1 -0
- package/dist/core/stats-aggregator.d.ts +5 -0
- package/dist/core/stats-aggregator.js +35 -0
- package/dist/core/stats-aggregator.js.map +1 -0
- package/dist/data/auto-sync.d.ts +8 -0
- package/dist/data/auto-sync.js +75 -0
- package/dist/data/auto-sync.js.map +1 -0
- package/dist/data/claude-usage.d.ts +13 -0
- package/dist/data/claude-usage.js +82 -0
- package/dist/data/claude-usage.js.map +1 -0
- package/dist/data/exp-logger.d.ts +1 -0
- package/dist/data/exp-logger.js +43 -0
- package/dist/data/exp-logger.js.map +1 -0
- package/dist/data/local-store.d.ts +16 -0
- package/dist/data/local-store.js +41 -0
- package/dist/data/local-store.js.map +1 -0
- package/dist/data/pending-exp.d.ts +8 -0
- package/dist/data/pending-exp.js +42 -0
- package/dist/data/pending-exp.js.map +1 -0
- package/dist/data/providers/db-interface.d.ts +11 -0
- package/dist/data/providers/db-interface.js +2 -0
- package/dist/data/providers/db-interface.js.map +1 -0
- package/dist/data/providers/supabase.d.ts +16 -0
- package/dist/data/providers/supabase.js +84 -0
- package/dist/data/providers/supabase.js.map +1 -0
- package/dist/data/sync-engine.d.ts +15 -0
- package/dist/data/sync-engine.js +67 -0
- package/dist/data/sync-engine.js.map +1 -0
- package/dist/display/detail-view.d.ts +23 -0
- package/dist/display/detail-view.js +36 -0
- package/dist/display/detail-view.js.map +1 -0
- package/dist/display/status-line.d.ts +12 -0
- package/dist/display/status-line.js +17 -0
- package/dist/display/status-line.js.map +1 -0
- package/dist/hooks/claude/post-tool-use.d.ts +1 -0
- package/dist/hooks/claude/post-tool-use.js +82 -0
- package/dist/hooks/claude/post-tool-use.js.map +1 -0
- package/dist/hooks/claude/session-end.d.ts +1 -0
- package/dist/hooks/claude/session-end.js +23 -0
- package/dist/hooks/claude/session-end.js.map +1 -0
- package/dist/hooks/claude/status-line-updater.d.ts +1 -0
- package/dist/hooks/claude/status-line-updater.js +48 -0
- package/dist/hooks/claude/status-line-updater.js.map +1 -0
- package/dist/hooks/codex/session-end.d.ts +1 -0
- package/dist/hooks/codex/session-end.js +40 -0
- package/dist/hooks/codex/session-end.js.map +1 -0
- package/dist/hooks/common/session-start.d.ts +1 -0
- package/dist/hooks/common/session-start.js +34 -0
- package/dist/hooks/common/session-start.js.map +1 -0
- package/dist/i18n/en.d.ts +26 -0
- package/dist/i18n/en.js +26 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/index.d.ts +7 -0
- package/dist/i18n/index.js +30 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/ko.d.ts +26 -0
- package/dist/i18n/ko.js +26 -0
- package/dist/i18n/ko.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/statusline.d.ts +2 -0
- package/dist/statusline.js +103 -0
- package/dist/statusline.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import open from 'open';
|
|
3
|
+
const CALLBACK_HTML = `<!DOCTYPE html>
|
|
4
|
+
<html><body>
|
|
5
|
+
<h2>Authenticating...</h2>
|
|
6
|
+
<script>
|
|
7
|
+
const params = new URLSearchParams(window.location.hash.substring(1));
|
|
8
|
+
const queryParams = new URLSearchParams(window.location.search);
|
|
9
|
+
|
|
10
|
+
const accessToken = params.get('access_token') || queryParams.get('access_token');
|
|
11
|
+
const refreshToken = params.get('refresh_token') || queryParams.get('refresh_token');
|
|
12
|
+
const code = queryParams.get('code');
|
|
13
|
+
const state = params.get('state') || queryParams.get('state') || '';
|
|
14
|
+
|
|
15
|
+
if (accessToken) {
|
|
16
|
+
fetch('/complete?access_token=' + encodeURIComponent(accessToken) +
|
|
17
|
+
'&refresh_token=' + encodeURIComponent(refreshToken || '') +
|
|
18
|
+
'&state=' + encodeURIComponent(state))
|
|
19
|
+
.then(() => { document.body.innerHTML = '<h1>✅ Authentication complete! You can close this tab.</h1>'; })
|
|
20
|
+
.catch(() => { document.body.innerHTML = '<h1>❌ Failed to complete auth</h1>'; });
|
|
21
|
+
} else if (code) {
|
|
22
|
+
fetch('/complete?code=' + encodeURIComponent(code) +
|
|
23
|
+
'&state=' + encodeURIComponent(state))
|
|
24
|
+
.then(() => { document.body.innerHTML = '<h1>✅ Authentication complete! You can close this tab.</h1>'; })
|
|
25
|
+
.catch(() => { document.body.innerHTML = '<h1>❌ Failed to complete auth</h1>'; });
|
|
26
|
+
} else {
|
|
27
|
+
document.body.innerHTML = '<h1>❌ No auth data received</h1>';
|
|
28
|
+
}
|
|
29
|
+
</script>
|
|
30
|
+
</body></html>`;
|
|
31
|
+
export async function signInWithOAuth(supabase, provider) {
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
const server = http.createServer(async (req, res) => {
|
|
34
|
+
const url = new URL(req.url, `http://localhost`);
|
|
35
|
+
if (url.pathname === '/callback') {
|
|
36
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
37
|
+
res.end(CALLBACK_HTML);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (url.pathname === '/complete') {
|
|
41
|
+
const code = url.searchParams.get('code');
|
|
42
|
+
const accessToken = url.searchParams.get('access_token');
|
|
43
|
+
const refreshToken = url.searchParams.get('refresh_token');
|
|
44
|
+
try {
|
|
45
|
+
// Supabase handles CSRF protection via PKCE internally
|
|
46
|
+
if (code) {
|
|
47
|
+
const { data, error } = await supabase.auth.exchangeCodeForSession(code);
|
|
48
|
+
if (error || !data.session) {
|
|
49
|
+
throw new Error(error?.message ?? 'Auth failed');
|
|
50
|
+
}
|
|
51
|
+
res.writeHead(200);
|
|
52
|
+
res.end('OK');
|
|
53
|
+
server.close();
|
|
54
|
+
resolve({
|
|
55
|
+
userId: data.session.user.id,
|
|
56
|
+
accessToken: data.session.access_token,
|
|
57
|
+
refreshToken: data.session.refresh_token,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
else if (accessToken) {
|
|
61
|
+
const { data, error } = await supabase.auth.setSession({
|
|
62
|
+
access_token: accessToken,
|
|
63
|
+
refresh_token: refreshToken || '',
|
|
64
|
+
});
|
|
65
|
+
if (error || !data.session) {
|
|
66
|
+
throw new Error(error?.message ?? 'Auth failed');
|
|
67
|
+
}
|
|
68
|
+
res.writeHead(200);
|
|
69
|
+
res.end('OK');
|
|
70
|
+
server.close();
|
|
71
|
+
resolve({
|
|
72
|
+
userId: data.session.user.id,
|
|
73
|
+
accessToken: data.session.access_token,
|
|
74
|
+
refreshToken: data.session.refresh_token,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
throw new Error('No auth data');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
res.writeHead(500);
|
|
83
|
+
res.end('Auth failed');
|
|
84
|
+
server.close();
|
|
85
|
+
reject(err);
|
|
86
|
+
}
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
server.listen(0, async () => {
|
|
91
|
+
const port = server.address().port;
|
|
92
|
+
const redirectTo = `http://localhost:${port}/callback`;
|
|
93
|
+
const { data, error } = await supabase.auth.signInWithOAuth({
|
|
94
|
+
provider,
|
|
95
|
+
options: {
|
|
96
|
+
redirectTo,
|
|
97
|
+
skipBrowserRedirect: false,
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
if (error || !data.url) {
|
|
101
|
+
server.close();
|
|
102
|
+
reject(new Error(error?.message ?? 'Failed to get OAuth URL'));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
await open(data.url);
|
|
106
|
+
});
|
|
107
|
+
setTimeout(() => {
|
|
108
|
+
server.close();
|
|
109
|
+
reject(new Error('Auth timeout (120s)'));
|
|
110
|
+
}, 120000);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
// For now, a simple arg-based router without commander dependency
|
|
4
|
+
const args = process.argv.slice(2);
|
|
5
|
+
const command = args[0];
|
|
6
|
+
async function main() {
|
|
7
|
+
switch (command) {
|
|
8
|
+
case 'init':
|
|
9
|
+
await import('./commands/init.js');
|
|
10
|
+
break;
|
|
11
|
+
case 'setup':
|
|
12
|
+
await import('./commands/setup.js');
|
|
13
|
+
break;
|
|
14
|
+
case 'usage':
|
|
15
|
+
case 'status':
|
|
16
|
+
await import('./commands/usage.js');
|
|
17
|
+
break;
|
|
18
|
+
case 'locale':
|
|
19
|
+
case 'lang':
|
|
20
|
+
await import('./commands/locale.js');
|
|
21
|
+
break;
|
|
22
|
+
case 'sync':
|
|
23
|
+
await import('./commands/sync.js');
|
|
24
|
+
break;
|
|
25
|
+
case 'statusline':
|
|
26
|
+
await import('./commands/statusline-toggle.js');
|
|
27
|
+
break;
|
|
28
|
+
default:
|
|
29
|
+
console.log('🎮 My HP/MP - Gamified Usage Dashboard\n');
|
|
30
|
+
console.log('Supported: Claude Code, Codex CLI\n');
|
|
31
|
+
console.log('Commands:');
|
|
32
|
+
console.log(' setup — Configure hooks (Claude Code / Codex CLI)');
|
|
33
|
+
console.log(' init — Set up authentication (cross-device sync)');
|
|
34
|
+
console.log(' usage — Show detailed usage stats');
|
|
35
|
+
console.log(' sync — Manually sync stats to cloud');
|
|
36
|
+
console.log(' statusline — Toggle status line on/off (Claude Code only)');
|
|
37
|
+
console.log(' locale — Change display language (한국어/English)');
|
|
38
|
+
console.log('\nQuick start:');
|
|
39
|
+
console.log(' myhpmp setup # Auto-configure everything');
|
|
40
|
+
console.log(' myhpmp locale # Set language');
|
|
41
|
+
console.log(' myhpmp init # Enable cloud sync & web dashboard (recommended)');
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
main().catch(console.error);
|
|
46
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import readline from 'node:readline';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { createClient } from '@supabase/supabase-js';
|
|
5
|
+
import { AuthManager } from '../auth/auth-manager.js';
|
|
6
|
+
import { signInWithOAuth } from '../auth/oauth.js';
|
|
7
|
+
import { LocalStore } from '../data/local-store.js';
|
|
8
|
+
import { SupabaseProvider } from '../data/providers/supabase.js';
|
|
9
|
+
import { SyncEngine } from '../data/sync-engine.js';
|
|
10
|
+
import { SUPABASE_URL, SUPABASE_ANON_KEY } from '../config.js';
|
|
11
|
+
const DATA_DIR = path.join(os.homedir(), '.myhpmp');
|
|
12
|
+
function ask(rl, question) {
|
|
13
|
+
return new Promise((resolve) => rl.question(question, resolve));
|
|
14
|
+
}
|
|
15
|
+
async function main() {
|
|
16
|
+
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
|
|
17
|
+
const authManager = new AuthManager(DATA_DIR);
|
|
18
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
19
|
+
// Check if already authenticated
|
|
20
|
+
if (await authManager.isAuthenticated()) {
|
|
21
|
+
const config = await authManager.loadConfig();
|
|
22
|
+
const langName = config.locale === 'ko' ? '한국어' : 'English';
|
|
23
|
+
console.log(`✅ Already authenticated (${config.provider})`);
|
|
24
|
+
console.log(` Language: ${langName}\n`);
|
|
25
|
+
console.log(' 1) Re-authenticate with a different account');
|
|
26
|
+
console.log(' 2) Change language');
|
|
27
|
+
console.log(' 3) Exit\n');
|
|
28
|
+
const action = await ask(rl, '> ');
|
|
29
|
+
if (action.trim() === '3' || !['1', '2'].includes(action.trim())) {
|
|
30
|
+
rl.close();
|
|
31
|
+
process.exit(0);
|
|
32
|
+
}
|
|
33
|
+
if (action.trim() === '2') {
|
|
34
|
+
console.log('\n🌍 Select display language:\n');
|
|
35
|
+
console.log(' 1) 한국어 (Korean)');
|
|
36
|
+
console.log(' 2) English\n');
|
|
37
|
+
const langChoice = await ask(rl, '> ');
|
|
38
|
+
config.locale = langChoice.trim() === '1' ? 'ko' : 'en';
|
|
39
|
+
await authManager.saveConfig(config);
|
|
40
|
+
console.log(`\n✅ Language updated!`);
|
|
41
|
+
rl.close();
|
|
42
|
+
process.exit(0);
|
|
43
|
+
}
|
|
44
|
+
// action === '1' — fall through to re-auth
|
|
45
|
+
}
|
|
46
|
+
console.log('🎮 My HP/MP Setup');
|
|
47
|
+
console.log('━'.repeat(24));
|
|
48
|
+
console.log('Select login method:\n');
|
|
49
|
+
console.log(' 1) GitHub');
|
|
50
|
+
console.log(' 2) Google\n');
|
|
51
|
+
const choice = await ask(rl, '> ');
|
|
52
|
+
let result;
|
|
53
|
+
let provider;
|
|
54
|
+
if (choice.trim() === '1') {
|
|
55
|
+
console.log('\n🌐 Opening GitHub auth page in browser...');
|
|
56
|
+
try {
|
|
57
|
+
result = await signInWithOAuth(supabase, 'github');
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
rl.close();
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
provider = 'github';
|
|
64
|
+
}
|
|
65
|
+
else if (choice.trim() === '2') {
|
|
66
|
+
console.log('\n🌐 Opening Google auth page in browser...');
|
|
67
|
+
try {
|
|
68
|
+
result = await signInWithOAuth(supabase, 'google');
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
rl.close();
|
|
72
|
+
throw err;
|
|
73
|
+
}
|
|
74
|
+
provider = 'google';
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.error('❌ Invalid selection.');
|
|
78
|
+
rl.close();
|
|
79
|
+
process.exit(1);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
console.log('\n🌍 Select display language:\n');
|
|
83
|
+
console.log(' 1) 한국어 (Korean)');
|
|
84
|
+
console.log(' 2) English\n');
|
|
85
|
+
const langChoice = await ask(rl, '> ');
|
|
86
|
+
const locale = langChoice.trim() === '1' ? 'ko' : 'en';
|
|
87
|
+
await authManager.saveConfig({
|
|
88
|
+
userId: result.userId,
|
|
89
|
+
accessToken: result.accessToken,
|
|
90
|
+
refreshToken: result.refreshToken,
|
|
91
|
+
provider,
|
|
92
|
+
locale,
|
|
93
|
+
});
|
|
94
|
+
// Create initial user_stats row in Supabase + sync local data
|
|
95
|
+
console.log('\n📡 Syncing with cloud...');
|
|
96
|
+
try {
|
|
97
|
+
const store = new LocalStore(DATA_DIR);
|
|
98
|
+
const dbProvider = new SupabaseProvider(SUPABASE_URL, SUPABASE_ANON_KEY);
|
|
99
|
+
await dbProvider.setSession(result.accessToken, result.refreshToken);
|
|
100
|
+
const engine = new SyncEngine(store, dbProvider);
|
|
101
|
+
await engine.sync(result.userId);
|
|
102
|
+
console.log(' ✅ Synced');
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
console.log(' ⚠️ Sync failed (will retry on next session)');
|
|
106
|
+
}
|
|
107
|
+
console.log(`\n✅ Authentication complete!`);
|
|
108
|
+
console.log(`📁 Config saved: ${DATA_DIR}/config.json`);
|
|
109
|
+
rl.close();
|
|
110
|
+
process.exit(0);
|
|
111
|
+
}
|
|
112
|
+
main().catch((err) => {
|
|
113
|
+
console.error('❌ Init failed:', err instanceof Error ? err.message : String(err));
|
|
114
|
+
process.exit(1);
|
|
115
|
+
});
|
|
116
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import readline from 'node:readline';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { AuthManager } from '../auth/auth-manager.js';
|
|
5
|
+
const DATA_DIR = path.join(os.homedir(), '.myhpmp');
|
|
6
|
+
function ask(rl, question) {
|
|
7
|
+
return new Promise((resolve) => rl.question(question, resolve));
|
|
8
|
+
}
|
|
9
|
+
async function main() {
|
|
10
|
+
const authManager = new AuthManager(DATA_DIR);
|
|
11
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
12
|
+
console.log('🌍 Select display language:\n');
|
|
13
|
+
console.log(' 1) 한국어 (Korean)');
|
|
14
|
+
console.log(' 2) English\n');
|
|
15
|
+
const choice = await ask(rl, '> ');
|
|
16
|
+
const locale = choice.trim() === '1' ? 'ko' : 'en';
|
|
17
|
+
try {
|
|
18
|
+
const config = await authManager.loadConfig();
|
|
19
|
+
config.locale = locale;
|
|
20
|
+
await authManager.saveConfig(config);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// No config yet — create minimal one with just locale
|
|
24
|
+
await authManager.saveConfig({
|
|
25
|
+
userId: '',
|
|
26
|
+
accessToken: '',
|
|
27
|
+
refreshToken: '',
|
|
28
|
+
provider: 'github',
|
|
29
|
+
locale,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const langName = locale === 'ko' ? '한국어' : 'English';
|
|
33
|
+
console.log(`\n✅ Language set to ${langName}`);
|
|
34
|
+
rl.close();
|
|
35
|
+
}
|
|
36
|
+
main().catch((err) => {
|
|
37
|
+
console.error('❌ Failed:', err.message);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=locale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locale.js","sourceRoot":"","sources":["../../src/commands/locale.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAEpD,SAAS,GAAG,CAAC,EAAsB,EAAE,QAAgB;IACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEtF,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAE9B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;QAC9C,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,MAAM,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;QACtD,MAAM,WAAW,CAAC,UAAU,CAAC;YAC3B,MAAM,EAAE,EAAE;YACV,WAAW,EAAE,EAAE;YACf,YAAY,EAAE,EAAE;YAChB,QAAQ,EAAE,QAAQ;YAClB,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC;IAC/C,EAAE,CAAC,KAAK,EAAE,CAAC;AACb,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-configure hooks for supported AI coding tools.
|
|
3
|
+
* Run: myhpmp setup
|
|
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 { execSync } from 'node:child_process';
|
|
10
|
+
import { getProvider, listProviders } from '../adapter/index.js';
|
|
11
|
+
const DIST_DIR = path.join(os.homedir(), '.myhpmp', 'dist');
|
|
12
|
+
function ask(rl, question) {
|
|
13
|
+
return new Promise((resolve) => rl.question(question, resolve));
|
|
14
|
+
}
|
|
15
|
+
async function copyDistFiles() {
|
|
16
|
+
const srcDist = path.resolve(import.meta.dirname, '..');
|
|
17
|
+
await fs.mkdir(DIST_DIR, { recursive: true });
|
|
18
|
+
async function copyRecursive(src, dest) {
|
|
19
|
+
const stat = await fs.stat(src);
|
|
20
|
+
if (stat.isDirectory()) {
|
|
21
|
+
await fs.mkdir(dest, { recursive: true });
|
|
22
|
+
const entries = await fs.readdir(src);
|
|
23
|
+
for (const entry of entries) {
|
|
24
|
+
await copyRecursive(path.join(src, entry), path.join(dest, entry));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
await fs.copyFile(src, dest);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
await copyRecursive(srcDist, DIST_DIR);
|
|
32
|
+
}
|
|
33
|
+
async function loadJsonFile(filePath) {
|
|
34
|
+
try {
|
|
35
|
+
const raw = await fs.readFile(filePath, 'utf-8');
|
|
36
|
+
return JSON.parse(raw);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return {};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async function saveJsonFile(filePath, data) {
|
|
43
|
+
const dir = path.dirname(filePath);
|
|
44
|
+
await fs.mkdir(dir, { recursive: true });
|
|
45
|
+
await fs.writeFile(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
46
|
+
}
|
|
47
|
+
async function setupProvider(providerName) {
|
|
48
|
+
const provider = getProvider(providerName);
|
|
49
|
+
const config = provider.generateHookConfig(DIST_DIR);
|
|
50
|
+
console.log(`\n⚙️ Configuring ${provider.name} hooks...`);
|
|
51
|
+
const settings = await loadJsonFile(config.settingsPath);
|
|
52
|
+
// Add hooks
|
|
53
|
+
if (!settings.hooks)
|
|
54
|
+
settings.hooks = {};
|
|
55
|
+
const existingHooks = settings.hooks;
|
|
56
|
+
for (const [event, hookConfig] of Object.entries(config.hooks)) {
|
|
57
|
+
const existing = existingHooks[event];
|
|
58
|
+
if (!existing) {
|
|
59
|
+
existingHooks[event] = hookConfig;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const alreadyHas = JSON.stringify(existing).includes('myhpmp');
|
|
63
|
+
if (!alreadyHas) {
|
|
64
|
+
existing.push(...hookConfig);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Add status line (if supported)
|
|
69
|
+
if (config.statusLine) {
|
|
70
|
+
settings.statusLine = config.statusLine;
|
|
71
|
+
}
|
|
72
|
+
await saveJsonFile(config.settingsPath, settings);
|
|
73
|
+
const hookNames = Object.keys(config.hooks).join(', ');
|
|
74
|
+
console.log(` ✅ Hooks configured (${hookNames})`);
|
|
75
|
+
if (config.statusLine) {
|
|
76
|
+
console.log(' ✅ Status line configured');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function main() {
|
|
80
|
+
const providers = listProviders();
|
|
81
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
82
|
+
console.log('🎮 My HP/MP Setup');
|
|
83
|
+
console.log('━'.repeat(30));
|
|
84
|
+
// Select provider(s)
|
|
85
|
+
console.log('\nSelect AI coding tool to configure:\n');
|
|
86
|
+
providers.forEach((p, i) => console.log(` ${i + 1}) ${p}`));
|
|
87
|
+
console.log(` ${providers.length + 1}) All\n`);
|
|
88
|
+
const choice = await ask(rl, '> ');
|
|
89
|
+
rl.close();
|
|
90
|
+
const choiceNum = parseInt(choice.trim());
|
|
91
|
+
let selectedProviders;
|
|
92
|
+
if (choiceNum === providers.length + 1) {
|
|
93
|
+
selectedProviders = providers;
|
|
94
|
+
}
|
|
95
|
+
else if (choiceNum >= 1 && choiceNum <= providers.length) {
|
|
96
|
+
selectedProviders = [providers[choiceNum - 1]];
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
console.error('❌ Invalid selection.');
|
|
100
|
+
process.exit(1);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// Step 1: Copy dist files
|
|
104
|
+
console.log('\n📦 Installing files to ~/.myhpmp/dist/ ...');
|
|
105
|
+
await copyDistFiles();
|
|
106
|
+
console.log(' ✅ Done');
|
|
107
|
+
// Step 2: Install runtime dependencies
|
|
108
|
+
console.log('\n📦 Installing dependencies...');
|
|
109
|
+
const pkgJson = { name: 'myhpmp-runtime', private: true, type: 'module', dependencies: { '@supabase/supabase-js': '^2' } };
|
|
110
|
+
const runtimeDir = path.join(os.homedir(), '.myhpmp');
|
|
111
|
+
await fs.writeFile(path.join(runtimeDir, 'package.json'), JSON.stringify(pkgJson, null, 2), 'utf-8');
|
|
112
|
+
try {
|
|
113
|
+
execSync('npm install --production --silent', { cwd: runtimeDir, stdio: 'pipe' });
|
|
114
|
+
console.log(' ✅ Done');
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
console.log(' ⚠️ Failed (sync features may not work)');
|
|
118
|
+
}
|
|
119
|
+
// Step 3: Configure each selected provider
|
|
120
|
+
for (const providerName of selectedProviders) {
|
|
121
|
+
await setupProvider(providerName);
|
|
122
|
+
}
|
|
123
|
+
console.log('\n🎉 Setup complete!');
|
|
124
|
+
if (selectedProviders.includes('claude')) {
|
|
125
|
+
console.log(' Restart Claude Code to see the status line.');
|
|
126
|
+
}
|
|
127
|
+
if (selectedProviders.includes('codex')) {
|
|
128
|
+
console.log(' Restart Codex CLI to start tracking.');
|
|
129
|
+
}
|
|
130
|
+
console.log(' Run "myhpmp usage" to see your stats.');
|
|
131
|
+
console.log(' Run "myhpmp init" to enable cloud sync & web dashboard (recommended)\n');
|
|
132
|
+
}
|
|
133
|
+
main().catch((err) => {
|
|
134
|
+
console.error('❌ Setup failed:', err.message);
|
|
135
|
+
process.exit(1);
|
|
136
|
+
});
|
|
137
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
const SETTINGS_PATH = path.join(os.homedir(), '.claude', 'settings.json');
|
|
5
|
+
const DIST_DIR = path.join(os.homedir(), '.myhpmp', 'dist');
|
|
6
|
+
async function loadSettings() {
|
|
7
|
+
try {
|
|
8
|
+
const raw = await fs.readFile(SETTINGS_PATH, 'utf-8');
|
|
9
|
+
return JSON.parse(raw);
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async function saveSettings(settings) {
|
|
16
|
+
await fs.writeFile(SETTINGS_PATH, JSON.stringify(settings, null, 2), 'utf-8');
|
|
17
|
+
}
|
|
18
|
+
const arg = process.argv[3]?.toLowerCase(); // setup → statusline → on|off
|
|
19
|
+
async function main() {
|
|
20
|
+
const settings = await loadSettings();
|
|
21
|
+
if (arg === 'on') {
|
|
22
|
+
settings.statusLine = {
|
|
23
|
+
type: 'command',
|
|
24
|
+
command: `node ${path.join(DIST_DIR, 'statusline.js').replace(/\\/g, '/')}`,
|
|
25
|
+
};
|
|
26
|
+
delete settings._statusLineBackup;
|
|
27
|
+
await saveSettings(settings);
|
|
28
|
+
console.log('✅ Status line enabled. Restart Claude Code to apply.');
|
|
29
|
+
}
|
|
30
|
+
else if (arg === 'off') {
|
|
31
|
+
if (settings.statusLine) {
|
|
32
|
+
settings._statusLineBackup = settings.statusLine;
|
|
33
|
+
}
|
|
34
|
+
delete settings.statusLine;
|
|
35
|
+
await saveSettings(settings);
|
|
36
|
+
console.log('✅ Status line disabled. Restart Claude Code to apply.');
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// Toggle
|
|
40
|
+
if (settings.statusLine) {
|
|
41
|
+
settings._statusLineBackup = settings.statusLine;
|
|
42
|
+
delete settings.statusLine;
|
|
43
|
+
await saveSettings(settings);
|
|
44
|
+
console.log('✅ Status line disabled. Restart Claude Code to apply.');
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
settings.statusLine = settings._statusLineBackup || {
|
|
48
|
+
type: 'command',
|
|
49
|
+
command: `node ${path.join(DIST_DIR, 'statusline.js').replace(/\\/g, '/')}`,
|
|
50
|
+
};
|
|
51
|
+
delete settings._statusLineBackup;
|
|
52
|
+
await saveSettings(settings);
|
|
53
|
+
console.log('✅ Status line enabled. Restart Claude Code to apply.');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
main().catch((err) => {
|
|
58
|
+
console.error('❌ Failed:', err.message);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=statusline-toggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusline-toggle.js","sourceRoot":"","sources":["../../src/commands/statusline-toggle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAQ5D,KAAK,UAAU,YAAY;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAwB;IAClD,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,8BAA8B;AAE1E,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IAEtC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,QAAQ,CAAC,UAAU,GAAG;YACpB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;SAC5E,CAAC;QACF,OAAO,QAAQ,CAAC,iBAAiB,CAAC;QAClC,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACtE,CAAC;SAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QACzB,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACxB,QAAQ,CAAC,iBAAiB,GAAG,QAAQ,CAAC,UAAU,CAAC;QACnD,CAAC;QACD,OAAO,QAAQ,CAAC,UAAU,CAAC;QAC3B,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACvE,CAAC;SAAM,CAAC;QACN,SAAS;QACT,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACxB,QAAQ,CAAC,iBAAiB,GAAG,QAAQ,CAAC,UAAU,CAAC;YACjD,OAAO,QAAQ,CAAC,UAAU,CAAC;YAC3B,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,iBAAiB,IAAI;gBAClD,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;aAC5E,CAAC;YACF,OAAO,QAAQ,CAAC,iBAAiB,CAAC;YAClC,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { AuthManager } from '../auth/auth-manager.js';
|
|
4
|
+
import { LocalStore } from '../data/local-store.js';
|
|
5
|
+
import { SupabaseProvider } from '../data/providers/supabase.js';
|
|
6
|
+
import { SyncEngine } from '../data/sync-engine.js';
|
|
7
|
+
import { SUPABASE_URL, SUPABASE_ANON_KEY } from '../config.js';
|
|
8
|
+
const DATA_DIR = path.join(os.homedir(), '.myhpmp');
|
|
9
|
+
async function main() {
|
|
10
|
+
const authManager = new AuthManager(DATA_DIR);
|
|
11
|
+
if (!(await authManager.isAuthenticated())) {
|
|
12
|
+
console.error('❌ Not authenticated. Run "myhpmp init" first.');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const config = await authManager.loadConfig();
|
|
16
|
+
const store = new LocalStore(DATA_DIR);
|
|
17
|
+
const provider = new SupabaseProvider(SUPABASE_URL, SUPABASE_ANON_KEY);
|
|
18
|
+
await provider.setSession(config.accessToken, config.refreshToken);
|
|
19
|
+
const engine = new SyncEngine(store, provider);
|
|
20
|
+
console.log('📡 Syncing...');
|
|
21
|
+
const result = await engine.sync(config.userId);
|
|
22
|
+
console.log(`✅ Synced — Lv.${result.level} | EXP: ${result.totalExp} | Streak: ${result.streakDays}d`);
|
|
23
|
+
process.exit(0);
|
|
24
|
+
}
|
|
25
|
+
main().catch((err) => {
|
|
26
|
+
console.error('❌ Sync failed:', err instanceof Error ? err.message : String(err));
|
|
27
|
+
process.exit(1);
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE/D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAEpD,KAAK,UAAU,IAAI;IACjB,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE9C,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IACvE,MAAM,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE/C,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,KAAK,WAAW,MAAM,CAAC,QAAQ,cAAc,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;IACvG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|