@vibecompany/247-cli 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 (74) hide show
  1. package/README.md +110 -0
  2. package/dist/commands/doctor.d.ts +3 -0
  3. package/dist/commands/doctor.d.ts.map +1 -0
  4. package/dist/commands/doctor.js +277 -0
  5. package/dist/commands/doctor.js.map +1 -0
  6. package/dist/commands/hooks.d.ts +3 -0
  7. package/dist/commands/hooks.d.ts.map +1 -0
  8. package/dist/commands/hooks.js +127 -0
  9. package/dist/commands/hooks.js.map +1 -0
  10. package/dist/commands/init.d.ts +3 -0
  11. package/dist/commands/init.d.ts.map +1 -0
  12. package/dist/commands/init.js +116 -0
  13. package/dist/commands/init.js.map +1 -0
  14. package/dist/commands/logs.d.ts +3 -0
  15. package/dist/commands/logs.d.ts.map +1 -0
  16. package/dist/commands/logs.js +38 -0
  17. package/dist/commands/logs.js.map +1 -0
  18. package/dist/commands/service.d.ts +3 -0
  19. package/dist/commands/service.d.ts.map +1 -0
  20. package/dist/commands/service.js +235 -0
  21. package/dist/commands/service.js.map +1 -0
  22. package/dist/commands/start.d.ts +3 -0
  23. package/dist/commands/start.d.ts.map +1 -0
  24. package/dist/commands/start.js +109 -0
  25. package/dist/commands/start.js.map +1 -0
  26. package/dist/commands/status.d.ts +3 -0
  27. package/dist/commands/status.d.ts.map +1 -0
  28. package/dist/commands/status.js +62 -0
  29. package/dist/commands/status.js.map +1 -0
  30. package/dist/commands/stop.d.ts +3 -0
  31. package/dist/commands/stop.d.ts.map +1 -0
  32. package/dist/commands/stop.js +23 -0
  33. package/dist/commands/stop.js.map +1 -0
  34. package/dist/commands/update.d.ts +3 -0
  35. package/dist/commands/update.d.ts.map +1 -0
  36. package/dist/commands/update.js +121 -0
  37. package/dist/commands/update.js.map +1 -0
  38. package/dist/hooks/installer.d.ts +36 -0
  39. package/dist/hooks/installer.d.ts.map +1 -0
  40. package/dist/hooks/installer.js +175 -0
  41. package/dist/hooks/installer.js.map +1 -0
  42. package/dist/index.d.ts +3 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +38 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/lib/config.d.ts +46 -0
  47. package/dist/lib/config.d.ts.map +1 -0
  48. package/dist/lib/config.js +88 -0
  49. package/dist/lib/config.js.map +1 -0
  50. package/dist/lib/paths.d.ts +34 -0
  51. package/dist/lib/paths.d.ts.map +1 -0
  52. package/dist/lib/paths.js +76 -0
  53. package/dist/lib/paths.js.map +1 -0
  54. package/dist/lib/prerequisites.d.ts +36 -0
  55. package/dist/lib/prerequisites.d.ts.map +1 -0
  56. package/dist/lib/prerequisites.js +181 -0
  57. package/dist/lib/prerequisites.js.map +1 -0
  58. package/dist/lib/process.d.ts +39 -0
  59. package/dist/lib/process.d.ts.map +1 -0
  60. package/dist/lib/process.js +188 -0
  61. package/dist/lib/process.js.map +1 -0
  62. package/dist/service/index.d.ts +44 -0
  63. package/dist/service/index.d.ts.map +1 -0
  64. package/dist/service/index.js +18 -0
  65. package/dist/service/index.js.map +1 -0
  66. package/dist/service/launchd.d.ts +18 -0
  67. package/dist/service/launchd.d.ts.map +1 -0
  68. package/dist/service/launchd.js +208 -0
  69. package/dist/service/launchd.js.map +1 -0
  70. package/dist/service/systemd.d.ts +18 -0
  71. package/dist/service/systemd.d.ts.map +1 -0
  72. package/dist/service/systemd.js +196 -0
  73. package/dist/service/systemd.js.map +1 -0
  74. package/package.json +57 -0
