@jsayubi/ccgram 1.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.
Files changed (247) hide show
  1. package/.env.example +19 -0
  2. package/LICENSE +21 -0
  3. package/README.md +338 -0
  4. package/ccgram.service +24 -0
  5. package/config/channels.json +58 -0
  6. package/config/default.json +27 -0
  7. package/config/defaults/config.json +16 -0
  8. package/config/defaults/i18n.json +32 -0
  9. package/config/email-template.json +31 -0
  10. package/config/test-with-subagent.json +16 -0
  11. package/config/user.json +27 -0
  12. package/dist/claude-hook-notify.d.ts +7 -0
  13. package/dist/claude-hook-notify.d.ts.map +1 -0
  14. package/dist/claude-hook-notify.js +154 -0
  15. package/dist/claude-hook-notify.js.map +1 -0
  16. package/dist/claude-remote.d.ts +50 -0
  17. package/dist/claude-remote.d.ts.map +1 -0
  18. package/dist/claude-remote.js +927 -0
  19. package/dist/claude-remote.js.map +1 -0
  20. package/dist/cli.d.ts +3 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +110 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/enhanced-hook-notify.d.ts +16 -0
  25. package/dist/enhanced-hook-notify.d.ts.map +1 -0
  26. package/dist/enhanced-hook-notify.js +288 -0
  27. package/dist/enhanced-hook-notify.js.map +1 -0
  28. package/dist/permission-hook.d.ts +15 -0
  29. package/dist/permission-hook.d.ts.map +1 -0
  30. package/dist/permission-hook.js +357 -0
  31. package/dist/permission-hook.js.map +1 -0
  32. package/dist/prompt-bridge.d.ts +50 -0
  33. package/dist/prompt-bridge.d.ts.map +1 -0
  34. package/dist/prompt-bridge.js +173 -0
  35. package/dist/prompt-bridge.js.map +1 -0
  36. package/dist/question-notify.d.ts +16 -0
  37. package/dist/question-notify.d.ts.map +1 -0
  38. package/dist/question-notify.js +272 -0
  39. package/dist/question-notify.js.map +1 -0
  40. package/dist/setup.d.ts +10 -0
  41. package/dist/setup.d.ts.map +1 -0
  42. package/dist/setup.js +649 -0
  43. package/dist/setup.js.map +1 -0
  44. package/dist/smart-monitor.d.ts +7 -0
  45. package/dist/smart-monitor.d.ts.map +1 -0
  46. package/dist/smart-monitor.js +256 -0
  47. package/dist/smart-monitor.js.map +1 -0
  48. package/dist/src/automation/claude-automation.d.ts +45 -0
  49. package/dist/src/automation/claude-automation.d.ts.map +1 -0
  50. package/dist/src/automation/claude-automation.js +367 -0
  51. package/dist/src/automation/claude-automation.js.map +1 -0
  52. package/dist/src/automation/clipboard-automation.d.ts +35 -0
  53. package/dist/src/automation/clipboard-automation.d.ts.map +1 -0
  54. package/dist/src/automation/clipboard-automation.js +242 -0
  55. package/dist/src/automation/clipboard-automation.js.map +1 -0
  56. package/dist/src/automation/simple-automation.d.ts +56 -0
  57. package/dist/src/automation/simple-automation.d.ts.map +1 -0
  58. package/dist/src/automation/simple-automation.js +283 -0
  59. package/dist/src/automation/simple-automation.js.map +1 -0
  60. package/dist/src/channels/base/channel.d.ts +60 -0
  61. package/dist/src/channels/base/channel.d.ts.map +1 -0
  62. package/dist/src/channels/base/channel.js +96 -0
  63. package/dist/src/channels/base/channel.js.map +1 -0
  64. package/dist/src/channels/email/smtp.d.ts +74 -0
  65. package/dist/src/channels/email/smtp.d.ts.map +1 -0
  66. package/dist/src/channels/email/smtp.js +605 -0
  67. package/dist/src/channels/email/smtp.js.map +1 -0
  68. package/dist/src/channels/line/line.d.ts +36 -0
  69. package/dist/src/channels/line/line.d.ts.map +1 -0
  70. package/dist/src/channels/line/line.js +180 -0
  71. package/dist/src/channels/line/line.js.map +1 -0
  72. package/dist/src/channels/line/webhook.d.ts +55 -0
  73. package/dist/src/channels/line/webhook.d.ts.map +1 -0
  74. package/dist/src/channels/line/webhook.js +191 -0
  75. package/dist/src/channels/line/webhook.js.map +1 -0
  76. package/dist/src/channels/local/desktop.d.ts +30 -0
  77. package/dist/src/channels/local/desktop.d.ts.map +1 -0
  78. package/dist/src/channels/local/desktop.js +161 -0
  79. package/dist/src/channels/local/desktop.js.map +1 -0
  80. package/dist/src/channels/telegram/telegram.d.ts +43 -0
  81. package/dist/src/channels/telegram/telegram.d.ts.map +1 -0
  82. package/dist/src/channels/telegram/telegram.js +223 -0
  83. package/dist/src/channels/telegram/telegram.js.map +1 -0
  84. package/dist/src/channels/telegram/webhook.d.ts +75 -0
  85. package/dist/src/channels/telegram/webhook.d.ts.map +1 -0
  86. package/dist/src/channels/telegram/webhook.js +278 -0
  87. package/dist/src/channels/telegram/webhook.js.map +1 -0
  88. package/dist/src/config-manager.d.ts +16 -0
  89. package/dist/src/config-manager.d.ts.map +1 -0
  90. package/dist/src/config-manager.js +152 -0
  91. package/dist/src/config-manager.js.map +1 -0
  92. package/dist/src/core/config.d.ts +28 -0
  93. package/dist/src/core/config.d.ts.map +1 -0
  94. package/dist/src/core/config.js +248 -0
  95. package/dist/src/core/config.js.map +1 -0
  96. package/dist/src/core/logger.d.ts +19 -0
  97. package/dist/src/core/logger.d.ts.map +1 -0
  98. package/dist/src/core/logger.js +47 -0
  99. package/dist/src/core/logger.js.map +1 -0
  100. package/dist/src/core/notifier.d.ts +45 -0
  101. package/dist/src/core/notifier.d.ts.map +1 -0
  102. package/dist/src/core/notifier.js +189 -0
  103. package/dist/src/core/notifier.js.map +1 -0
  104. package/dist/src/daemon/taskping-daemon.d.ts +38 -0
  105. package/dist/src/daemon/taskping-daemon.d.ts.map +1 -0
  106. package/dist/src/daemon/taskping-daemon.js +306 -0
  107. package/dist/src/daemon/taskping-daemon.js.map +1 -0
  108. package/dist/src/relay/claude-command-bridge.d.ts +57 -0
  109. package/dist/src/relay/claude-command-bridge.d.ts.map +1 -0
  110. package/dist/src/relay/claude-command-bridge.js +188 -0
  111. package/dist/src/relay/claude-command-bridge.js.map +1 -0
  112. package/dist/src/relay/command-relay.d.ts +94 -0
  113. package/dist/src/relay/command-relay.d.ts.map +1 -0
  114. package/dist/src/relay/command-relay.js +463 -0
  115. package/dist/src/relay/command-relay.js.map +1 -0
  116. package/dist/src/relay/email-listener.d.ts +65 -0
  117. package/dist/src/relay/email-listener.d.ts.map +1 -0
  118. package/dist/src/relay/email-listener.js +460 -0
  119. package/dist/src/relay/email-listener.js.map +1 -0
  120. package/dist/src/relay/relay-pty.d.ts +21 -0
  121. package/dist/src/relay/relay-pty.d.ts.map +1 -0
  122. package/dist/src/relay/relay-pty.js +696 -0
  123. package/dist/src/relay/relay-pty.js.map +1 -0
  124. package/dist/src/relay/smart-injector.d.ts +30 -0
  125. package/dist/src/relay/smart-injector.d.ts.map +1 -0
  126. package/dist/src/relay/smart-injector.js +233 -0
  127. package/dist/src/relay/smart-injector.js.map +1 -0
  128. package/dist/src/relay/tmux-injector.d.ts +46 -0
  129. package/dist/src/relay/tmux-injector.d.ts.map +1 -0
  130. package/dist/src/relay/tmux-injector.js +413 -0
  131. package/dist/src/relay/tmux-injector.js.map +1 -0
  132. package/dist/src/tools/config-manager.d.ts +33 -0
  133. package/dist/src/tools/config-manager.d.ts.map +1 -0
  134. package/dist/src/tools/config-manager.js +448 -0
  135. package/dist/src/tools/config-manager.js.map +1 -0
  136. package/dist/src/tools/installer.d.ts +38 -0
  137. package/dist/src/tools/installer.d.ts.map +1 -0
  138. package/dist/src/tools/installer.js +222 -0
  139. package/dist/src/tools/installer.js.map +1 -0
  140. package/dist/src/types/callbacks.d.ts +29 -0
  141. package/dist/src/types/callbacks.d.ts.map +1 -0
  142. package/dist/src/types/callbacks.js +7 -0
  143. package/dist/src/types/callbacks.js.map +1 -0
  144. package/dist/src/types/config.d.ts +56 -0
  145. package/dist/src/types/config.d.ts.map +1 -0
  146. package/dist/src/types/config.js +6 -0
  147. package/dist/src/types/config.js.map +1 -0
  148. package/dist/src/types/hooks.d.ts +47 -0
  149. package/dist/src/types/hooks.d.ts.map +1 -0
  150. package/dist/src/types/hooks.js +6 -0
  151. package/dist/src/types/hooks.js.map +1 -0
  152. package/dist/src/types/index.d.ts +7 -0
  153. package/dist/src/types/index.d.ts.map +1 -0
  154. package/dist/src/types/index.js +23 -0
  155. package/dist/src/types/index.js.map +1 -0
  156. package/dist/src/types/ipc.d.ts +43 -0
  157. package/dist/src/types/ipc.d.ts.map +1 -0
  158. package/dist/src/types/ipc.js +7 -0
  159. package/dist/src/types/ipc.js.map +1 -0
  160. package/dist/src/types/session.d.ts +70 -0
  161. package/dist/src/types/session.d.ts.map +1 -0
  162. package/dist/src/types/session.js +9 -0
  163. package/dist/src/types/session.js.map +1 -0
  164. package/dist/src/types/telegram.d.ts +58 -0
  165. package/dist/src/types/telegram.d.ts.map +1 -0
  166. package/dist/src/types/telegram.js +6 -0
  167. package/dist/src/types/telegram.js.map +1 -0
  168. package/dist/src/utils/active-check.d.ts +19 -0
  169. package/dist/src/utils/active-check.d.ts.map +1 -0
  170. package/dist/src/utils/active-check.js +41 -0
  171. package/dist/src/utils/active-check.js.map +1 -0
  172. package/dist/src/utils/callback-parser.d.ts +21 -0
  173. package/dist/src/utils/callback-parser.d.ts.map +1 -0
  174. package/dist/src/utils/callback-parser.js +58 -0
  175. package/dist/src/utils/callback-parser.js.map +1 -0
  176. package/dist/src/utils/controller-injector.d.ts +21 -0
  177. package/dist/src/utils/controller-injector.d.ts.map +1 -0
  178. package/dist/src/utils/controller-injector.js +108 -0
  179. package/dist/src/utils/controller-injector.js.map +1 -0
  180. package/dist/src/utils/conversation-tracker.d.ts +32 -0
  181. package/dist/src/utils/conversation-tracker.d.ts.map +1 -0
  182. package/dist/src/utils/conversation-tracker.js +119 -0
  183. package/dist/src/utils/conversation-tracker.js.map +1 -0
  184. package/dist/src/utils/http-request.d.ts +25 -0
  185. package/dist/src/utils/http-request.d.ts.map +1 -0
  186. package/dist/src/utils/http-request.js +66 -0
  187. package/dist/src/utils/http-request.js.map +1 -0
  188. package/dist/src/utils/optional-require.d.ts +13 -0
  189. package/dist/src/utils/optional-require.d.ts.map +1 -0
  190. package/dist/src/utils/optional-require.js +37 -0
  191. package/dist/src/utils/optional-require.js.map +1 -0
  192. package/dist/src/utils/paths.d.ts +11 -0
  193. package/dist/src/utils/paths.d.ts.map +1 -0
  194. package/dist/src/utils/paths.js +28 -0
  195. package/dist/src/utils/paths.js.map +1 -0
  196. package/dist/src/utils/pty-session-manager.d.ts +42 -0
  197. package/dist/src/utils/pty-session-manager.d.ts.map +1 -0
  198. package/dist/src/utils/pty-session-manager.js +182 -0
  199. package/dist/src/utils/pty-session-manager.js.map +1 -0
  200. package/dist/src/utils/subagent-tracker.d.ts +64 -0
  201. package/dist/src/utils/subagent-tracker.d.ts.map +1 -0
  202. package/dist/src/utils/subagent-tracker.js +191 -0
  203. package/dist/src/utils/subagent-tracker.js.map +1 -0
  204. package/dist/src/utils/tmux-monitor.d.ts +102 -0
  205. package/dist/src/utils/tmux-monitor.d.ts.map +1 -0
  206. package/dist/src/utils/tmux-monitor.js +642 -0
  207. package/dist/src/utils/tmux-monitor.js.map +1 -0
  208. package/dist/src/utils/trace-capture.d.ts +42 -0
  209. package/dist/src/utils/trace-capture.d.ts.map +1 -0
  210. package/dist/src/utils/trace-capture.js +102 -0
  211. package/dist/src/utils/trace-capture.js.map +1 -0
  212. package/dist/start-all-webhooks.d.ts +7 -0
  213. package/dist/start-all-webhooks.d.ts.map +1 -0
  214. package/dist/start-all-webhooks.js +98 -0
  215. package/dist/start-all-webhooks.js.map +1 -0
  216. package/dist/start-line-webhook.d.ts +7 -0
  217. package/dist/start-line-webhook.d.ts.map +1 -0
  218. package/dist/start-line-webhook.js +59 -0
  219. package/dist/start-line-webhook.js.map +1 -0
  220. package/dist/start-relay-pty.d.ts +7 -0
  221. package/dist/start-relay-pty.d.ts.map +1 -0
  222. package/dist/start-relay-pty.js +173 -0
  223. package/dist/start-relay-pty.js.map +1 -0
  224. package/dist/start-telegram-webhook.d.ts +7 -0
  225. package/dist/start-telegram-webhook.d.ts.map +1 -0
  226. package/dist/start-telegram-webhook.js +80 -0
  227. package/dist/start-telegram-webhook.js.map +1 -0
  228. package/dist/user-prompt-hook.d.ts +13 -0
  229. package/dist/user-prompt-hook.d.ts.map +1 -0
  230. package/dist/user-prompt-hook.js +45 -0
  231. package/dist/user-prompt-hook.js.map +1 -0
  232. package/dist/workspace-router.d.ts +78 -0
  233. package/dist/workspace-router.d.ts.map +1 -0
  234. package/dist/workspace-router.js +408 -0
  235. package/dist/workspace-router.js.map +1 -0
  236. package/dist/workspace-telegram-bot.d.ts +3 -0
  237. package/dist/workspace-telegram-bot.d.ts.map +1 -0
  238. package/dist/workspace-telegram-bot.js +1172 -0
  239. package/dist/workspace-telegram-bot.js.map +1 -0
  240. package/package.json +80 -0
  241. package/src/types/callbacks.ts +39 -0
  242. package/src/types/config.ts +63 -0
  243. package/src/types/hooks.ts +50 -0
  244. package/src/types/index.ts +6 -0
  245. package/src/types/ipc.ts +55 -0
  246. package/src/types/session.ts +72 -0
  247. package/src/types/telegram.ts +66 -0
