claude-telegram-mirror 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 (99) hide show
  1. package/README.md +331 -0
  2. package/dist/bot/commands.d.ts +41 -0
  3. package/dist/bot/commands.d.ts.map +1 -0
  4. package/dist/bot/commands.js +231 -0
  5. package/dist/bot/commands.js.map +1 -0
  6. package/dist/bot/formatting.d.ts +62 -0
  7. package/dist/bot/formatting.d.ts.map +1 -0
  8. package/dist/bot/formatting.js +295 -0
  9. package/dist/bot/formatting.js.map +1 -0
  10. package/dist/bot/telegram.d.ts +93 -0
  11. package/dist/bot/telegram.d.ts.map +1 -0
  12. package/dist/bot/telegram.js +378 -0
  13. package/dist/bot/telegram.js.map +1 -0
  14. package/dist/bot/types.d.ts +28 -0
  15. package/dist/bot/types.d.ts.map +1 -0
  16. package/dist/bot/types.js +5 -0
  17. package/dist/bot/types.js.map +1 -0
  18. package/dist/bridge/daemon.d.ts +93 -0
  19. package/dist/bridge/daemon.d.ts.map +1 -0
  20. package/dist/bridge/daemon.js +626 -0
  21. package/dist/bridge/daemon.js.map +1 -0
  22. package/dist/bridge/index.d.ts +10 -0
  23. package/dist/bridge/index.d.ts.map +1 -0
  24. package/dist/bridge/index.js +9 -0
  25. package/dist/bridge/index.js.map +1 -0
  26. package/dist/bridge/injector.d.ts +97 -0
  27. package/dist/bridge/injector.d.ts.map +1 -0
  28. package/dist/bridge/injector.js +289 -0
  29. package/dist/bridge/injector.js.map +1 -0
  30. package/dist/bridge/session.d.ts +108 -0
  31. package/dist/bridge/session.d.ts.map +1 -0
  32. package/dist/bridge/session.js +381 -0
  33. package/dist/bridge/session.js.map +1 -0
  34. package/dist/bridge/socket.d.ts +97 -0
  35. package/dist/bridge/socket.d.ts.map +1 -0
  36. package/dist/bridge/socket.js +436 -0
  37. package/dist/bridge/socket.js.map +1 -0
  38. package/dist/bridge/types.d.ts +38 -0
  39. package/dist/bridge/types.d.ts.map +1 -0
  40. package/dist/bridge/types.js +5 -0
  41. package/dist/bridge/types.js.map +1 -0
  42. package/dist/cli.d.ts +7 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +332 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/hooks/handler.d.ts +94 -0
  47. package/dist/hooks/handler.d.ts.map +1 -0
  48. package/dist/hooks/handler.js +431 -0
  49. package/dist/hooks/handler.js.map +1 -0
  50. package/dist/hooks/index.d.ts +8 -0
  51. package/dist/hooks/index.d.ts.map +1 -0
  52. package/dist/hooks/index.js +7 -0
  53. package/dist/hooks/index.js.map +1 -0
  54. package/dist/hooks/installer.d.ts +46 -0
  55. package/dist/hooks/installer.d.ts.map +1 -0
  56. package/dist/hooks/installer.js +317 -0
  57. package/dist/hooks/installer.js.map +1 -0
  58. package/dist/hooks/types.d.ts +88 -0
  59. package/dist/hooks/types.d.ts.map +1 -0
  60. package/dist/hooks/types.js +6 -0
  61. package/dist/hooks/types.js.map +1 -0
  62. package/dist/index.d.ts +19 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +20 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/service/doctor.d.ts +10 -0
  67. package/dist/service/doctor.d.ts.map +1 -0
  68. package/dist/service/doctor.js +424 -0
  69. package/dist/service/doctor.js.map +1 -0
  70. package/dist/service/manager.d.ts +48 -0
  71. package/dist/service/manager.d.ts.map +1 -0
  72. package/dist/service/manager.js +584 -0
  73. package/dist/service/manager.js.map +1 -0
  74. package/dist/service/setup.d.ts +10 -0
  75. package/dist/service/setup.d.ts.map +1 -0
  76. package/dist/service/setup.js +266 -0
  77. package/dist/service/setup.js.map +1 -0
  78. package/dist/utils/chunker.d.ts +24 -0
  79. package/dist/utils/chunker.d.ts.map +1 -0
  80. package/dist/utils/chunker.js +123 -0
  81. package/dist/utils/chunker.js.map +1 -0
  82. package/dist/utils/config.d.ts +48 -0
  83. package/dist/utils/config.d.ts.map +1 -0
  84. package/dist/utils/config.js +154 -0
  85. package/dist/utils/config.js.map +1 -0
  86. package/dist/utils/logger.d.ts +7 -0
  87. package/dist/utils/logger.d.ts.map +1 -0
  88. package/dist/utils/logger.js +28 -0
  89. package/dist/utils/logger.js.map +1 -0
  90. package/package.json +88 -0
  91. package/postinstall.cjs +76 -0
  92. package/scripts/claude-wrapper.sh +122 -0
  93. package/scripts/doctor.sh +433 -0
  94. package/scripts/get-chat-id.sh +64 -0
  95. package/scripts/global-hooks.sh +39 -0
  96. package/scripts/install.sh +831 -0
  97. package/scripts/start-daemon.sh +49 -0
  98. package/scripts/telegram-hook.sh +449 -0
  99. package/scripts/uninstall.sh +261 -0
