@cyberdrk/tg 0.1.1

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 (91) hide show
  1. package/README.md +123 -0
  2. package/SKILL.md +110 -0
  3. package/dist/auth.d.ts +4 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +61 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/client.d.ts +63 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +396 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/commands/auth.d.ts +3 -0
  12. package/dist/commands/auth.d.ts.map +1 -0
  13. package/dist/commands/auth.js +21 -0
  14. package/dist/commands/auth.js.map +1 -0
  15. package/dist/commands/chats.d.ts +3 -0
  16. package/dist/commands/chats.d.ts.map +1 -0
  17. package/dist/commands/chats.js +42 -0
  18. package/dist/commands/chats.js.map +1 -0
  19. package/dist/commands/check.d.ts +3 -0
  20. package/dist/commands/check.d.ts.map +1 -0
  21. package/dist/commands/check.js +28 -0
  22. package/dist/commands/check.js.map +1 -0
  23. package/dist/commands/contact.d.ts +3 -0
  24. package/dist/commands/contact.d.ts.map +1 -0
  25. package/dist/commands/contact.js +38 -0
  26. package/dist/commands/contact.js.map +1 -0
  27. package/dist/commands/groups.d.ts +3 -0
  28. package/dist/commands/groups.d.ts.map +1 -0
  29. package/dist/commands/groups.js +45 -0
  30. package/dist/commands/groups.js.map +1 -0
  31. package/dist/commands/inbox.d.ts +3 -0
  32. package/dist/commands/inbox.d.ts.map +1 -0
  33. package/dist/commands/inbox.js +42 -0
  34. package/dist/commands/inbox.js.map +1 -0
  35. package/dist/commands/index.d.ts +14 -0
  36. package/dist/commands/index.d.ts.map +1 -0
  37. package/dist/commands/index.js +14 -0
  38. package/dist/commands/index.js.map +1 -0
  39. package/dist/commands/members.d.ts +4 -0
  40. package/dist/commands/members.d.ts.map +1 -0
  41. package/dist/commands/members.js +73 -0
  42. package/dist/commands/members.js.map +1 -0
  43. package/dist/commands/read.d.ts +3 -0
  44. package/dist/commands/read.d.ts.map +1 -0
  45. package/dist/commands/read.js +69 -0
  46. package/dist/commands/read.js.map +1 -0
  47. package/dist/commands/reply.d.ts +3 -0
  48. package/dist/commands/reply.d.ts.map +1 -0
  49. package/dist/commands/reply.js +37 -0
  50. package/dist/commands/reply.js.map +1 -0
  51. package/dist/commands/search.d.ts +3 -0
  52. package/dist/commands/search.d.ts.map +1 -0
  53. package/dist/commands/search.js +53 -0
  54. package/dist/commands/search.js.map +1 -0
  55. package/dist/commands/send.d.ts +3 -0
  56. package/dist/commands/send.d.ts.map +1 -0
  57. package/dist/commands/send.js +35 -0
  58. package/dist/commands/send.js.map +1 -0
  59. package/dist/commands/sync.d.ts +3 -0
  60. package/dist/commands/sync.d.ts.map +1 -0
  61. package/dist/commands/sync.js +89 -0
  62. package/dist/commands/sync.js.map +1 -0
  63. package/dist/commands/whoami.d.ts +3 -0
  64. package/dist/commands/whoami.d.ts.map +1 -0
  65. package/dist/commands/whoami.js +40 -0
  66. package/dist/commands/whoami.js.map +1 -0
  67. package/dist/config.d.ts +18 -0
  68. package/dist/config.d.ts.map +1 -0
  69. package/dist/config.js +106 -0
  70. package/dist/config.js.map +1 -0
  71. package/dist/formatters/index.d.ts +10 -0
  72. package/dist/formatters/index.d.ts.map +1 -0
  73. package/dist/formatters/index.js +11 -0
  74. package/dist/formatters/index.js.map +1 -0
  75. package/dist/formatters/json.d.ts +2 -0
  76. package/dist/formatters/json.d.ts.map +1 -0
  77. package/dist/formatters/json.js +4 -0
  78. package/dist/formatters/json.js.map +1 -0
  79. package/dist/formatters/markdown.d.ts +21 -0
  80. package/dist/formatters/markdown.d.ts.map +1 -0
  81. package/dist/formatters/markdown.js +87 -0
  82. package/dist/formatters/markdown.js.map +1 -0
  83. package/dist/formatters/plain.d.ts +27 -0
  84. package/dist/formatters/plain.d.ts.map +1 -0
  85. package/dist/formatters/plain.js +121 -0
  86. package/dist/formatters/plain.js.map +1 -0
  87. package/dist/index.d.ts +3 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +29 -0
  90. package/dist/index.js.map +1 -0
  91. package/package.json +52 -0