package/README.md ADDED
@@ -0,0 +1,110 @@
1
+ # 247
2
+
3
+ **Access Claude Code from anywhere, 24/7.**
4
+
5
+ A CLI tool by [The Vibe Company](https://247.thevibecompany.co) that lets you run Claude Code remotely and access it from any device via a web dashboard.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install -g @vibecompany/247-cli
11
+ ```
12
+
13
+ ### Prerequisites
14
+
15
+ - **Node.js 22+**
16
+ - **tmux** - Required for terminal session persistence
17
+ - macOS: `brew install tmux`
18
+ - Linux: `sudo apt install tmux`
19
+
20
+ ## Quick Start
21
+
22
+ ```bash
23
+ # Configure the agent
24
+ 247 init
25
+
26
+ # Install as a system service (recommended)
27
+ 247 service install --start
28
+
29
+ # Or run in foreground
30
+ 247 start --foreground
31
+ ```
32
+
33
+ ## Commands
34
+
35
+ | Command | Description |
36
+ |---------|-------------|
37
+ | `247 init` | Interactive configuration wizard |
38
+ | `247 start` | Start the agent (daemon mode) |
39
+ | `247 start --foreground` | Start in foreground |
40
+ | `247 stop` | Stop the agent |
41
+ | `247 status` | Show agent status |
42
+ | `247 logs [-f]` | View agent logs |
43
+ | `247 service install` | Install system service |
44
+ | `247 service uninstall` | Remove system service |
45
+ | `247 service start/stop/restart` | Control service |
46
+ | `247 hooks install` | Install Claude Code hooks |
47
+ | `247 update` | Update to latest version |
48
+ | `247 doctor` | Diagnose issues |
49
+
50
+ ## System Service
51
+
52
+ The agent can run as a system service that starts automatically on boot:
53
+
54
+ **macOS (launchd):**
55
+ ```bash
56
+ 247 service install --start
57
+ # Config: ~/Library/LaunchAgents/co.thevibecompany.247.plist
58
+ # Logs: ~/Library/Logs/247-agent/
59
+ ```
60
+
61
+ **Linux (systemd):**
62
+ ```bash
63
+ 247 service install --start
64
+ # Config: ~/.config/systemd/user/247-agent.service
65
+ # Logs: journalctl --user -u 247-agent
66
+ ```
67
+
68
+ ## Configuration
69
+
70
+ Configuration is stored in `~/.247/config.json`:
71
+
72
+ ```json
73
+ {
74
+ "machine": {
75
+ "id": "unique-machine-id",
76
+ "name": "My Mac"
77
+ },
78
+ "agent": {
79
+ "port": 4678
80
+ },
81
+ "projects": {
82
+ "basePath": "~/Dev"
83
+ }
84
+ }
85
+ ```
86
+
87
+ ## Claude Code Hooks
88
+
89
+ The agent includes hooks that notify when Claude Code sessions stop:
90
+
91
+ ```bash
92
+ 247 hooks install # Install hooks
93
+ 247 hooks status # Check status
94
+ 247 hooks update # Update to latest
95
+ ```
96
+
97
+ ## Troubleshooting
98
+
99
+ ```bash
100
+ 247 doctor
101
+ ```
102
+
103
+ ## Links
104
+
105
+ - **Dashboard:** https://247.thevibecompany.co
106
+ - **GitHub:** https://github.com/The-Vibe-Company/247
107
+
108
+ ## License
109
+
110
+ MIT - The Vibe Company
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const doctorCommand: Command;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC,eAAO,MAAM,aAAa,SAqRtB,CAAC"}
@@ -0,0 +1,277 @@
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 @vibecompany/247' : 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 ? 'Installed (update available)' : 'Installed and up to date',
78
+ hint: hooksStatus.needsUpdate ? 'Run "247 hooks update" to update' : undefined,
79
+ });
80
+ }
81
+ else {
82
+ results.push({
83
+ name: 'Claude Code hooks',
84
+ status: 'warn',
85
+ message: 'Not installed',
86
+ hint: 'Run "247 hooks install" to install',
87
+ });
88
+ }
89
+ // 6. Check agent process
90
+ const processStatus = isAgentRunning();
91
+ if (processStatus.running) {
92
+ results.push({
93
+ name: 'Agent process',
94
+ status: 'pass',
95
+ message: `Running (PID: ${processStatus.pid})`,
96
+ });
97
+ // 7. Check agent health (only if running)
98
+ const config = loadConfig();
99
+ if (config) {
100
+ const health = await getAgentHealth(config.agent.port);
101
+ if (health.healthy) {
102
+ results.push({
103
+ name: 'Agent health',
104
+ status: 'pass',
105
+ message: `Healthy (${health.sessions} sessions)`,
106
+ });
107
+ }
108
+ else {
109
+ results.push({
110
+ name: 'Agent health',
111
+ status: 'warn',
112
+ message: `Not responding: ${health.error}`,
113
+ hint: 'Try restarting: 247 restart',
114
+ });
115
+ }
116
+ }
117
+ }
118
+ else {
119
+ results.push({
120
+ name: 'Agent process',
121
+ status: 'warn',
122
+ message: 'Not running',
123
+ hint: 'Start with: 247 start',
124
+ });
125
+ }
126
+ // 8. Check service installation
127
+ try {
128
+ const serviceManager = createServiceManager();
129
+ const serviceStatus = await serviceManager.status();
130
+ if (serviceStatus.installed) {
131
+ if (serviceStatus.running) {
132
+ results.push({
133
+ name: `Service (${serviceManager.platform})`,
134
+ status: 'pass',
135
+ message: `Installed and running${serviceStatus.enabled ? ', enabled at boot' : ''}`,
136
+ });
137
+ }
138
+ else {
139
+ results.push({
140
+ name: `Service (${serviceManager.platform})`,
141
+ status: 'warn',
142
+ message: 'Installed but not running',
143
+ hint: 'Start with: 247 service start',
144
+ });
145
+ }
146
+ }
147
+ else {
148
+ results.push({
149
+ name: `Service (${serviceManager.platform})`,
150
+ status: 'warn',
151
+ message: 'Not installed',
152
+ hint: 'Install with: 247 service install --start',
153
+ });
154
+ }
155
+ }
156
+ catch (err) {
157
+ results.push({
158
+ name: 'Service',
159
+ status: 'fail',
160
+ message: err.message,
161
+ });
162
+ }
163
+ // 9. Check paths and directories
164
+ const paths = getAgentPaths();
165
+ // Config directory
166
+ if (existsSync(paths.configDir)) {
167
+ results.push({
168
+ name: 'Config directory',
169
+ status: 'pass',
170
+ message: paths.configDir,
171
+ });
172
+ }
173
+ else {
174
+ results.push({
175
+ name: 'Config directory',
176
+ status: 'warn',
177
+ message: `Missing: ${paths.configDir}`,
178
+ hint: 'Run "247 init" to create',
179
+ });
180
+ }
181
+ // Log directory
182
+ if (existsSync(paths.logDir)) {
183
+ results.push({
184
+ name: 'Log directory',
185
+ status: 'pass',
186
+ message: paths.logDir,
187
+ });
188
+ }
189
+ else {
190
+ results.push({
191
+ name: 'Log directory',
192
+ status: 'warn',
193
+ message: `Missing: ${paths.logDir}`,
194
+ hint: 'Will be created when agent starts',
195
+ });
196
+ }
197
+ // 10. Check port availability (if agent not running)
198
+ if (!processStatus.running) {
199
+ const config = loadConfig();
200
+ if (config) {
201
+ const net = await import('net');
202
+ const portAvailable = await new Promise((resolve) => {
203
+ const server = net.createServer();
204
+ server.once('error', () => resolve(false));
205
+ server.once('listening', () => {
206
+ server.close();
207
+ resolve(true);
208
+ });
209
+ server.listen(config.agent.port, '127.0.0.1');
210
+ });
211
+ if (portAvailable) {
212
+ results.push({
213
+ name: 'Port availability',
214
+ status: 'pass',
215
+ message: `Port ${config.agent.port} is available`,
216
+ });
217
+ }
218
+ else {
219
+ results.push({
220
+ name: 'Port availability',
221
+ status: 'fail',
222
+ message: `Port ${config.agent.port} is in use`,
223
+ hint: 'Change the port in ~/.247/config.json or stop the conflicting process',
224
+ });
225
+ }
226
+ }
227
+ }
228
+ // Print results
229
+ console.log(chalk.bold('Results:\n'));
230
+ let passCount = 0;
231
+ let warnCount = 0;
232
+ let failCount = 0;
233
+ for (const result of results) {
234
+ let icon;
235
+ let color;
236
+ switch (result.status) {
237
+ case 'pass':
238
+ icon = '✓';
239
+ color = chalk.green;
240
+ passCount++;
241
+ break;
242
+ case 'warn':
243
+ icon = '!';
244
+ color = chalk.yellow;
245
+ warnCount++;
246
+ break;
247
+ case 'fail':
248
+ icon = '✗';
249
+ color = chalk.red;
250
+ failCount++;
251
+ break;
252
+ }
253
+ console.log(`${color(icon)} ${result.name}: ${result.message}`);
254
+ if (result.hint) {
255
+ console.log(chalk.dim(` → ${result.hint}`));
256
+ }
257
+ }
258
+ // Summary
259
+ console.log();
260
+ console.log(chalk.bold('Summary:'));
261
+ console.log(` ${chalk.green(passCount + ' passed')}, ${chalk.yellow(warnCount + ' warnings')}, ${chalk.red(failCount + ' failures')}`);
262
+ if (failCount > 0) {
263
+ console.log();
264
+ console.log(chalk.red('Some checks failed. Please resolve the issues above.'));
265
+ process.exit(1);
266
+ }
267
+ else if (warnCount > 0) {
268
+ console.log();
269
+ console.log(chalk.yellow('Some warnings detected. Consider resolving them for best experience.'));
270
+ }
271
+ else {
272
+ console.log();
273
+ console.log(chalk.green('All checks passed! 247 is ready to use.'));
274
+ }
275
+ console.log();
276
+ });
277
+ //# 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;AAUpC,eAAO,MAAM,WAAW,SAiHpB,CAAC"}
@@ -0,0 +1,116 @@
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 } from '../lib/config.js';
8
+ import { getAgentPaths, 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
+ .action(async (options) => {
17
+ console.log(`
18
+ ╭──────────────────────────────────╮
19
+ │ 247 - The Vibe Company │
20
+ │ Access Claude Code 24/7 │
21
+ ╰──────────────────────────────────╯
22
+ `);
23
+ // Check if config already exists
24
+ if (configExists() && !options.force) {
25
+ const existing = loadConfig();
26
+ console.log(chalk.yellow('Configuration already exists:'));
27
+ console.log(` Machine: ${existing?.machine.name}`);
28
+ console.log(` Port: ${existing?.agent.port}`);
29
+ console.log(` Projects: ${existing?.projects.basePath}`);
30
+ console.log('\nUse --force to overwrite.\n');
31
+ return;
32
+ }
33
+ // Check prerequisites
34
+ const spinner = ora('Checking prerequisites...').start();
35
+ const port = parseInt(options.port, 10);
36
+ const checks = await checkAllPrerequisites(port);
37
+ spinner.stop();
38
+ console.log(chalk.dim('Prerequisites:'));
39
+ for (const check of checks) {
40
+ const icon = check.status === 'ok' ? chalk.green('✓') :
41
+ check.status === 'warn' ? chalk.yellow('!') :
42
+ chalk.red('✗');
43
+ console.log(` ${icon} ${check.name}: ${check.message}`);
44
+ }
45
+ console.log();
46
+ if (!allRequiredMet(checks)) {
47
+ console.log(chalk.red('Please fix the errors above before continuing.\n'));
48
+ process.exit(1);
49
+ }
50
+ // Gather configuration
51
+ let machineName = options.name;
52
+ let projectsPath = options.projects;
53
+ if (!machineName) {
54
+ const response = await enquirer.prompt({
55
+ type: 'input',
56
+ name: 'machineName',
57
+ message: 'Machine name:',
58
+ initial: hostname(),
59
+ });
60
+ machineName = response.machineName;
61
+ }
62
+ if (!options.name) {
63
+ const response = await enquirer.prompt({
64
+ type: 'input',
65
+ name: 'projectsPath',
66
+ message: 'Projects directory:',
67
+ initial: projectsPath,
68
+ });
69
+ projectsPath = response.projectsPath;
70
+ }
71
+ // Create and save configuration
72
+ const configSpinner = ora('Creating configuration...').start();
73
+ try {
74
+ ensureDirectories();
75
+ const config = createConfig({
76
+ machineName,
77
+ port,
78
+ projectsPath,
79
+ });
80
+ saveConfig(config);
81
+ configSpinner.succeed('Configuration saved');
82
+ const paths = getAgentPaths();
83
+ console.log(chalk.dim(` → ${paths.configPath}`));
84
+ }
85
+ catch (err) {
86
+ configSpinner.fail(`Failed to create configuration: ${err.message}`);
87
+ process.exit(1);
88
+ }
89
+ // Install hooks
90
+ const hooksSpinner = ora('Installing Claude Code hooks...').start();
91
+ try {
92
+ const hooksResult = installHooks();
93
+ if (hooksResult.success) {
94
+ if (hooksResult.installed) {
95
+ hooksSpinner.succeed('Hooks installed');
96
+ }
97
+ else {
98
+ hooksSpinner.succeed('Hooks already up to date');
99
+ }
100
+ console.log(chalk.dim(` → ${hooksResult.path}`));
101
+ }
102
+ else {
103
+ hooksSpinner.warn(`Hooks installation skipped: ${hooksResult.error}`);
104
+ }
105
+ }
106
+ catch (err) {
107
+ hooksSpinner.warn(`Hooks installation skipped: ${err.message}`);
108
+ }
109
+ // Success message
110
+ console.log(chalk.green('\n✓ Setup complete!\n'));
111
+ console.log('Next steps:');
112
+ console.log(chalk.cyan(' 247 start ') + chalk.dim('# Start the agent'));
113
+ console.log(chalk.cyan(' 247 service install --start ') + chalk.dim('# Install as system service'));
114
+ console.log();
115
+ });
116
+ //# sourceMappingURL=init.js.map