package/dist/cli.js ADDED
@@ -0,0 +1,332 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Claude Telegram Mirror CLI
4
+ * Main command-line interface
5
+ */
6
+ import { Command } from 'commander';
7
+ import { BridgeDaemon } from './bridge/daemon.js';
8
+ import { installHooks, uninstallHooks, printHookStatus } from './hooks/installer.js';
9
+ import { loadConfig, validateConfig } from './utils/config.js';
10
+ import { installService, uninstallService, getServiceStatus, startService, stopService, restartService } from './service/manager.js';
11
+ import { runSetup } from './service/setup.js';
12
+ import { runDoctor } from './service/doctor.js';
13
+ const program = new Command();
14
+ program
15
+ .name('claude-telegram-mirror')
16
+ .description('Mirror Claude Code sessions to Telegram')
17
+ .version('1.0.0');
18
+ /**
19
+ * Start command - Run the bridge daemon
20
+ */
21
+ program
22
+ .command('start')
23
+ .description('Start the bridge daemon')
24
+ .option('-v, --verbose', 'Enable verbose logging')
25
+ .option('--foreground', 'Run in foreground (default)', true)
26
+ .action(async (options) => {
27
+ console.log('🚀 Starting Claude Code Telegram Mirror...\n');
28
+ // Load and validate config
29
+ const config = loadConfig();
30
+ const validation = validateConfig(config);
31
+ if (!validation.valid) {
32
+ console.error('❌ Configuration errors:');
33
+ validation.errors.forEach((err) => console.error(` • ${err}`));
34
+ console.error('\nSee: claude-telegram-mirror config --help\n');
35
+ process.exit(1);
36
+ }
37
+ if (validation.warnings.length > 0) {
38
+ console.warn('⚠️ Warnings:');
39
+ validation.warnings.forEach((warn) => console.warn(` • ${warn}`));
40
+ console.log('');
41
+ }
42
+ // Override verbose from CLI
43
+ if (options.verbose) {
44
+ config.verbose = true;
45
+ }
46
+ // Create and start daemon
47
+ const daemon = new BridgeDaemon(config);
48
+ // Handle shutdown signals
49
+ const shutdown = async (signal) => {
50
+ console.log(`\n📴 Received ${signal}, shutting down...`);
51
+ await daemon.stop();
52
+ process.exit(0);
53
+ };
54
+ process.on('SIGINT', () => shutdown('SIGINT'));
55
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
56
+ try {
57
+ await daemon.start();
58
+ console.log('✅ Bridge daemon running\n');
59
+ console.log('📱 Telegram chat will receive Claude Code updates');
60
+ console.log('💬 Reply in Telegram to send input to CLI\n');
61
+ console.log('Press Ctrl+C to stop\n');
62
+ }
63
+ catch (error) {
64
+ console.error('❌ Failed to start daemon:', error);
65
+ process.exit(1);
66
+ }
67
+ });
68
+ /**
69
+ * Status command - Show daemon status
70
+ */
71
+ program
72
+ .command('status')
73
+ .description('Show bridge daemon status')
74
+ .action(() => {
75
+ const config = loadConfig();
76
+ console.log('\n📊 Claude Telegram Mirror Status\n');
77
+ // Check configuration
78
+ console.log('Configuration:');
79
+ console.log(` Bot Token: ${config.botToken ? '✅ Set' : '❌ Not set'}`);
80
+ console.log(` Chat ID: ${config.chatId ? `✅ ${config.chatId}` : '❌ Not set'}`);
81
+ console.log(` Enabled: ${config.enabled ? '✅ Yes' : '⚪ No'}`);
82
+ console.log(` Verbose: ${config.verbose ? '✅ Yes' : '⚪ No'}`);
83
+ console.log(` Socket: ${config.socketPath}`);
84
+ console.log('');
85
+ // Check hooks
86
+ printHookStatus();
87
+ });
88
+ /**
89
+ * Config command - Show/set configuration
90
+ */
91
+ program
92
+ .command('config')
93
+ .description('Show or modify configuration')
94
+ .option('--show', 'Show current configuration')
95
+ .option('--test', 'Test Telegram connection')
96
+ .action(async (options) => {
97
+ const config = loadConfig();
98
+ if (options.test) {
99
+ console.log('🔄 Testing Telegram connection...\n');
100
+ try {
101
+ const response = await fetch(`https://api.telegram.org/bot${config.botToken}/getMe`);
102
+ const data = await response.json();
103
+ if (data.ok) {
104
+ console.log(`✅ Bot connected: @${data.result?.username}`);
105
+ // Try sending a test message
106
+ const msgResponse = await fetch(`https://api.telegram.org/bot${config.botToken}/sendMessage`, {
107
+ method: 'POST',
108
+ headers: { 'Content-Type': 'application/json' },
109
+ body: JSON.stringify({
110
+ chat_id: config.chatId,
111
+ text: '🧪 Test message from Claude Telegram Mirror',
112
+ parse_mode: 'Markdown'
113
+ })
114
+ });
115
+ const msgData = await msgResponse.json();
116
+ if (msgData.ok) {
117
+ console.log('✅ Test message sent to chat');
118
+ }
119
+ else {
120
+ console.log('❌ Failed to send test message');
121
+ }
122
+ }
123
+ else {
124
+ console.log('❌ Invalid bot token');
125
+ }
126
+ }
127
+ catch (error) {
128
+ console.error('❌ Connection failed:', error);
129
+ }
130
+ return;
131
+ }
132
+ // Default: show config
133
+ console.log('\n⚙️ Configuration\n');
134
+ console.log('Environment Variables:');
135
+ console.log(` TELEGRAM_MIRROR=${config.enabled}`);
136
+ console.log(` TELEGRAM_BOT_TOKEN=${config.botToken ? '[SET]' : '[NOT SET]'}`);
137
+ console.log(` TELEGRAM_CHAT_ID=${config.chatId || '[NOT SET]'}`);
138
+ console.log(` TELEGRAM_MIRROR_VERBOSE=${config.verbose}`);
139
+ console.log(` TELEGRAM_BRIDGE_SOCKET=${config.socketPath}`);
140
+ console.log('');
141
+ console.log('Add to ~/.bashrc or ~/.zshrc:');
142
+ console.log('');
143
+ console.log(' export TELEGRAM_MIRROR=true');
144
+ console.log(' export TELEGRAM_BOT_TOKEN="your-bot-token"');
145
+ console.log(' export TELEGRAM_CHAT_ID="your-chat-id"');
146
+ console.log('');
147
+ });
148
+ /**
149
+ * Install hooks command
150
+ */
151
+ program
152
+ .command('install-hooks')
153
+ .description('Install Claude Code hooks')
154
+ .option('-f, --force', 'Force reinstall hooks')
155
+ .option('-p, --project', 'Install to current project\'s .claude/settings.json (run from project directory)')
156
+ .action((options) => {
157
+ if (options.project) {
158
+ console.log(`📌 Installing hooks to project: ${process.cwd()}\n`);
159
+ }
160
+ else {
161
+ console.log('📌 Installing Claude Code hooks (global)...\n');
162
+ }
163
+ const result = installHooks({ force: options.force, project: options.project });
164
+ if (result.success) {
165
+ if (result.installed.length > 0) {
166
+ console.log('✅ Installed hooks:');
167
+ result.installed.forEach(h => console.log(` • ${h}`));
168
+ }
169
+ if (result.skipped.length > 0) {
170
+ console.log('\n⚪ Already installed:');
171
+ result.skipped.forEach(h => console.log(` • ${h}`));
172
+ }
173
+ console.log(`\n✅ Hooks installed to: ${result.settingsPath}\n`);
174
+ if (options.project) {
175
+ console.log('💡 Restart Claude Code in this project to activate hooks.\n');
176
+ }
177
+ }
178
+ else {
179
+ console.error('❌ Failed to install hooks:', result.error);
180
+ process.exit(1);
181
+ }
182
+ });
183
+ /**
184
+ * Uninstall hooks command
185
+ */
186
+ program
187
+ .command('uninstall-hooks')
188
+ .description('Remove Claude Code hooks')
189
+ .action(() => {
190
+ console.log('🗑️ Removing Claude Code hooks...\n');
191
+ const result = uninstallHooks();
192
+ if (result.success) {
193
+ if (result.removed.length > 0) {
194
+ console.log('✅ Removed hooks:');
195
+ result.removed.forEach(h => console.log(` • ${h}`));
196
+ }
197
+ else {
198
+ console.log('⚪ No hooks were installed');
199
+ }
200
+ console.log('');
201
+ }
202
+ else {
203
+ console.error('❌ Failed to remove hooks:', result.error);
204
+ process.exit(1);
205
+ }
206
+ });
207
+ /**
208
+ * Hook status command
209
+ */
210
+ program
211
+ .command('hooks')
212
+ .description('Show hook installation status')
213
+ .action(() => {
214
+ printHookStatus();
215
+ });
216
+ /**
217
+ * Setup command - Interactive configuration wizard
218
+ */
219
+ program
220
+ .command('setup')
221
+ .description('Interactive setup wizard for configuring claude-telegram-mirror')
222
+ .action(async () => {
223
+ try {
224
+ await runSetup();
225
+ }
226
+ catch (error) {
227
+ console.error('Setup failed:', error);
228
+ process.exit(1);
229
+ }
230
+ });
231
+ /**
232
+ * Doctor command - Diagnostic tool
233
+ */
234
+ program
235
+ .command('doctor')
236
+ .description('Diagnose configuration and connectivity issues')
237
+ .action(async () => {
238
+ try {
239
+ await runDoctor();
240
+ }
241
+ catch (error) {
242
+ console.error('Doctor failed:', error);
243
+ process.exit(1);
244
+ }
245
+ });
246
+ /**
247
+ * Service management commands
248
+ */
249
+ const serviceCmd = program
250
+ .command('service')
251
+ .description('Manage systemd/launchd service');
252
+ serviceCmd
253
+ .command('install')
254
+ .description('Install as a system service (systemd on Linux, launchd on macOS)')
255
+ .action(() => {
256
+ console.log('📦 Installing system service...\n');
257
+ const result = installService();
258
+ if (result.success) {
259
+ console.log('✅ ' + result.message);
260
+ }
261
+ else {
262
+ console.error('❌ ' + result.message);
263
+ process.exit(1);
264
+ }
265
+ });
266
+ serviceCmd
267
+ .command('uninstall')
268
+ .description('Uninstall the system service')
269
+ .action(() => {
270
+ console.log('🗑️ Uninstalling system service...\n');
271
+ const result = uninstallService();
272
+ if (result.success) {
273
+ console.log('✅ ' + result.message);
274
+ }
275
+ else {
276
+ console.error('❌ ' + result.message);
277
+ process.exit(1);
278
+ }
279
+ });
280
+ serviceCmd
281
+ .command('start')
282
+ .description('Start the service')
283
+ .action(() => {
284
+ const result = startService();
285
+ if (result.success) {
286
+ console.log('✅ ' + result.message);
287
+ }
288
+ else {
289
+ console.error('❌ ' + result.message);
290
+ process.exit(1);
291
+ }
292
+ });
293
+ serviceCmd
294
+ .command('stop')
295
+ .description('Stop the service')
296
+ .action(() => {
297
+ const result = stopService();
298
+ if (result.success) {
299
+ console.log('✅ ' + result.message);
300
+ }
301
+ else {
302
+ console.error('❌ ' + result.message);
303
+ process.exit(1);
304
+ }
305
+ });
306
+ serviceCmd
307
+ .command('restart')
308
+ .description('Restart the service')
309
+ .action(() => {
310
+ const result = restartService();
311
+ if (result.success) {
312
+ console.log('✅ ' + result.message);
313
+ }
314
+ else {
315
+ console.error('❌ ' + result.message);
316
+ process.exit(1);
317
+ }
318
+ });
319
+ serviceCmd
320
+ .command('status')
321
+ .description('Show service status')
322
+ .action(() => {
323
+ const status = getServiceStatus();
324
+ console.log('\n🔧 Service Status\n');
325
+ console.log(` Running: ${status.running ? '✅ Yes' : '⚪ No'}`);
326
+ console.log(` Enabled: ${status.enabled ? '✅ Yes' : '⚪ No'}`);
327
+ console.log(` Info: ${status.info}`);
328
+ console.log('');
329
+ });
330
+ // Parse arguments
331
+ program.parse();
332
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Claude Code Hook Handler
4
+ * Captures hook events and sends to bridge daemon
5
+ */
6
+ import type { AnyHookEvent, HookHandlerConfig, PreToolUseHookEvent, PostToolUseHookEvent, NotificationHookEvent, StopHookEvent, UserPromptSubmitHookEvent } from './types.js';
7
+ /**
8
+ * Hook Handler Class
9
+ * Processes Claude Code hook events and forwards to bridge
10
+ */
11
+ export declare class HookHandler {
12
+ private client;
13
+ private config;
14
+ private connected;
15
+ private sessionId;
16
+ constructor(config?: Partial<HookHandlerConfig>);
17
+ /**
18
+ * Generate a unique session ID
19
+ */
20
+ private generateSessionId;
21
+ /**
22
+ * Connect to bridge daemon
23
+ */
24
+ connect(): Promise<boolean>;
25
+ /**
26
+ * Disconnect from bridge
27
+ */
28
+ disconnect(): void;
29
+ /**
30
+ * Send message to bridge
31
+ */
32
+ private send;
33
+ /**
34
+ * Handle session start (first hook event)
35
+ */
36
+ handleSessionStart(projectDir?: string): Promise<void>;
37
+ /**
38
+ * Detect current tmux session and pane
39
+ */
40
+ private detectTmuxSession;
41
+ /**
42
+ * Handle session end
43
+ */
44
+ handleSessionEnd(): void;
45
+ /**
46
+ * Handle Stop hook
47
+ */
48
+ handleStop(event: StopHookEvent): void;
49
+ /**
50
+ * Handle PreToolUse hook
51
+ * Returns approval decision if interactive mode enabled
52
+ */
53
+ handlePreToolUse(event: PreToolUseHookEvent): Promise<{
54
+ decision: 'approve' | 'reject';
55
+ } | null>;
56
+ /**
57
+ * Handle PostToolUse hook
58
+ */
59
+ handlePostToolUse(event: PostToolUseHookEvent): void;
60
+ /**
61
+ * Handle Notification hook
62
+ */
63
+ handleNotification(event: NotificationHookEvent): void;
64
+ /**
65
+ * Handle UserPromptSubmit hook
66
+ */
67
+ handleUserPromptSubmit(event: UserPromptSubmitHookEvent): void;
68
+ /**
69
+ * Handle agent text response (assistant message)
70
+ */
71
+ handleAgentResponse(text: string): void;
72
+ /**
73
+ * Check if tool requires approval
74
+ */
75
+ private toolRequiresApproval;
76
+ /**
77
+ * Format tool description for approval request
78
+ */
79
+ private formatToolDescription;
80
+ /**
81
+ * Check if output is significant enough to send
82
+ */
83
+ private isSignificantOutput;
84
+ /**
85
+ * Process raw hook event from stdin
86
+ */
87
+ processEvent(event: AnyHookEvent): Promise<string | null>;
88
+ }
89
+ /**
90
+ * Main CLI entry point for hook processing
91
+ */
92
+ export declare function main(): Promise<void>;
93
+ export default HookHandler;
94
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/hooks/handler.ts"],"names":[],"mappings":";AACA;;;GAGG;AAQH,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAUnD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAcjC;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;IACH,OAAO,CAAC,IAAI;IAKZ;;OAEG;IACG,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB5D;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAaxB;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAsBtC;;;OAGG;IACG,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAA;KAAE,GAAG,IAAI,CAAC;IA8CtG;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI;IAmBpD;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI;IAetD;;OAEG;IACH,sBAAsB,CAAC,KAAK,EAAE,yBAAyB,GAAG,IAAI;IAa9D;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAWvC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsB5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0B7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAqChE;AAmCD;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAqD1C;AAOD,eAAe,WAAW,CAAC"}