247-cli 0.3.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 (179) hide show
  1. package/README.md +112 -0
  2. package/agent/dist/config.d.ts +29 -0
  3. package/agent/dist/config.d.ts.map +1 -0
  4. package/agent/dist/config.js +56 -0
  5. package/agent/dist/config.js.map +1 -0
  6. package/agent/dist/db/environments.d.ts +60 -0
  7. package/agent/dist/db/environments.d.ts.map +1 -0
  8. package/agent/dist/db/environments.js +235 -0
  9. package/agent/dist/db/environments.js.map +1 -0
  10. package/agent/dist/db/history.d.ts +37 -0
  11. package/agent/dist/db/history.d.ts.map +1 -0
  12. package/agent/dist/db/history.js +98 -0
  13. package/agent/dist/db/history.js.map +1 -0
  14. package/agent/dist/db/index.d.ts +37 -0
  15. package/agent/dist/db/index.d.ts.map +1 -0
  16. package/agent/dist/db/index.js +225 -0
  17. package/agent/dist/db/index.js.map +1 -0
  18. package/agent/dist/db/schema.d.ts +70 -0
  19. package/agent/dist/db/schema.d.ts.map +1 -0
  20. package/agent/dist/db/schema.js +79 -0
  21. package/agent/dist/db/schema.js.map +1 -0
  22. package/agent/dist/db/sessions.d.ts +75 -0
  23. package/agent/dist/db/sessions.d.ts.map +1 -0
  24. package/agent/dist/db/sessions.js +244 -0
  25. package/agent/dist/db/sessions.js.map +1 -0
  26. package/agent/dist/editor.d.ts +18 -0
  27. package/agent/dist/editor.d.ts.map +1 -0
  28. package/agent/dist/editor.js +222 -0
  29. package/agent/dist/editor.js.map +1 -0
  30. package/agent/dist/environments.d.ts +59 -0
  31. package/agent/dist/environments.d.ts.map +1 -0
  32. package/agent/dist/environments.js +229 -0
  33. package/agent/dist/environments.js.map +1 -0
  34. package/agent/dist/git.d.ts +39 -0
  35. package/agent/dist/git.d.ts.map +1 -0
  36. package/agent/dist/git.js +436 -0
  37. package/agent/dist/git.js.map +1 -0
  38. package/agent/dist/index.d.ts +2 -0
  39. package/agent/dist/index.d.ts.map +1 -0
  40. package/agent/dist/index.js +18 -0
  41. package/agent/dist/index.js.map +1 -0
  42. package/agent/dist/logger.d.ts +15 -0
  43. package/agent/dist/logger.d.ts.map +1 -0
  44. package/agent/dist/logger.js +44 -0
  45. package/agent/dist/logger.js.map +1 -0
  46. package/agent/dist/routes/editor.d.ts +9 -0
  47. package/agent/dist/routes/editor.d.ts.map +1 -0
  48. package/agent/dist/routes/editor.js +63 -0
  49. package/agent/dist/routes/editor.js.map +1 -0
  50. package/agent/dist/routes/environments.d.ts +6 -0
  51. package/agent/dist/routes/environments.d.ts.map +1 -0
  52. package/agent/dist/routes/environments.js +94 -0
  53. package/agent/dist/routes/environments.js.map +1 -0
  54. package/agent/dist/routes/files.d.ts +6 -0
  55. package/agent/dist/routes/files.d.ts.map +1 -0
  56. package/agent/dist/routes/files.js +84 -0
  57. package/agent/dist/routes/files.js.map +1 -0
  58. package/agent/dist/routes/hooks.d.ts +6 -0
  59. package/agent/dist/routes/hooks.d.ts.map +1 -0
  60. package/agent/dist/routes/hooks.js +80 -0
  61. package/agent/dist/routes/hooks.js.map +1 -0
  62. package/agent/dist/routes/index.d.ts +10 -0
  63. package/agent/dist/routes/index.d.ts.map +1 -0
  64. package/agent/dist/routes/index.js +10 -0
  65. package/agent/dist/routes/index.js.map +1 -0
  66. package/agent/dist/routes/projects.d.ts +6 -0
  67. package/agent/dist/routes/projects.d.ts.map +1 -0
  68. package/agent/dist/routes/projects.js +69 -0
  69. package/agent/dist/routes/projects.js.map +1 -0
  70. package/agent/dist/routes/sessions.d.ts +6 -0
  71. package/agent/dist/routes/sessions.d.ts.map +1 -0
  72. package/agent/dist/routes/sessions.js +194 -0
  73. package/agent/dist/routes/sessions.js.map +1 -0
  74. package/agent/dist/server.d.ts +6 -0
  75. package/agent/dist/server.d.ts.map +1 -0
  76. package/agent/dist/server.js +129 -0
  77. package/agent/dist/server.js.map +1 -0
  78. package/agent/dist/status.d.ts +42 -0
  79. package/agent/dist/status.d.ts.map +1 -0
  80. package/agent/dist/status.js +134 -0
  81. package/agent/dist/status.js.map +1 -0
  82. package/agent/dist/terminal.d.ts +15 -0
  83. package/agent/dist/terminal.d.ts.map +1 -0
  84. package/agent/dist/terminal.js +135 -0
  85. package/agent/dist/terminal.js.map +1 -0
  86. package/agent/dist/websocket-handlers.d.ts +13 -0
  87. package/agent/dist/websocket-handlers.d.ts.map +1 -0
  88. package/agent/dist/websocket-handlers.js +266 -0
  89. package/agent/dist/websocket-handlers.js.map +1 -0
  90. package/agent/node_modules/247-shared/dist/index.d.ts +2 -0
  91. package/agent/node_modules/247-shared/dist/index.d.ts.map +1 -0
  92. package/agent/node_modules/247-shared/dist/index.js +2 -0
  93. package/agent/node_modules/247-shared/dist/index.js.map +1 -0
  94. package/agent/node_modules/247-shared/dist/types/index.d.ts +215 -0
  95. package/agent/node_modules/247-shared/dist/types/index.d.ts.map +1 -0
  96. package/agent/node_modules/247-shared/dist/types/index.js +48 -0
  97. package/agent/node_modules/247-shared/dist/types/index.js.map +1 -0
  98. package/agent/node_modules/247-shared/package.json +29 -0
  99. package/dist/commands/doctor.d.ts +3 -0
  100. package/dist/commands/doctor.d.ts.map +1 -0
  101. package/dist/commands/doctor.js +279 -0
  102. package/dist/commands/doctor.js.map +1 -0
  103. package/dist/commands/hooks.d.ts +3 -0
  104. package/dist/commands/hooks.d.ts.map +1 -0
  105. package/dist/commands/hooks.js +127 -0
  106. package/dist/commands/hooks.js.map +1 -0
  107. package/dist/commands/init.d.ts +3 -0
  108. package/dist/commands/init.d.ts.map +1 -0
  109. package/dist/commands/init.js +130 -0
  110. package/dist/commands/init.js.map +1 -0
  111. package/dist/commands/logs.d.ts +3 -0
  112. package/dist/commands/logs.d.ts.map +1 -0
  113. package/dist/commands/logs.js +38 -0
  114. package/dist/commands/logs.js.map +1 -0
  115. package/dist/commands/profile.d.ts +3 -0
  116. package/dist/commands/profile.d.ts.map +1 -0
  117. package/dist/commands/profile.js +156 -0
  118. package/dist/commands/profile.js.map +1 -0
  119. package/dist/commands/service.d.ts +3 -0
  120. package/dist/commands/service.d.ts.map +1 -0
  121. package/dist/commands/service.js +235 -0
  122. package/dist/commands/service.js.map +1 -0
  123. package/dist/commands/start.d.ts +3 -0
  124. package/dist/commands/start.d.ts.map +1 -0
  125. package/dist/commands/start.js +120 -0
  126. package/dist/commands/start.js.map +1 -0
  127. package/dist/commands/status.d.ts +3 -0
  128. package/dist/commands/status.d.ts.map +1 -0
  129. package/dist/commands/status.js +62 -0
  130. package/dist/commands/status.js.map +1 -0
  131. package/dist/commands/stop.d.ts +3 -0
  132. package/dist/commands/stop.d.ts.map +1 -0
  133. package/dist/commands/stop.js +23 -0
  134. package/dist/commands/stop.js.map +1 -0
  135. package/dist/commands/update.d.ts +3 -0
  136. package/dist/commands/update.d.ts.map +1 -0
  137. package/dist/commands/update.js +121 -0
  138. package/dist/commands/update.js.map +1 -0
  139. package/dist/hooks/installer.d.ts +36 -0
  140. package/dist/hooks/installer.d.ts.map +1 -0
  141. package/dist/hooks/installer.js +175 -0
  142. package/dist/hooks/installer.js.map +1 -0
  143. package/dist/index.d.ts +5 -0
  144. package/dist/index.d.ts.map +1 -0
  145. package/dist/index.js +43 -0
  146. package/dist/index.js.map +1 -0
  147. package/dist/lib/config.d.ts +71 -0
  148. package/dist/lib/config.d.ts.map +1 -0
  149. package/dist/lib/config.js +161 -0
  150. package/dist/lib/config.js.map +1 -0
  151. package/dist/lib/paths.d.ts +34 -0
  152. package/dist/lib/paths.d.ts.map +1 -0
  153. package/dist/lib/paths.js +76 -0
  154. package/dist/lib/paths.js.map +1 -0
  155. package/dist/lib/prerequisites.d.ts +36 -0
  156. package/dist/lib/prerequisites.d.ts.map +1 -0
  157. package/dist/lib/prerequisites.js +181 -0
  158. package/dist/lib/prerequisites.js.map +1 -0
  159. package/dist/lib/process.d.ts +40 -0
  160. package/dist/lib/process.d.ts.map +1 -0
  161. package/dist/lib/process.js +192 -0
  162. package/dist/lib/process.js.map +1 -0
  163. package/dist/service/index.d.ts +44 -0
  164. package/dist/service/index.d.ts.map +1 -0
  165. package/dist/service/index.js +18 -0
  166. package/dist/service/index.js.map +1 -0
  167. package/dist/service/launchd.d.ts +18 -0
  168. package/dist/service/launchd.d.ts.map +1 -0
  169. package/dist/service/launchd.js +208 -0
  170. package/dist/service/launchd.js.map +1 -0
  171. package/dist/service/systemd.d.ts +18 -0
  172. package/dist/service/systemd.d.ts.map +1 -0
  173. package/dist/service/systemd.js +196 -0
  174. package/dist/service/systemd.js.map +1 -0
  175. package/hooks/.claude-plugin/plugin.json +5 -0
  176. package/hooks/hooks/hooks.json +66 -0
  177. package/hooks/scripts/check-duplication.sh +91 -0
  178. package/hooks/scripts/notify-status.sh +89 -0
  179. package/package.json +77 -0