@@ -0,0 +1,448 @@
1
+ "use strict";
2
+ /**
3
+ * CCGram Configuration Manager
4
+ * Interactive configuration tool for managing settings
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ const readline_1 = __importDefault(require("readline"));
10
+ const logger_1 = __importDefault(require("../core/logger"));
11
+ class ConfigurationManager {
12
+ config;
13
+ logger;
14
+ rl;
15
+ constructor(configManager) {
16
+ this.config = configManager;
17
+ this.logger = new logger_1.default('ConfigManager');
18
+ this.rl = readline_1.default.createInterface({
19
+ input: process.stdin,
20
+ output: process.stdout
21
+ });
22
+ // Enable keypress events
23
+ if (process.stdin.isTTY) {
24
+ process.stdin.setRawMode(true);
25
+ }
26
+ readline_1.default.emitKeypressEvents(process.stdin, this.rl);
27
+ }
28
+ async run(args = []) {
29
+ if (args.includes('--help') || args.includes('-h')) {
30
+ this.showHelp();
31
+ this.rl.close();
32
+ return;
33
+ }
34
+ if (args.includes('--show')) {
35
+ this.displayCurrentConfig();
36
+ this.rl.close();
37
+ return;
38
+ }
39
+ await this.showMainMenu();
40
+ }
41
+ async question(prompt) {
42
+ return new Promise((resolve) => {
43
+ this.rl.question(prompt, resolve);
44
+ });
45
+ }
46
+ displayCurrentConfig() {
47
+ console.log('\nCurrent configuration:');
48
+ console.log('โ”œโ”€ Language:', this.config.get('language'));
49
+ console.log('โ”œโ”€ Enabled status:', this.config.get('enabled') ? 'Enabled' : 'Disabled');
50
+ console.log('โ”œโ”€ Timeout:', this.config.get('timeout') + ' seconds');
51
+ console.log('โ”œโ”€ Completion sound:', this.config.get('sound.completed'));
52
+ console.log('โ””โ”€ Waiting sound:', this.config.get('sound.waiting'));
53
+ console.log();
54
+ }
55
+ async showMainMenu() {
56
+ while (true) {
57
+ console.log('\n=== CCGram Configuration Manager ===');
58
+ this.displayCurrentConfig();
59
+ console.log('Options:');
60
+ console.log('1. Basic Settings');
61
+ console.log('2. Sound Configuration');
62
+ console.log('3. Notification Channels');
63
+ console.log('4. Command Relay');
64
+ console.log('5. Test Notifications');
65
+ console.log('6. Save and Exit');
66
+ console.log('7. Exit (without saving)');
67
+ const choice = await this.question('\nPlease select (1-7): ');
68
+ switch (choice) {
69
+ case '1':
70
+ await this.configureBasicSettings();
71
+ break;
72
+ case '2':
73
+ await this.configureSounds();
74
+ break;
75
+ case '3':
76
+ await this.configureChannels();
77
+ break;
78
+ case '4':
79
+ await this.configureRelay();
80
+ break;
81
+ case '5':
82
+ await this.testNotifications();
83
+ break;
84
+ case '6':
85
+ if (this.config.save()) {
86
+ console.log('โœ… Configuration saved');
87
+ this.rl.close();
88
+ return;
89
+ }
90
+ else {
91
+ console.log('โŒ Save failed');
92
+ }
93
+ break;
94
+ case '7':
95
+ console.log('Exit (changes not saved)');
96
+ this.rl.close();
97
+ return;
98
+ default:
99
+ console.log('โŒ Invalid selection');
100
+ }
101
+ }
102
+ }
103
+ async configureBasicSettings() {
104
+ console.log('\n=== Basic Settings ===');
105
+ console.log('1. Configure Language');
106
+ console.log('2. Toggle Enabled Status');
107
+ console.log('3. Configure Timeout');
108
+ console.log('4. Custom Messages');
109
+ console.log('0. Return to Main Menu');
110
+ const choice = await this.question('\n Please select (0-4): ');
111
+ switch (choice) {
112
+ case '1':
113
+ await this.configureLanguage();
114
+ break;
115
+ case '2':
116
+ await this.toggleEnabled();
117
+ break;
118
+ case '3':
119
+ await this.configureTimeout();
120
+ break;
121
+ case '4':
122
+ await this.configureCustomMessages();
123
+ break;
124
+ case '0':
125
+ return;
126
+ default:
127
+ console.log('โŒ Invalid selection');
128
+ }
129
+ }
130
+ async configureLanguage() {
131
+ const languages = ['zh-CN', 'en', 'ja'];
132
+ console.log('\nAvailable languages:');
133
+ languages.forEach((lang, index) => {
134
+ console.log(`${index + 1}. ${lang}`);
135
+ });
136
+ const choice = await this.question(`Select language (1-${languages.length}): `);
137
+ const index = parseInt(choice) - 1;
138
+ if (index >= 0 && index < languages.length) {
139
+ this.config.set('language', languages[index]);
140
+ console.log(`โœ… Language set to: ${languages[index]}`);
141
+ }
142
+ else {
143
+ console.log('โŒ Invalid selection');
144
+ }
145
+ }
146
+ async toggleEnabled() {
147
+ const current = this.config.get('enabled', true);
148
+ this.config.set('enabled', !current);
149
+ console.log(`โœ… Notifications ${!current ? 'enabled' : 'disabled'}`);
150
+ }
151
+ async configureTimeout() {
152
+ const timeout = await this.question('Set timeout (seconds): ');
153
+ const timeoutNum = parseInt(timeout);
154
+ if (timeoutNum > 0 && timeoutNum <= 30) {
155
+ this.config.set('timeout', timeoutNum);
156
+ console.log(`โœ… Timeout set to: ${timeoutNum} seconds`);
157
+ }
158
+ else {
159
+ console.log('โŒ Invalid timeout (1-30 seconds)');
160
+ }
161
+ }
162
+ async configureSounds() {
163
+ // Load desktop channel to get available sounds
164
+ const DesktopChannel = require('../channels/local/desktop');
165
+ const desktop = new DesktopChannel();
166
+ const soundCategories = desktop.getAvailableSounds();
167
+ console.log('\n=== Sound Configuration ===');
168
+ // Configure completed sound
169
+ console.log('\n--- Configure Task Completion Sound ---');
170
+ const completedSound = await this.selectSoundFromCategories(soundCategories, 'task completion');
171
+ if (completedSound) {
172
+ this.config.set('sound.completed', completedSound);
173
+ console.log(`โœ… Task completion sound set to: ${completedSound}`);
174
+ }
175
+ // Configure waiting sound
176
+ console.log('\n--- Configure Waiting Input Sound ---');
177
+ const waitingSound = await this.selectSoundFromCategories(soundCategories, 'waiting input');
178
+ if (waitingSound) {
179
+ this.config.set('sound.waiting', waitingSound);
180
+ console.log(`โœ… Waiting input sound set to: ${waitingSound}`);
181
+ }
182
+ }
183
+ async selectSoundFromCategories(soundCategories, type) {
184
+ const categories = Object.keys(soundCategories);
185
+ console.log(`\nSelect ${type} sound category:`);
186
+ categories.forEach((category, index) => {
187
+ const count = soundCategories[category].length;
188
+ console.log(`${index + 1}. ${category} (${count} sounds)`);
189
+ });
190
+ console.log('0. Skip');
191
+ const choice = await this.question(`\nPlease select category (0-${categories.length}): `);
192
+ const index = parseInt(choice) - 1;
193
+ if (choice === '0') {
194
+ return null;
195
+ }
196
+ if (index >= 0 && index < categories.length) {
197
+ const category = categories[index];
198
+ const sounds = soundCategories[category];
199
+ return await this.selectSoundFromList(sounds, type);
200
+ }
201
+ else {
202
+ console.log('โŒ Invalid selection');
203
+ return null;
204
+ }
205
+ }
206
+ async selectSoundFromList(sounds, type) {
207
+ console.log(`\nSelect ${type} sound:`);
208
+ sounds.forEach((sound, index) => {
209
+ console.log(`${index + 1}. ${sound}`);
210
+ });
211
+ console.log('0. Return to category selection');
212
+ const choice = await this.question(`\nPlease select (0-${sounds.length}): `);
213
+ const index = parseInt(choice) - 1;
214
+ if (choice === '0') {
215
+ return null;
216
+ }
217
+ if (index >= 0 && index < sounds.length) {
218
+ const selectedSound = sounds[index];
219
+ // Play sound preview
220
+ try {
221
+ const DesktopChannel = require('../channels/local/desktop');
222
+ const desktop = new DesktopChannel();
223
+ desktop._playSound(selectedSound);
224
+ console.log(`Playing sound: ${selectedSound}`);
225
+ }
226
+ catch (error) {
227
+ // Ignore playback errors
228
+ }
229
+ const confirm = await this.question('Confirm using this sound? (y/n): ');
230
+ if (confirm.toLowerCase() === 'y' || confirm.toLowerCase() === 'yes') {
231
+ return selectedSound;
232
+ }
233
+ }
234
+ else {
235
+ console.log('โŒ Invalid selection');
236
+ }
237
+ return null;
238
+ }
239
+ async configureChannels() {
240
+ console.log('\n=== Notification Channel Configuration ===');
241
+ console.log('1. Desktop Notifications (Enabled)');
242
+ console.log('2. Email Notifications');
243
+ console.log('3. Discord Notifications (Coming Soon)');
244
+ console.log('4. Telegram Notifications (Coming Soon)');
245
+ console.log('5. WhatsApp Notifications (Coming Soon)');
246
+ console.log('6. Feishu Notifications (Coming Soon)');
247
+ console.log('0. Return to Main Menu');
248
+ const choice = await this.question('\nPlease select channel to configure (0-6): ');
249
+ switch (choice) {
250
+ case '1':
251
+ console.log('\nDesktop notifications are enabled and working properly!');
252
+ break;
253
+ case '2':
254
+ await this.configureEmailChannel();
255
+ break;
256
+ case '3':
257
+ case '4':
258
+ case '5':
259
+ case '6':
260
+ console.log('\nThis channel will be supported in future versions!');
261
+ break;
262
+ case '0':
263
+ return;
264
+ default:
265
+ console.log('โŒ Invalid selection');
266
+ }
267
+ if (choice !== '0') {
268
+ await this.question('\nPress Enter to continue...');
269
+ }
270
+ }
271
+ async configureRelay() {
272
+ console.log('\n=== Command Relay Configuration ===');
273
+ console.log('(This feature will be implemented in future versions)');
274
+ console.log('Will support sending commands via notification channels and auto-executing in Claude Code');
275
+ await this.question('\nPress Enter to continue...');
276
+ }
277
+ async configureCustomMessages() {
278
+ console.log('\n=== Custom Message Configuration ===');
279
+ console.log('Tip: Use {project} as project name placeholder');
280
+ console.log('Example: [{project}] Task completed!\n');
281
+ // Configure completed message
282
+ const currentCompleted = this.config.get('customMessages.completed') || 'Use default text';
283
+ console.log(`Current task completion text: ${currentCompleted}`);
284
+ const completedMsg = await this.question('New task completion text (Enter to skip): ');
285
+ if (completedMsg.trim()) {
286
+ this.config.set('customMessages.completed', completedMsg.trim());
287
+ console.log('โœ… Updated task completion text');
288
+ }
289
+ // Configure waiting message
290
+ const currentWaiting = this.config.get('customMessages.waiting') || 'Use default text';
291
+ console.log(`\nCurrent waiting input text: ${currentWaiting}`);
292
+ const waitingMsg = await this.question('New waiting input text (Enter to skip): ');
293
+ if (waitingMsg.trim()) {
294
+ this.config.set('customMessages.waiting', waitingMsg.trim());
295
+ console.log('โœ… Updated waiting input text');
296
+ }
297
+ }
298
+ async testNotifications() {
299
+ console.log('\n=== Test Notifications ===');
300
+ try {
301
+ const Notifier = require('../core/notifier');
302
+ const notifier = new Notifier(this.config);
303
+ await notifier.initializeChannels();
304
+ console.log('Sending task completion notification...');
305
+ await notifier.notify('completed', { test: true });
306
+ await new Promise(resolve => setTimeout(resolve, 2000));
307
+ console.log('Sending waiting input notification...');
308
+ await notifier.notify('waiting', { test: true });
309
+ console.log('โœ… Test completed');
310
+ }
311
+ catch (error) {
312
+ console.error('โŒ Test failed:', error.message);
313
+ }
314
+ await this.question('\nPress Enter to continue...');
315
+ }
316
+ async configureEmailChannel() {
317
+ console.log('\n=== Email Notification Configuration ===');
318
+ // Get current email configuration
319
+ const currentEmailConfig = this.config.getChannel('email') || { enabled: false, config: {} };
320
+ const emailConfig = currentEmailConfig.config || {};
321
+ console.log(`Current status: ${currentEmailConfig.enabled ? 'โœ… Enabled' : 'โŒ Disabled'}`);
322
+ console.log('\n๐Ÿ“ง SMTP Sending Configuration:');
323
+ // SMTP host configuration
324
+ const currentHost = emailConfig.smtp?.host || '';
325
+ console.log(`Current SMTP host: ${currentHost || 'Not configured'}`);
326
+ const smtpHost = await this.question('SMTP host (e.g., smtp.gmail.com): ');
327
+ // SMTP port configuration
328
+ const currentPort = emailConfig.smtp?.port || 587;
329
+ console.log(`Current SMTP port: ${currentPort}`);
330
+ const smtpPortInput = await this.question('SMTP port (default 587): ');
331
+ const smtpPort = parseInt(smtpPortInput) || 587;
332
+ // Security connection configuration
333
+ const currentSecure = emailConfig.smtp?.secure || false;
334
+ console.log(`Current secure connection: ${currentSecure ? 'SSL/TLS' : 'STARTTLS'}`);
335
+ const secureInput = await this.question('Use SSL/TLS? (y/n, default n): ');
336
+ const secure = secureInput.toLowerCase() === 'y';
337
+ // Username configuration
338
+ const currentUser = emailConfig.smtp?.auth?.user || '';
339
+ console.log(`Current username: ${currentUser || 'Not configured'}`);
340
+ const smtpUser = await this.question('SMTP username (email address): ');
341
+ // Password configuration
342
+ console.log('SMTP password: [Hidden]');
343
+ const smtpPass = await this.question('SMTP password (app password): ');
344
+ console.log('\n๐Ÿ“ฅ IMAP Receiving Configuration (for receiving replies):');
345
+ // IMAP host configuration
346
+ const currentImapHost = emailConfig.imap?.host || '';
347
+ console.log(`Current IMAP host: ${currentImapHost || 'Not configured'}`);
348
+ const imapHost = await this.question('IMAP host (e.g., imap.gmail.com): ');
349
+ // IMAP port configuration
350
+ const currentImapPort = emailConfig.imap?.port || 993;
351
+ console.log(`Current IMAP port: ${currentImapPort}`);
352
+ const imapPortInput = await this.question('IMAP port (default 993): ');
353
+ const imapPort = parseInt(imapPortInput) || 993;
354
+ // IMAP secure connection
355
+ const currentImapSecure = emailConfig.imap?.secure !== false;
356
+ const imapSecureInput = await this.question('IMAP use SSL? (y/n, default y): ');
357
+ const imapSecure = imapSecureInput.toLowerCase() !== 'n';
358
+ // Recipient configuration
359
+ console.log('\n๐Ÿ“ฌ Recipient Configuration:');
360
+ const currentTo = emailConfig.to || '';
361
+ console.log(`Current recipient: ${currentTo || 'Not configured'}`);
362
+ const toEmail = await this.question('Recipient email: ');
363
+ // Sender configuration
364
+ const currentFrom = emailConfig.from || '';
365
+ console.log(`Current sender: ${currentFrom || 'Not configured'}`);
366
+ const fromEmail = await this.question(`Sender display name (default: CCGram <${smtpUser}>): `);
367
+ // Build email configuration
368
+ const newEmailConfig = {
369
+ enabled: true,
370
+ config: {
371
+ smtp: {
372
+ host: smtpHost || currentHost,
373
+ port: smtpPort,
374
+ secure: secure,
375
+ auth: {
376
+ user: smtpUser || currentUser,
377
+ pass: smtpPass || emailConfig.smtp?.auth?.pass || ''
378
+ }
379
+ },
380
+ imap: {
381
+ host: imapHost || currentImapHost,
382
+ port: imapPort,
383
+ secure: imapSecure,
384
+ auth: {
385
+ user: smtpUser || currentUser,
386
+ pass: smtpPass || emailConfig.imap?.auth?.pass || ''
387
+ }
388
+ },
389
+ from: fromEmail || `CCGram <${smtpUser || currentUser}>`,
390
+ to: toEmail || currentTo
391
+ }
392
+ };
393
+ // Save configuration
394
+ this.config.setChannel('email', newEmailConfig);
395
+ console.log('\nโœ… Email configuration saved');
396
+ // Ask whether to test
397
+ const testChoice = await this.question('\nTest email sending? (y/n): ');
398
+ if (testChoice.toLowerCase() === 'y') {
399
+ await this.testEmailChannel();
400
+ }
401
+ }
402
+ async testEmailChannel() {
403
+ console.log('\n๐Ÿงช Testing email sending...');
404
+ try {
405
+ const EmailChannel = require('../channels/email/smtp');
406
+ const emailConfig = this.config.getChannel('email');
407
+ if (!emailConfig || !emailConfig.enabled) {
408
+ console.log('โŒ Email channel not enabled');
409
+ return;
410
+ }
411
+ const emailChannel = new EmailChannel(emailConfig.config);
412
+ const testResult = await emailChannel.test();
413
+ if (testResult) {
414
+ console.log('โœ… Email sending test successful!');
415
+ console.log('๐Ÿ“ง Please check your inbox, you should receive a test email');
416
+ console.log('๐Ÿ’ก You can try replying to that email to test the command relay feature');
417
+ }
418
+ else {
419
+ console.log('โŒ Email sending test failed');
420
+ console.log('Please check if your SMTP configuration is correct');
421
+ }
422
+ }
423
+ catch (error) {
424
+ console.log('โŒ Email test failed:', error.message);
425
+ console.log('Please check your network connection and email configuration');
426
+ }
427
+ }
428
+ showHelp() {
429
+ console.log(`
430
+ CCGram Configuration Manager
431
+
432
+ Usage: claude-remote config [options]
433
+
434
+ Options:
435
+ --show Show current configuration
436
+ --help Show help information
437
+
438
+ Interactive Commands:
439
+ 1. Basic Settings - Language, enabled status, timeout, etc.
440
+ 2. Sound Configuration - Configure task completion and waiting input sounds
441
+ 3. Notification Channels - Configure email, Discord, Telegram and other notification channels
442
+ 4. Command Relay - Configure remote command execution features
443
+ 5. Test Notifications - Test all configured notification channels
444
+ `);
445
+ }
446
+ }
447
+ module.exports = ConfigurationManager;
448
+ //# sourceMappingURL=config-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/tools/config-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * CCGram Installer
3
+ * Handles installation and configuration of Claude Code hooks
4
+ */
5
+ import readline from 'readline';
6
+ import Logger from '../core/logger';
7
+ import ConfigManager from '../core/config';
8
+ interface HooksConfig {
9
+ hooks: {
10
+ [hookName: string]: Array<{
11
+ matcher: string;
12
+ hooks: Array<{
13
+ type: string;
14
+ command: string;
15
+ timeout: number;
16
+ }>;
17
+ }>;
18
+ };
19
+ }
20
+ declare class Installer {
21
+ config: ConfigManager;
22
+ logger: Logger;
23
+ projectDir: string;
24
+ claudeConfigDir: string;
25
+ rl: readline.Interface;
26
+ constructor(configManager: ConfigManager);
27
+ getClaudeConfigDir(): string;
28
+ question(prompt: string): Promise<string>;
29
+ run(args?: string[]): Promise<void>;
30
+ checkDependencies(): boolean;
31
+ createHooksConfig(): HooksConfig;
32
+ installHooks(): Promise<boolean>;
33
+ initializeConfig(): Promise<void>;
34
+ testInstallation(): Promise<boolean>;
35
+ displayUsage(): void;
36
+ }
37
+ export = Installer;
38
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../../src/tools/installer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,MAAM,MAAM,gBAAgB,CAAC;AACpC,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAE3C,UAAU,WAAW;IACjB,KAAK,EAAE;QACH,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,EAAE,KAAK,CAAC;gBACT,IAAI,EAAE,MAAM,CAAC;gBACb,OAAO,EAAE,MAAM,CAAC;gBAChB,OAAO,EAAE,MAAM,CAAC;aACnB,CAAC,CAAC;SACN,CAAC,CAAC;KACN,CAAC;CACL;AAED,cAAM,SAAS;IACX,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC;gBAEX,aAAa,EAAE,aAAa;IAYxC,kBAAkB,IAAI,MAAM;IAqBtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMzC,GAAG,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAuC7C,iBAAiB,IAAI,OAAO;IA+B5B,iBAAiB,IAAI,WAAW;IAiC1B,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IA2ChC,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjC,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAwB1C,YAAY,IAAI,IAAI;CAcvB;AAED,SAAS,SAAS,CAAC"}