@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.
- package/README.md +110 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +277 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/hooks.d.ts +3 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +127 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +116 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +38 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/service.d.ts +3 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +235 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/start.d.ts +3 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +109 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +62 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +3 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +23 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +121 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/hooks/installer.d.ts +36 -0
- package/dist/hooks/installer.d.ts.map +1 -0
- package/dist/hooks/installer.js +175 -0
- package/dist/hooks/installer.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +46 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +88 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/paths.d.ts +34 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +76 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/prerequisites.d.ts +36 -0
- package/dist/lib/prerequisites.d.ts.map +1 -0
- package/dist/lib/prerequisites.js +181 -0
- package/dist/lib/prerequisites.js.map +1 -0
- package/dist/lib/process.d.ts +39 -0
- package/dist/lib/process.d.ts.map +1 -0
- package/dist/lib/process.js +188 -0
- package/dist/lib/process.js.map +1 -0
- package/dist/service/index.d.ts +44 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +18 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/launchd.d.ts +18 -0
- package/dist/service/launchd.d.ts.map +1 -0
- package/dist/service/launchd.js +208 -0
- package/dist/service/launchd.js.map +1 -0
- package/dist/service/systemd.d.ts +18 -0
- package/dist/service/systemd.d.ts.map +1 -0
- package/dist/service/systemd.js +196 -0
- package/dist/service/systemd.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|