@@ -0,0 +1,279 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { existsSync } from 'fs';
4
+ import { checkNode, checkTmux, checkNativeDeps } from '../lib/prerequisites.js';
5
+ import { configExists, loadConfig } from '../lib/config.js';
6
+ import { isAgentRunning, getAgentHealth } from '../lib/process.js';
7
+ import { getHooksStatus } from '../hooks/installer.js';
8
+ import { createServiceManager } from '../service/index.js';
9
+ import { getAgentPaths } from '../lib/paths.js';
10
+ export const doctorCommand = new Command('doctor')
11
+ .description('Diagnose issues with your 247 installation')
12
+ .action(async () => {
13
+ console.log(chalk.bold('\n247 Doctor\n'));
14
+ console.log(chalk.dim('Running diagnostics...\n'));
15
+ const results = [];
16
+ // 1. Check Node.js
17
+ const nodeCheck = checkNode();
18
+ results.push({
19
+ name: 'Node.js',
20
+ status: nodeCheck.status === 'ok' ? 'pass' : nodeCheck.status === 'warn' ? 'warn' : 'fail',
21
+ message: nodeCheck.message,
22
+ hint: nodeCheck.status === 'error' ? 'Install Node.js 22 or later' : undefined,
23
+ });
24
+ // 2. Check tmux
25
+ const tmuxCheck = checkTmux();
26
+ results.push({
27
+ name: 'tmux',
28
+ status: tmuxCheck.status === 'ok' ? 'pass' : tmuxCheck.status === 'warn' ? 'warn' : 'fail',
29
+ message: tmuxCheck.message,
30
+ hint: tmuxCheck.status === 'error'
31
+ ? process.platform === 'darwin'
32
+ ? 'Install with: brew install tmux'
33
+ : 'Install with: sudo apt install tmux'
34
+ : undefined,
35
+ });
36
+ // 3. Check native dependencies
37
+ const nativeCheck = await checkNativeDeps();
38
+ results.push({
39
+ name: 'Native modules',
40
+ status: nativeCheck.status === 'ok' ? 'pass' : nativeCheck.status === 'warn' ? 'warn' : 'fail',
41
+ message: nativeCheck.message,
42
+ hint: nativeCheck.status === 'error' ? 'Try reinstalling: npm install -g 247-cli' : undefined,
43
+ });
44
+ // 4. Check configuration
45
+ if (configExists()) {
46
+ const config = loadConfig();
47
+ if (config) {
48
+ results.push({
49
+ name: 'Configuration',
50
+ status: 'pass',
51
+ message: `Configured for "${config.machine.name}"`,
52
+ });
53
+ }
54
+ else {
55
+ results.push({
56
+ name: 'Configuration',
57
+ status: 'fail',
58
+ message: 'Config file exists but is invalid',
59
+ hint: 'Run "247 init" to reconfigure',
60
+ });
61
+ }
62
+ }
63
+ else {
64
+ results.push({
65
+ name: 'Configuration',
66
+ status: 'fail',
67
+ message: 'Not configured',
68
+ hint: 'Run "247 init" to configure',
69
+ });
70
+ }
71
+ // 5. Check hooks
72
+ const hooksStatus = getHooksStatus();
73
+ if (hooksStatus.installed) {
74
+ results.push({
75
+ name: 'Claude Code hooks',
76
+ status: hooksStatus.needsUpdate ? 'warn' : 'pass',
77
+ message: hooksStatus.needsUpdate
78
+ ? 'Installed (update available)'
79
+ : 'Installed and up to date',
80
+ hint: hooksStatus.needsUpdate ? 'Run "247 hooks update" to update' : undefined,
81
+ });
82
+ }
83
+ else {
84
+ results.push({
85
+ name: 'Claude Code hooks',
86
+ status: 'warn',
87
+ message: 'Not installed',
88
+ hint: 'Run "247 hooks install" to install',
89
+ });
90
+ }
91
+ // 6. Check agent process
92
+ const processStatus = isAgentRunning();
93
+ if (processStatus.running) {
94
+ results.push({
95
+ name: 'Agent process',
96
+ status: 'pass',
97
+ message: `Running (PID: ${processStatus.pid})`,
98
+ });
99
+ // 7. Check agent health (only if running)
100
+ const config = loadConfig();
101
+ if (config) {
102
+ const health = await getAgentHealth(config.agent.port);
103
+ if (health.healthy) {
104
+ results.push({
105
+ name: 'Agent health',
106
+ status: 'pass',
107
+ message: `Healthy (${health.sessions} sessions)`,
108
+ });
109
+ }
110
+ else {
111
+ results.push({
112
+ name: 'Agent health',
113
+ status: 'warn',
114
+ message: `Not responding: ${health.error}`,
115
+ hint: 'Try restarting: 247 restart',
116
+ });
117
+ }
118
+ }
119
+ }
120
+ else {
121
+ results.push({
122
+ name: 'Agent process',
123
+ status: 'warn',
124
+ message: 'Not running',
125
+ hint: 'Start with: 247 start',
126
+ });
127
+ }
128
+ // 8. Check service installation
129
+ try {
130
+ const serviceManager = createServiceManager();
131
+ const serviceStatus = await serviceManager.status();
132
+ if (serviceStatus.installed) {
133
+ if (serviceStatus.running) {
134
+ results.push({
135
+ name: `Service (${serviceManager.platform})`,
136
+ status: 'pass',
137
+ message: `Installed and running${serviceStatus.enabled ? ', enabled at boot' : ''}`,
138
+ });
139
+ }
140
+ else {
141
+ results.push({
142
+ name: `Service (${serviceManager.platform})`,
143
+ status: 'warn',
144
+ message: 'Installed but not running',
145
+ hint: 'Start with: 247 service start',
146
+ });
147
+ }
148
+ }
149
+ else {
150
+ results.push({
151
+ name: `Service (${serviceManager.platform})`,
152
+ status: 'warn',
153
+ message: 'Not installed',
154
+ hint: 'Install with: 247 service install --start',
155
+ });
156
+ }
157
+ }
158
+ catch (err) {
159
+ results.push({
160
+ name: 'Service',
161
+ status: 'fail',
162
+ message: err.message,
163
+ });
164
+ }
165
+ // 9. Check paths and directories
166
+ const paths = getAgentPaths();
167
+ // Config directory
168
+ if (existsSync(paths.configDir)) {
169
+ results.push({
170
+ name: 'Config directory',
171
+ status: 'pass',
172
+ message: paths.configDir,
173
+ });
174
+ }
175
+ else {
176
+ results.push({
177
+ name: 'Config directory',
178
+ status: 'warn',
179
+ message: `Missing: ${paths.configDir}`,
180
+ hint: 'Run "247 init" to create',
181
+ });
182
+ }
183
+ // Log directory
184
+ if (existsSync(paths.logDir)) {
185
+ results.push({
186
+ name: 'Log directory',
187
+ status: 'pass',
188
+ message: paths.logDir,
189
+ });
190
+ }
191
+ else {
192
+ results.push({
193
+ name: 'Log directory',
194
+ status: 'warn',
195
+ message: `Missing: ${paths.logDir}`,
196
+ hint: 'Will be created when agent starts',
197
+ });
198
+ }
199
+ // 10. Check port availability (if agent not running)
200
+ if (!processStatus.running) {
201
+ const config = loadConfig();
202
+ if (config) {
203
+ const net = await import('net');
204
+ const portAvailable = await new Promise((resolve) => {
205
+ const server = net.createServer();
206
+ server.once('error', () => resolve(false));
207
+ server.once('listening', () => {
208
+ server.close();
209
+ resolve(true);
210
+ });
211
+ server.listen(config.agent.port, '127.0.0.1');
212
+ });
213
+ if (portAvailable) {
214
+ results.push({
215
+ name: 'Port availability',
216
+ status: 'pass',
217
+ message: `Port ${config.agent.port} is available`,
218
+ });
219
+ }
220
+ else {
221
+ results.push({
222
+ name: 'Port availability',
223
+ status: 'fail',
224
+ message: `Port ${config.agent.port} is in use`,
225
+ hint: 'Change the port in ~/.247/config.json or stop the conflicting process',
226
+ });
227
+ }
228
+ }
229
+ }
230
+ // Print results
231
+ console.log(chalk.bold('Results:\n'));
232
+ let passCount = 0;
233
+ let warnCount = 0;
234
+ let failCount = 0;
235
+ for (const result of results) {
236
+ let icon;
237
+ let color;
238
+ switch (result.status) {
239
+ case 'pass':
240
+ icon = 'āœ“';
241
+ color = chalk.green;
242
+ passCount++;
243
+ break;
244
+ case 'warn':
245
+ icon = '!';
246
+ color = chalk.yellow;
247
+ warnCount++;
248
+ break;
249
+ case 'fail':
250
+ icon = 'āœ—';
251
+ color = chalk.red;
252
+ failCount++;
253
+ break;
254
+ }
255
+ console.log(`${color(icon)} ${result.name}: ${result.message}`);
256
+ if (result.hint) {
257
+ console.log(chalk.dim(` → ${result.hint}`));
258
+ }
259
+ }
260
+ // Summary
261
+ console.log();
262
+ console.log(chalk.bold('Summary:'));
263
+ console.log(` ${chalk.green(passCount + ' passed')}, ${chalk.yellow(warnCount + ' warnings')}, ${chalk.red(failCount + ' failures')}`);
264
+ if (failCount > 0) {
265
+ console.log();
266
+ console.log(chalk.red('Some checks failed. Please resolve the issues above.'));
267
+ process.exit(1);
268
+ }
269
+ else if (warnCount > 0) {
270
+ console.log();
271
+ console.log(chalk.yellow('Some warnings detected. Consider resolving them for best experience.'));
272
+ }
273
+ else {
274
+ console.log();
275
+ console.log(chalk.green('All checks passed! 247 is ready to use.'));
276
+ }
277
+ console.log();
278
+ });
279
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const hooksCommand: Command;
3
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,YAAY,SACiB,CAAC"}
@@ -0,0 +1,127 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { installHooks, uninstallHooks, getHooksStatus } from '../hooks/installer.js';
5
+ export const hooksCommand = new Command('hooks')
6
+ .description('Manage Claude Code hooks');
7
+ hooksCommand
8
+ .command('install')
9
+ .description('Install Claude Code hooks')
10
+ .option('-f, --force', 'Force reinstallation even if already installed')
11
+ .action(async (options) => {
12
+ const spinner = ora('Installing Claude Code hooks...').start();
13
+ try {
14
+ const status = getHooksStatus();
15
+ if (status.installed && !options.force) {
16
+ spinner.info('Hooks are already installed');
17
+ console.log(chalk.dim(` Path: ${status.path}`));
18
+ console.log(chalk.dim(` Type: ${status.isSymlink ? 'Symlink (dev)' : 'Copy'}`));
19
+ if (status.needsUpdate) {
20
+ console.log(chalk.yellow('\n An update is available. Run with --force to update.'));
21
+ }
22
+ return;
23
+ }
24
+ const result = installHooks();
25
+ if (result.success) {
26
+ spinner.succeed('Hooks installed successfully');
27
+ console.log(chalk.dim(` Path: ${result.path}`));
28
+ }
29
+ else {
30
+ spinner.fail(`Failed to install hooks: ${result.error}`);
31
+ process.exit(1);
32
+ }
33
+ }
34
+ catch (err) {
35
+ spinner.fail(`Error: ${err.message}`);
36
+ process.exit(1);
37
+ }
38
+ });
39
+ hooksCommand
40
+ .command('uninstall')
41
+ .description('Uninstall Claude Code hooks')
42
+ .action(async () => {
43
+ const spinner = ora('Uninstalling Claude Code hooks...').start();
44
+ try {
45
+ const status = getHooksStatus();
46
+ if (!status.installed) {
47
+ spinner.info('Hooks are not installed');
48
+ return;
49
+ }
50
+ const result = uninstallHooks();
51
+ if (result.success) {
52
+ spinner.succeed('Hooks uninstalled successfully');
53
+ }
54
+ else {
55
+ spinner.fail(`Failed to uninstall hooks: ${result.error}`);
56
+ process.exit(1);
57
+ }
58
+ }
59
+ catch (err) {
60
+ spinner.fail(`Error: ${err.message}`);
61
+ process.exit(1);
62
+ }
63
+ });
64
+ hooksCommand
65
+ .command('status')
66
+ .description('Show hooks installation status')
67
+ .action(async () => {
68
+ try {
69
+ const status = getHooksStatus();
70
+ console.log(chalk.bold('\nClaude Code Hooks Status\n'));
71
+ if (!status.installed) {
72
+ console.log(chalk.yellow('ā— Not installed'));
73
+ console.log(chalk.dim('\nRun "247 hooks install" to install the hooks.\n'));
74
+ return;
75
+ }
76
+ console.log(chalk.green('ā— Installed'));
77
+ console.log(` Path: ${status.path}`);
78
+ console.log(` Type: ${status.isSymlink ? 'Symlink (dev mode)' : 'File copy'}`);
79
+ if (status.needsUpdate) {
80
+ console.log(chalk.yellow('\n Update available!'));
81
+ console.log(chalk.dim(' Run "247 hooks install --force" to update.'));
82
+ }
83
+ else {
84
+ console.log(chalk.green(' Up to date'));
85
+ }
86
+ console.log();
87
+ console.log(chalk.dim('The hooks notify the 247 agent when Claude Code sessions stop,'));
88
+ console.log(chalk.dim('enabling automatic status updates in the dashboard.'));
89
+ console.log();
90
+ }
91
+ catch (err) {
92
+ console.error(chalk.red(`Error: ${err.message}`));
93
+ process.exit(1);
94
+ }
95
+ });
96
+ hooksCommand
97
+ .command('update')
98
+ .description('Update hooks if a new version is available')
99
+ .action(async () => {
100
+ const spinner = ora('Checking for updates...').start();
101
+ try {
102
+ const status = getHooksStatus();
103
+ if (!status.installed) {
104
+ spinner.info('Hooks are not installed');
105
+ console.log(chalk.dim('\nRun "247 hooks install" to install them.\n'));
106
+ return;
107
+ }
108
+ if (!status.needsUpdate) {
109
+ spinner.succeed('Hooks are already up to date');
110
+ return;
111
+ }
112
+ spinner.text = 'Updating hooks...';
113
+ const result = installHooks();
114
+ if (result.success) {
115
+ spinner.succeed('Hooks updated successfully');
116
+ }
117
+ else {
118
+ spinner.fail(`Failed to update hooks: ${result.error}`);
119
+ process.exit(1);
120
+ }
121
+ }
122
+ catch (err) {
123
+ spinner.fail(`Error: ${err.message}`);
124
+ process.exit(1);
125
+ }
126
+ });
127
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const initCommand: Command;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,eAAO,MAAM,WAAW,SAsIpB,CAAC"}
@@ -0,0 +1,130 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import enquirer from 'enquirer';
5
+ import { hostname } from 'os';
6
+ import { checkAllPrerequisites, allRequiredMet } from '../lib/prerequisites.js';
7
+ import { createConfig, saveConfig, configExists, loadConfig, getProfilePath, } from '../lib/config.js';
8
+ import { ensureDirectories } from '../lib/paths.js';
9
+ import { installHooks } from '../hooks/installer.js';
10
+ export const initCommand = new Command('init')
11
+ .description('Initialize 247 agent configuration')
12
+ .option('-n, --name <name>', 'Machine name')
13
+ .option('-p, --port <port>', 'Agent port', '4678')
14
+ .option('--projects <path>', 'Projects base path', '~/Dev')
15
+ .option('-f, --force', 'Overwrite existing configuration')
16
+ .option('-P, --profile <name>', 'Create or update a named profile')
17
+ .action(async (options, cmd) => {
18
+ // Get profile from command option or parent (global) option
19
+ const profileName = options.profile || cmd.parent?.opts().profile;
20
+ const profileLabel = profileName ? ` (profile: ${profileName})` : '';
21
+ console.log(`
22
+ ╭──────────────────────────────────╮
23
+ │ 247 - The Vibe Company │
24
+ │ Access Claude Code 24/7 │
25
+ ╰──────────────────────────────────╯
26
+ `);
27
+ // Check if config already exists
28
+ if (configExists(profileName) && !options.force) {
29
+ const existing = loadConfig(profileName);
30
+ console.log(chalk.yellow(`Configuration${profileLabel} already exists:`));
31
+ console.log(` Machine: ${existing?.machine.name}`);
32
+ console.log(` Port: ${existing?.agent.port}`);
33
+ console.log(` Projects: ${existing?.projects.basePath}`);
34
+ console.log('\nUse --force to overwrite.\n');
35
+ return;
36
+ }
37
+ // Check prerequisites
38
+ const spinner = ora('Checking prerequisites...').start();
39
+ const port = parseInt(options.port, 10);
40
+ const checks = await checkAllPrerequisites(port);
41
+ spinner.stop();
42
+ console.log(chalk.dim('Prerequisites:'));
43
+ for (const check of checks) {
44
+ const icon = check.status === 'ok'
45
+ ? chalk.green('āœ“')
46
+ : check.status === 'warn'
47
+ ? chalk.yellow('!')
48
+ : chalk.red('āœ—');
49
+ console.log(` ${icon} ${check.name}: ${check.message}`);
50
+ }
51
+ console.log();
52
+ if (!allRequiredMet(checks)) {
53
+ console.log(chalk.red('Please fix the errors above before continuing.\n'));
54
+ process.exit(1);
55
+ }
56
+ // Gather configuration
57
+ let machineName = options.name;
58
+ let projectsPath = options.projects;
59
+ if (!machineName) {
60
+ const response = await enquirer.prompt({
61
+ type: 'input',
62
+ name: 'machineName',
63
+ message: 'Machine name:',
64
+ initial: hostname(),
65
+ });
66
+ machineName = response.machineName;
67
+ }
68
+ if (!options.name) {
69
+ const response = await enquirer.prompt({
70
+ type: 'input',
71
+ name: 'projectsPath',
72
+ message: 'Projects directory:',
73
+ initial: projectsPath,
74
+ });
75
+ projectsPath = response.projectsPath;
76
+ }
77
+ // Create and save configuration
78
+ const configSpinner = ora(`Creating configuration${profileLabel}...`).start();
79
+ try {
80
+ ensureDirectories();
81
+ const config = createConfig({
82
+ machineName,
83
+ port,
84
+ projectsPath,
85
+ });
86
+ saveConfig(config, profileName);
87
+ configSpinner.succeed(`Configuration${profileLabel} saved`);
88
+ const configPath = getProfilePath(profileName);
89
+ console.log(chalk.dim(` → ${configPath}`));
90
+ }
91
+ catch (err) {
92
+ configSpinner.fail(`Failed to create configuration: ${err.message}`);
93
+ process.exit(1);
94
+ }
95
+ // Install hooks
96
+ const hooksSpinner = ora('Installing Claude Code hooks...').start();
97
+ try {
98
+ const hooksResult = installHooks();
99
+ if (hooksResult.success) {
100
+ if (hooksResult.installed) {
101
+ hooksSpinner.succeed('Hooks installed');
102
+ }
103
+ else {
104
+ hooksSpinner.succeed('Hooks already up to date');
105
+ }
106
+ console.log(chalk.dim(` → ${hooksResult.path}`));
107
+ }
108
+ else {
109
+ hooksSpinner.warn(`Hooks installation skipped: ${hooksResult.error}`);
110
+ }
111
+ }
112
+ catch (err) {
113
+ hooksSpinner.warn(`Hooks installation skipped: ${err.message}`);
114
+ }
115
+ // Success message
116
+ console.log(chalk.green(`\nāœ“ Setup${profileLabel} complete!\n`));
117
+ console.log('Next steps:');
118
+ if (profileName) {
119
+ console.log(chalk.cyan(` 247 start --profile ${profileName}`) +
120
+ chalk.dim(' # Start the agent with this profile'));
121
+ console.log(chalk.cyan(` 247 profile show ${profileName}`) +
122
+ chalk.dim(' # View profile configuration'));
123
+ }
124
+ else {
125
+ console.log(chalk.cyan(' 247 start ') + chalk.dim('# Start the agent'));
126
+ console.log(chalk.cyan(' 247 service install --start ') + chalk.dim('# Install as system service'));
127
+ }
128
+ console.log();
129
+ });
130
+ //# 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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const logsCommand: Command;
3
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,WAAW,SAmCpB,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { spawn } from 'child_process';
4
+ import { join } from 'path';
5
+ import { existsSync } from 'fs';
6
+ import { getAgentPaths } from '../lib/paths.js';
7
+ export const logsCommand = new Command('logs')
8
+ .description('View agent logs')
9
+ .option('-f, --follow', 'Follow log output')
10
+ .option('-n, --lines <number>', 'Number of lines to show', '50')
11
+ .option('-e, --errors', 'Show only error logs')
12
+ .action(async (options) => {
13
+ const paths = getAgentPaths();
14
+ const logFile = options.errors
15
+ ? join(paths.logDir, 'agent.error.log')
16
+ : join(paths.logDir, 'agent.log');
17
+ if (!existsSync(logFile)) {
18
+ console.log(chalk.yellow('No logs found yet.'));
19
+ console.log(chalk.dim(`Expected at: ${logFile}\n`));
20
+ return;
21
+ }
22
+ const args = options.follow
23
+ ? ['-f', '-n', options.lines, logFile]
24
+ : ['-n', options.lines, logFile];
25
+ const tail = spawn('tail', args, {
26
+ stdio: 'inherit',
27
+ });
28
+ tail.on('error', (err) => {
29
+ console.error(chalk.red(`Failed to read logs: ${err.message}`));
30
+ process.exit(1);
31
+ });
32
+ // Handle Ctrl+C gracefully
33
+ process.on('SIGINT', () => {
34
+ tail.kill('SIGTERM');
35
+ process.exit(0);
36
+ });
37
+ });
38
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,iBAAiB,CAAC;KAC9B,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC;KAC3C,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,EAAE,IAAI,CAAC;KAC/D,MAAM,CAAC,cAAc,EAAE,sBAAsB,CAAC;KAC9C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM;QAC5B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,iBAAiB,CAAC;QACvC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEpC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,OAAO,IAAI,CAAC,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM;QACzB,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;QACtC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEnC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE;QAC/B,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACvB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const profileCommand: Command;
3
+ //# sourceMappingURL=profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,cAAc,SA4LxB,CAAC"}