package/README.md ADDED
@@ -0,0 +1,123 @@
1
+ # tg - Telegram CLI
2
+
3
+ Fast Telegram CLI for reading, searching, and sending messages. Designed for both interactive use and AI agent integration.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g @cyberdrk/tg
9
+ ```
10
+
11
+ Or install from source:
12
+
13
+ ```bash
14
+ git clone https://github.com/cyberdrk305/telegram.git
15
+ cd telegram
16
+ npm install
17
+ npm run build
18
+ npm link
19
+ ```
20
+
21
+ ## Authentication
22
+
23
+ First, get your API credentials:
24
+ 1. Go to https://my.telegram.org/apps
25
+ 2. Log in with your phone number
26
+ 3. Create a new application
27
+ 4. Copy the `api_id` and `api_hash`
28
+
29
+ Then authenticate:
30
+
31
+ ```bash
32
+ tg auth
33
+ ```
34
+
35
+ ## Commands
36
+
37
+ ### Auth & Status
38
+
39
+ ```bash
40
+ tg whoami # Show logged-in account
41
+ tg check # Verify session/credentials
42
+ ```
43
+
44
+ ### Reading
45
+
46
+ ```bash
47
+ tg chats # List all chats
48
+ tg chats --type group # Filter by type (user, group, supergroup, channel)
49
+ tg read "MetaDAO Community" -n 50 # Read last 50 messages
50
+ tg read "MetaDAO" --since "1h" # Messages from last hour
51
+ tg read @username -n 20 # Read DM with user
52
+ tg search "futarchy" --chat "MetaDAO" # Search within chat
53
+ tg search "futarchy" --all # Search all chats
54
+ tg inbox # Unread messages summary
55
+ ```
56
+
57
+ ### Writing
58
+
59
+ ```bash
60
+ tg send @username "Hello" # Send DM
61
+ tg send "GroupName" "Hello everyone" # Send to group
62
+ tg reply "ChatName" 12345 "Response" # Reply to message ID
63
+ ```
64
+
65
+ ### Contacts & Groups
66
+
67
+ ```bash
68
+ tg contact @username # Get contact info
69
+ tg members "GroupName" # List group members
70
+ tg admins "GroupName" # List admins only
71
+ tg groups # List all groups
72
+ tg groups --admin # Groups where you're admin
73
+ ```
74
+
75
+ ### Utilities
76
+
77
+ ```bash
78
+ tg sync --days 7 # Sync last 7 days to markdown
79
+ tg sync --chat "MetaDAO" --days 30 # Sync specific chat
80
+ ```
81
+
82
+ ## Output Formats
83
+
84
+ All read commands support multiple output formats:
85
+
86
+ ```bash
87
+ tg chats --json # JSON (for scripts/AI)
88
+ tg read "Chat" --markdown # Markdown format
89
+ tg inbox --plain # Plain text (no colors)
90
+ ```
91
+
92
+ ## Configuration
93
+
94
+ Configuration is stored in `~/.config/tg/`:
95
+ - `config.json` - API credentials and session
96
+ - Session data is encrypted and stored securely
97
+
98
+ ## Claude Code Skill
99
+
100
+ This package includes a Claude Code skill for AI agent integration. To install:
101
+
102
+ ```bash
103
+ # Symlink the skill to your Claude skills directory
104
+ mkdir -p ~/.claude/skills
105
+ ln -s $(npm root -g)/@cyberdrk/tg/SKILL.md ~/.claude/skills/tg.md
106
+ ```
107
+
108
+ Or if installed from source:
109
+ ```bash
110
+ ln -s ~/Code/cyberdrk305/telegram/SKILL.md ~/.claude/skills/tg.md
111
+ ```
112
+
113
+ ## Development
114
+
115
+ ```bash
116
+ npm install
117
+ npm run build
118
+ npm run dev # Watch mode
119
+ ```
120
+
121
+ ## License
122
+
123
+ MIT
package/SKILL.md ADDED
@@ -0,0 +1,110 @@
1
+ ---
2
+ name: tg
3
+ description: Telegram CLI for reading, searching, and sending messages. Use when the user asks about Telegram messages, wants to check inbox, search chats, send messages, or look up contacts and groups.
4
+ ---
5
+
6
+ # Telegram CLI
7
+
8
+ Fast Telegram CLI for reading, searching, and sending messages.
9
+
10
+ ## When to Use
11
+
12
+ Use this skill when the user:
13
+ - Asks to check Telegram messages or inbox
14
+ - Wants to search Telegram for a topic/keyword
15
+ - Wants to send a Telegram message to someone
16
+ - Asks about a Telegram group, contact, or chat
17
+ - Wants to see unread messages
18
+ - Needs to look up group members or admins
19
+
20
+ ## Install
21
+
22
+ ```bash
23
+ npm install -g @cyberdrk/tg
24
+ ```
25
+
26
+ Or from source:
27
+ ```bash
28
+ cd ~/Code/cyberdrk305/telegram && npm install && npm run build && npm link
29
+ ```
30
+
31
+ ## Authentication
32
+
33
+ First-time setup requires API credentials from https://my.telegram.org/apps
34
+
35
+ ```bash
36
+ tg auth
37
+ ```
38
+
39
+ ## Commands
40
+
41
+ ### Reading
42
+ ```bash
43
+ tg inbox # Unread messages summary
44
+ tg chats # List all chats
45
+ tg read "ChatName" -n 50 # Read last 50 messages
46
+ tg read "ChatName" --since "1h" # Messages from last hour
47
+ tg read @username -n 20 # Read DM with user
48
+ tg search "query" --chat "ChatName" # Search within chat
49
+ tg search "query" --all # Search all chats
50
+ ```
51
+
52
+ ### Writing
53
+ ```bash
54
+ tg send @username "message" # Send DM
55
+ tg send "GroupName" "message" # Send to group
56
+ tg reply "ChatName" 12345 "response" # Reply to message ID
57
+ ```
58
+
59
+ ### Contacts & Groups
60
+ ```bash
61
+ tg contact @username # Get contact info
62
+ tg members "GroupName" # List group members
63
+ tg admins "GroupName" # List admins only
64
+ tg groups --admin # Groups where you're admin
65
+ ```
66
+
67
+ ### Status
68
+ ```bash
69
+ tg whoami # Show logged-in account
70
+ tg check # Verify session
71
+ ```
72
+
73
+ ## Output Formats
74
+
75
+ All commands support `--json` for structured output suitable for processing:
76
+
77
+ ```bash
78
+ tg inbox --json # JSON format
79
+ tg read "Chat" --json # JSON with messages array
80
+ tg chats --json # JSON with chat list
81
+ ```
82
+
83
+ ## Examples
84
+
85
+ Check inbox:
86
+ ```bash
87
+ tg inbox
88
+ ```
89
+
90
+ Read recent messages from a chat:
91
+ ```bash
92
+ tg read "MetaDAO Community" -n 20
93
+ ```
94
+
95
+ Search for a topic:
96
+ ```bash
97
+ tg search "futarchy" --chat "MetaDAO"
98
+ ```
99
+
100
+ Send a message:
101
+ ```bash
102
+ tg send @username "Hello, checking in!"
103
+ ```
104
+
105
+ ## Notes
106
+
107
+ - Chat names can be partial matches (e.g., "MetaDAO" matches "MetaDAO Community")
108
+ - Usernames must start with @ (e.g., @username)
109
+ - Messages are returned in reverse chronological order (newest first)
110
+ - The `--since` flag accepts formats like "1h", "30m", "7d"
package/dist/auth.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { TelegramClient } from 'telegram';
2
+ export declare function authenticate(): Promise<TelegramClient>;
3
+ export declare function checkAuth(client: TelegramClient): Promise<boolean>;
4
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAmB1C,wBAAsB,YAAY,IAAI,OAAO,CAAC,cAAc,CAAC,CA6C5D;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAOxE"}
package/dist/auth.js ADDED
@@ -0,0 +1,61 @@
1
+ import { TelegramClient } from 'telegram';
2
+ import { StringSession } from 'telegram/sessions/index.js';
3
+ import { createInterface } from 'readline';
4
+ import { setCredentials, setSessionString } from './config.js';
5
+ function prompt(question) {
6
+ const rl = createInterface({
7
+ input: process.stdin,
8
+ output: process.stdout,
9
+ });
10
+ return new Promise((resolve) => {
11
+ rl.question(question, (answer) => {
12
+ rl.close();
13
+ resolve(answer.trim());
14
+ });
15
+ });
16
+ }
17
+ export async function authenticate() {
18
+ console.log('\nTelegram Authentication Setup\n');
19
+ console.log('To get your API credentials:');
20
+ console.log('1. Go to https://my.telegram.org/apps');
21
+ console.log('2. Log in with your phone number');
22
+ console.log('3. Create a new application (if you haven\'t already)');
23
+ console.log('4. Copy the api_id and api_hash\n');
24
+ const apiIdStr = await prompt('Enter your API ID: ');
25
+ const apiId = parseInt(apiIdStr, 10);
26
+ if (isNaN(apiId)) {
27
+ throw new Error('Invalid API ID');
28
+ }
29
+ const apiHash = await prompt('Enter your API Hash: ');
30
+ if (!apiHash) {
31
+ throw new Error('Invalid API Hash');
32
+ }
33
+ // Save credentials
34
+ setCredentials(apiId, apiHash);
35
+ console.log('\nConnecting to Telegram...');
36
+ const session = new StringSession('');
37
+ const client = new TelegramClient(session, apiId, apiHash, {
38
+ connectionRetries: 5,
39
+ });
40
+ await client.start({
41
+ phoneNumber: async () => await prompt('Enter your phone number (with country code, e.g., +1234567890): '),
42
+ password: async () => await prompt('Enter your 2FA password (press Enter if none): '),
43
+ phoneCode: async () => await prompt('Enter the code you received: '),
44
+ onError: (err) => console.error('Error:', err),
45
+ });
46
+ // Save session
47
+ const sessionString = client.session.save();
48
+ setSessionString(sessionString);
49
+ console.log('\nAuthentication successful! Session saved.');
50
+ return client;
51
+ }
52
+ export async function checkAuth(client) {
53
+ try {
54
+ await client.connect();
55
+ return await client.isUserAuthorized();
56
+ }
57
+ catch {
58
+ return false;
59
+ }
60
+ }
61
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { TelegramClient, Api } from 'telegram';
2
+ export declare function getClient(): Promise<TelegramClient>;
3
+ export declare function createClient(apiId: number, apiHash: string): Promise<TelegramClient>;
4
+ export declare function saveSession(client: TelegramClient): Promise<void>;
5
+ export declare function disconnectClient(): Promise<void>;
6
+ export declare function getMe(client: TelegramClient): Promise<Api.User>;
7
+ export interface ChatInfo {
8
+ id: string;
9
+ title: string;
10
+ type: 'user' | 'group' | 'supergroup' | 'channel';
11
+ username?: string;
12
+ unreadCount: number;
13
+ lastMessage?: string;
14
+ lastMessageDate?: Date;
15
+ }
16
+ export declare function getDialogs(client: TelegramClient, limit?: number): Promise<ChatInfo[]>;
17
+ export interface MessageInfo {
18
+ id: number;
19
+ date: Date;
20
+ sender: string;
21
+ senderId?: string;
22
+ text: string;
23
+ replyToMsgId?: number;
24
+ isOutgoing: boolean;
25
+ }
26
+ export declare function getMessages(client: TelegramClient, chatIdentifier: string, options?: {
27
+ limit?: number;
28
+ offsetId?: number;
29
+ minDate?: Date;
30
+ maxDate?: Date;
31
+ }): Promise<{
32
+ messages: MessageInfo[];
33
+ chatTitle: string;
34
+ }>;
35
+ export declare function searchMessages(client: TelegramClient, query: string, options?: {
36
+ chat?: string;
37
+ limit?: number;
38
+ }): Promise<{
39
+ messages: MessageInfo[];
40
+ chatTitle?: string;
41
+ }[]>;
42
+ export declare function sendMessage(client: TelegramClient, chatIdentifier: string, text: string, replyToMsgId?: number): Promise<Api.Message>;
43
+ export declare function getContactInfo(client: TelegramClient, identifier: string): Promise<{
44
+ id: string;
45
+ firstName?: string;
46
+ lastName?: string;
47
+ username?: string;
48
+ phone?: string;
49
+ bio?: string;
50
+ isBot: boolean;
51
+ isMutualContact: boolean;
52
+ }>;
53
+ export declare function getChatMembers(client: TelegramClient, chatIdentifier: string, options?: {
54
+ adminsOnly?: boolean;
55
+ limit?: number;
56
+ }): Promise<{
57
+ id: string;
58
+ name: string;
59
+ username?: string;
60
+ isAdmin: boolean;
61
+ }[]>;
62
+ export declare function getAdminGroups(client: TelegramClient): Promise<ChatInfo[]>;
63
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}