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.
- package/README.md +112 -0
- package/agent/dist/config.d.ts +29 -0
- package/agent/dist/config.d.ts.map +1 -0
- package/agent/dist/config.js +56 -0
- package/agent/dist/config.js.map +1 -0
- package/agent/dist/db/environments.d.ts +60 -0
- package/agent/dist/db/environments.d.ts.map +1 -0
- package/agent/dist/db/environments.js +235 -0
- package/agent/dist/db/environments.js.map +1 -0
- package/agent/dist/db/history.d.ts +37 -0
- package/agent/dist/db/history.d.ts.map +1 -0
- package/agent/dist/db/history.js +98 -0
- package/agent/dist/db/history.js.map +1 -0
- package/agent/dist/db/index.d.ts +37 -0
- package/agent/dist/db/index.d.ts.map +1 -0
- package/agent/dist/db/index.js +225 -0
- package/agent/dist/db/index.js.map +1 -0
- package/agent/dist/db/schema.d.ts +70 -0
- package/agent/dist/db/schema.d.ts.map +1 -0
- package/agent/dist/db/schema.js +79 -0
- package/agent/dist/db/schema.js.map +1 -0
- package/agent/dist/db/sessions.d.ts +75 -0
- package/agent/dist/db/sessions.d.ts.map +1 -0
- package/agent/dist/db/sessions.js +244 -0
- package/agent/dist/db/sessions.js.map +1 -0
- package/agent/dist/editor.d.ts +18 -0
- package/agent/dist/editor.d.ts.map +1 -0
- package/agent/dist/editor.js +222 -0
- package/agent/dist/editor.js.map +1 -0
- package/agent/dist/environments.d.ts +59 -0
- package/agent/dist/environments.d.ts.map +1 -0
- package/agent/dist/environments.js +229 -0
- package/agent/dist/environments.js.map +1 -0
- package/agent/dist/git.d.ts +39 -0
- package/agent/dist/git.d.ts.map +1 -0
- package/agent/dist/git.js +436 -0
- package/agent/dist/git.js.map +1 -0
- package/agent/dist/index.d.ts +2 -0
- package/agent/dist/index.d.ts.map +1 -0
- package/agent/dist/index.js +18 -0
- package/agent/dist/index.js.map +1 -0
- package/agent/dist/logger.d.ts +15 -0
- package/agent/dist/logger.d.ts.map +1 -0
- package/agent/dist/logger.js +44 -0
- package/agent/dist/logger.js.map +1 -0
- package/agent/dist/routes/editor.d.ts +9 -0
- package/agent/dist/routes/editor.d.ts.map +1 -0
- package/agent/dist/routes/editor.js +63 -0
- package/agent/dist/routes/editor.js.map +1 -0
- package/agent/dist/routes/environments.d.ts +6 -0
- package/agent/dist/routes/environments.d.ts.map +1 -0
- package/agent/dist/routes/environments.js +94 -0
- package/agent/dist/routes/environments.js.map +1 -0
- package/agent/dist/routes/files.d.ts +6 -0
- package/agent/dist/routes/files.d.ts.map +1 -0
- package/agent/dist/routes/files.js +84 -0
- package/agent/dist/routes/files.js.map +1 -0
- package/agent/dist/routes/hooks.d.ts +6 -0
- package/agent/dist/routes/hooks.d.ts.map +1 -0
- package/agent/dist/routes/hooks.js +80 -0
- package/agent/dist/routes/hooks.js.map +1 -0
- package/agent/dist/routes/index.d.ts +10 -0
- package/agent/dist/routes/index.d.ts.map +1 -0
- package/agent/dist/routes/index.js +10 -0
- package/agent/dist/routes/index.js.map +1 -0
- package/agent/dist/routes/projects.d.ts +6 -0
- package/agent/dist/routes/projects.d.ts.map +1 -0
- package/agent/dist/routes/projects.js +69 -0
- package/agent/dist/routes/projects.js.map +1 -0
- package/agent/dist/routes/sessions.d.ts +6 -0
- package/agent/dist/routes/sessions.d.ts.map +1 -0
- package/agent/dist/routes/sessions.js +194 -0
- package/agent/dist/routes/sessions.js.map +1 -0
- package/agent/dist/server.d.ts +6 -0
- package/agent/dist/server.d.ts.map +1 -0
- package/agent/dist/server.js +129 -0
- package/agent/dist/server.js.map +1 -0
- package/agent/dist/status.d.ts +42 -0
- package/agent/dist/status.d.ts.map +1 -0
- package/agent/dist/status.js +134 -0
- package/agent/dist/status.js.map +1 -0
- package/agent/dist/terminal.d.ts +15 -0
- package/agent/dist/terminal.d.ts.map +1 -0
- package/agent/dist/terminal.js +135 -0
- package/agent/dist/terminal.js.map +1 -0
- package/agent/dist/websocket-handlers.d.ts +13 -0
- package/agent/dist/websocket-handlers.d.ts.map +1 -0
- package/agent/dist/websocket-handlers.js +266 -0
- package/agent/dist/websocket-handlers.js.map +1 -0
- package/agent/node_modules/247-shared/dist/index.d.ts +2 -0
- package/agent/node_modules/247-shared/dist/index.d.ts.map +1 -0
- package/agent/node_modules/247-shared/dist/index.js +2 -0
- package/agent/node_modules/247-shared/dist/index.js.map +1 -0
- package/agent/node_modules/247-shared/dist/types/index.d.ts +215 -0
- package/agent/node_modules/247-shared/dist/types/index.d.ts.map +1 -0
- package/agent/node_modules/247-shared/dist/types/index.js +48 -0
- package/agent/node_modules/247-shared/dist/types/index.js.map +1 -0
- package/agent/node_modules/247-shared/package.json +29 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +279 -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 +130 -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/profile.d.ts +3 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +156 -0
- package/dist/commands/profile.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 +120 -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 +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +71 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +161 -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 +40 -0
- package/dist/lib/process.d.ts.map +1 -0
- package/dist/lib/process.js +192 -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/hooks/.claude-plugin/plugin.json +5 -0
- package/hooks/hooks/hooks.json +66 -0
- package/hooks/scripts/check-duplication.sh +91 -0
- package/hooks/scripts/notify-status.sh +89 -0
- package/package.json +77 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { stopAgent, isAgentRunning } from '../lib/process.js';
|
|
5
|
+
export const stopCommand = new Command('stop')
|
|
6
|
+
.description('Stop the 247 agent')
|
|
7
|
+
.action(async () => {
|
|
8
|
+
const status = isAgentRunning();
|
|
9
|
+
if (!status.running) {
|
|
10
|
+
console.log(chalk.yellow('Agent is not running.\n'));
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const spinner = ora(`Stopping agent (PID: ${status.pid})...`).start();
|
|
14
|
+
const result = stopAgent();
|
|
15
|
+
if (result.success) {
|
|
16
|
+
spinner.succeed('Agent stopped');
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
spinner.fail(`Failed to stop: ${result.error}`);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE9D,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,oBAAoB,CAAC;KACjC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAEhC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,wBAAwB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAEtE,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,aAAa,SAkHtB,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { exec } from 'child_process';
|
|
5
|
+
import { promisify } from 'util';
|
|
6
|
+
import { createServiceManager } from '../service/index.js';
|
|
7
|
+
import { isAgentRunning, stopAgent } from '../lib/process.js';
|
|
8
|
+
import { installHooks } from '../hooks/installer.js';
|
|
9
|
+
const execAsync = promisify(exec);
|
|
10
|
+
const PACKAGE_NAME = '247-cli';
|
|
11
|
+
export const updateCommand = new Command('update')
|
|
12
|
+
.description('Update 247 to the latest version')
|
|
13
|
+
.option('--check', 'Only check for updates without installing')
|
|
14
|
+
.action(async (options) => {
|
|
15
|
+
console.log(chalk.bold('\n247 Update\n'));
|
|
16
|
+
const checkSpinner = ora('Checking for updates...').start();
|
|
17
|
+
try {
|
|
18
|
+
// Get current version
|
|
19
|
+
const pkg = await import('../../package.json', {
|
|
20
|
+
with: { type: 'json' },
|
|
21
|
+
});
|
|
22
|
+
const currentVersion = pkg.default.version;
|
|
23
|
+
// Check npm for latest version
|
|
24
|
+
let latestVersion;
|
|
25
|
+
try {
|
|
26
|
+
const { stdout } = await execAsync(`npm view ${PACKAGE_NAME} version 2>/dev/null`);
|
|
27
|
+
latestVersion = stdout.trim();
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
checkSpinner.fail('Failed to check for updates. Are you connected to the internet?');
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
if (currentVersion === latestVersion) {
|
|
34
|
+
checkSpinner.succeed(`Already on the latest version (${currentVersion})`);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
checkSpinner.succeed(`Update available: ${currentVersion} → ${latestVersion}`);
|
|
38
|
+
if (options.check) {
|
|
39
|
+
console.log(chalk.dim('\nRun "247 update" to install the update.\n'));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
console.log();
|
|
43
|
+
// Check if service is running
|
|
44
|
+
const serviceManager = createServiceManager();
|
|
45
|
+
let serviceWasRunning = false;
|
|
46
|
+
try {
|
|
47
|
+
const serviceStatus = await serviceManager.status();
|
|
48
|
+
serviceWasRunning = serviceStatus.running;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Service not installed, check daemon
|
|
52
|
+
const daemonStatus = isAgentRunning();
|
|
53
|
+
serviceWasRunning = daemonStatus.running;
|
|
54
|
+
}
|
|
55
|
+
// Stop agent if running
|
|
56
|
+
if (serviceWasRunning) {
|
|
57
|
+
const stopSpinner = ora('Stopping agent...').start();
|
|
58
|
+
try {
|
|
59
|
+
const serviceStatus = await serviceManager.status();
|
|
60
|
+
if (serviceStatus.installed && serviceStatus.running) {
|
|
61
|
+
await serviceManager.stop();
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
await stopAgent();
|
|
65
|
+
}
|
|
66
|
+
stopSpinner.succeed('Agent stopped');
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
stopSpinner.warn(`Could not stop agent: ${err.message}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Update via npm
|
|
73
|
+
const updateSpinner = ora('Updating via npm...').start();
|
|
74
|
+
try {
|
|
75
|
+
await execAsync(`npm install -g ${PACKAGE_NAME}@latest`);
|
|
76
|
+
updateSpinner.succeed('Package updated');
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
updateSpinner.fail(`Failed to update: ${err.message}`);
|
|
80
|
+
console.log(chalk.dim('\nTry running manually: npm install -g 247-cli@latest\n'));
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
// Update hooks
|
|
84
|
+
const hooksSpinner = ora('Updating hooks...').start();
|
|
85
|
+
const hooksResult = installHooks();
|
|
86
|
+
if (hooksResult.success) {
|
|
87
|
+
hooksSpinner.succeed('Hooks updated');
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
hooksSpinner.warn(`Could not update hooks: ${hooksResult.error}`);
|
|
91
|
+
}
|
|
92
|
+
// Restart agent if it was running
|
|
93
|
+
if (serviceWasRunning) {
|
|
94
|
+
const startSpinner = ora('Restarting agent...').start();
|
|
95
|
+
try {
|
|
96
|
+
const serviceStatus = await serviceManager.status();
|
|
97
|
+
if (serviceStatus.installed) {
|
|
98
|
+
await serviceManager.start();
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// Will use the daemon mode - but after update the binary changed
|
|
102
|
+
// so we should tell user to restart manually
|
|
103
|
+
startSpinner.info('Please restart the agent manually: 247 start');
|
|
104
|
+
}
|
|
105
|
+
startSpinner.succeed('Agent restarted');
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
startSpinner.warn(`Could not restart agent: ${err.message}`);
|
|
109
|
+
console.log(chalk.dim('Run "247 start" to start the agent manually.'));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
console.log();
|
|
113
|
+
console.log(chalk.green('✓ Update complete!'));
|
|
114
|
+
console.log();
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
checkSpinner.fail(`Error: ${err.message}`);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface HooksInstallResult {
|
|
2
|
+
success: boolean;
|
|
3
|
+
installed: boolean;
|
|
4
|
+
updated: boolean;
|
|
5
|
+
path: string;
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface HooksStatus {
|
|
9
|
+
installed: boolean;
|
|
10
|
+
path: string;
|
|
11
|
+
isSymlink: boolean;
|
|
12
|
+
sourceVersion?: string;
|
|
13
|
+
installedVersion?: string;
|
|
14
|
+
needsUpdate: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get hooks installation status
|
|
18
|
+
*/
|
|
19
|
+
export declare function getHooksStatus(): HooksStatus;
|
|
20
|
+
/**
|
|
21
|
+
* Install hooks to ~/.claude-plugins/247-hooks/
|
|
22
|
+
* In dev mode: creates a symlink
|
|
23
|
+
* In prod mode: copies files
|
|
24
|
+
*/
|
|
25
|
+
export declare function installHooks(options?: {
|
|
26
|
+
force?: boolean;
|
|
27
|
+
useSymlink?: boolean;
|
|
28
|
+
}): HooksInstallResult;
|
|
29
|
+
/**
|
|
30
|
+
* Uninstall hooks from ~/.claude-plugins/
|
|
31
|
+
*/
|
|
32
|
+
export declare function uninstallHooks(): {
|
|
33
|
+
success: boolean;
|
|
34
|
+
error?: string;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/hooks/installer.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAgD5C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,kBAAkB,CAiFxG;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAmBrE"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, copyFileSync, symlinkSync, unlinkSync, readFileSync, readdirSync, lstatSync, rmSync } from 'fs';
|
|
2
|
+
import { join, dirname } from 'path';
|
|
3
|
+
import { getAgentPaths } from '../lib/paths.js';
|
|
4
|
+
/**
|
|
5
|
+
* Get hooks installation status
|
|
6
|
+
*/
|
|
7
|
+
export function getHooksStatus() {
|
|
8
|
+
const paths = getAgentPaths();
|
|
9
|
+
const dest = paths.hooksDestination;
|
|
10
|
+
const pluginJsonPath = join(dest, '.claude-plugin', 'plugin.json');
|
|
11
|
+
const installed = existsSync(pluginJsonPath);
|
|
12
|
+
let isSymlink = false;
|
|
13
|
+
if (installed) {
|
|
14
|
+
try {
|
|
15
|
+
isSymlink = lstatSync(dest).isSymbolicLink();
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// Not a symlink
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
let sourceVersion;
|
|
22
|
+
let installedVersion;
|
|
23
|
+
// Read source version
|
|
24
|
+
const sourcePluginJson = join(paths.hooksSource, '.claude-plugin', 'plugin.json');
|
|
25
|
+
if (existsSync(sourcePluginJson)) {
|
|
26
|
+
try {
|
|
27
|
+
const data = JSON.parse(readFileSync(sourcePluginJson, 'utf-8'));
|
|
28
|
+
sourceVersion = data.version;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Ignore parse errors
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Read installed version
|
|
35
|
+
if (installed) {
|
|
36
|
+
try {
|
|
37
|
+
const data = JSON.parse(readFileSync(pluginJsonPath, 'utf-8'));
|
|
38
|
+
installedVersion = data.version;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Ignore parse errors
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
installed,
|
|
46
|
+
path: dest,
|
|
47
|
+
isSymlink,
|
|
48
|
+
sourceVersion,
|
|
49
|
+
installedVersion,
|
|
50
|
+
needsUpdate: installed && sourceVersion !== installedVersion,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Install hooks to ~/.claude-plugins/247-hooks/
|
|
55
|
+
* In dev mode: creates a symlink
|
|
56
|
+
* In prod mode: copies files
|
|
57
|
+
*/
|
|
58
|
+
export function installHooks(options = {}) {
|
|
59
|
+
const paths = getAgentPaths();
|
|
60
|
+
const source = paths.hooksSource;
|
|
61
|
+
const dest = paths.hooksDestination;
|
|
62
|
+
// Verify source exists
|
|
63
|
+
if (!existsSync(source)) {
|
|
64
|
+
return {
|
|
65
|
+
success: false,
|
|
66
|
+
installed: false,
|
|
67
|
+
updated: false,
|
|
68
|
+
path: dest,
|
|
69
|
+
error: `Hooks source not found at ${source}`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// Create parent directory if needed
|
|
73
|
+
const parentDir = dirname(dest);
|
|
74
|
+
if (!existsSync(parentDir)) {
|
|
75
|
+
mkdirSync(parentDir, { recursive: true });
|
|
76
|
+
}
|
|
77
|
+
const status = getHooksStatus();
|
|
78
|
+
const alreadyInstalled = status.installed;
|
|
79
|
+
// Skip if already up to date (unless force)
|
|
80
|
+
if (alreadyInstalled && !options.force && !status.needsUpdate) {
|
|
81
|
+
return {
|
|
82
|
+
success: true,
|
|
83
|
+
installed: false,
|
|
84
|
+
updated: false,
|
|
85
|
+
path: dest,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// Remove existing if updating or force
|
|
89
|
+
if (existsSync(dest)) {
|
|
90
|
+
try {
|
|
91
|
+
if (status.isSymlink) {
|
|
92
|
+
unlinkSync(dest);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
rmSync(dest, { recursive: true, force: true });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
return {
|
|
100
|
+
success: false,
|
|
101
|
+
installed: false,
|
|
102
|
+
updated: false,
|
|
103
|
+
path: dest,
|
|
104
|
+
error: `Failed to remove existing: ${err.message}`,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Determine install method
|
|
109
|
+
const useSymlink = options.useSymlink ?? paths.isDev;
|
|
110
|
+
try {
|
|
111
|
+
if (useSymlink) {
|
|
112
|
+
// Symlink for dev - changes to hooks are immediately reflected
|
|
113
|
+
symlinkSync(source, dest, 'dir');
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// Copy for prod - stable installation
|
|
117
|
+
copyDirectoryRecursive(source, dest);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
return {
|
|
122
|
+
success: false,
|
|
123
|
+
installed: false,
|
|
124
|
+
updated: false,
|
|
125
|
+
path: dest,
|
|
126
|
+
error: `Failed to install: ${err.message}`,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
success: true,
|
|
131
|
+
installed: !alreadyInstalled,
|
|
132
|
+
updated: alreadyInstalled,
|
|
133
|
+
path: dest,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Uninstall hooks from ~/.claude-plugins/
|
|
138
|
+
*/
|
|
139
|
+
export function uninstallHooks() {
|
|
140
|
+
const paths = getAgentPaths();
|
|
141
|
+
const dest = paths.hooksDestination;
|
|
142
|
+
if (!existsSync(dest)) {
|
|
143
|
+
return { success: true }; // Already uninstalled
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
const status = getHooksStatus();
|
|
147
|
+
if (status.isSymlink) {
|
|
148
|
+
unlinkSync(dest);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
rmSync(dest, { recursive: true, force: true });
|
|
152
|
+
}
|
|
153
|
+
return { success: true };
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
return { success: false, error: err.message };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Recursively copy a directory
|
|
161
|
+
*/
|
|
162
|
+
function copyDirectoryRecursive(source, dest) {
|
|
163
|
+
mkdirSync(dest, { recursive: true });
|
|
164
|
+
for (const entry of readdirSync(source, { withFileTypes: true })) {
|
|
165
|
+
const srcPath = join(source, entry.name);
|
|
166
|
+
const destPath = join(dest, entry.name);
|
|
167
|
+
if (entry.isDirectory()) {
|
|
168
|
+
copyDirectoryRecursive(srcPath, destPath);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
copyFileSync(srcPath, destPath);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/hooks/installer.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AAqB9B,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { initCommand } from './commands/init.js';
|
|
4
|
+
import { startCommand } from './commands/start.js';
|
|
5
|
+
import { stopCommand } from './commands/stop.js';
|
|
6
|
+
import { statusCommand } from './commands/status.js';
|
|
7
|
+
import { logsCommand } from './commands/logs.js';
|
|
8
|
+
import { serviceCommand } from './commands/service.js';
|
|
9
|
+
import { hooksCommand } from './commands/hooks.js';
|
|
10
|
+
import { updateCommand } from './commands/update.js';
|
|
11
|
+
import { doctorCommand } from './commands/doctor.js';
|
|
12
|
+
import { profileCommand } from './commands/profile.js';
|
|
13
|
+
const program = new Command();
|
|
14
|
+
program
|
|
15
|
+
.name('247')
|
|
16
|
+
.description('247 - Access Claude Code from anywhere 24/7\nby The Vibe Company')
|
|
17
|
+
.version('0.1.0')
|
|
18
|
+
.option('-P, --profile <name>', 'Use a specific profile (dev, prod, etc.)');
|
|
19
|
+
// Add commands
|
|
20
|
+
program.addCommand(initCommand);
|
|
21
|
+
program.addCommand(startCommand);
|
|
22
|
+
program.addCommand(stopCommand);
|
|
23
|
+
program.addCommand(statusCommand);
|
|
24
|
+
program.addCommand(logsCommand);
|
|
25
|
+
program.addCommand(serviceCommand);
|
|
26
|
+
program.addCommand(hooksCommand);
|
|
27
|
+
program.addCommand(updateCommand);
|
|
28
|
+
program.addCommand(doctorCommand);
|
|
29
|
+
program.addCommand(profileCommand);
|
|
30
|
+
// Export program for use in subcommands (to access global options)
|
|
31
|
+
export { program };
|
|
32
|
+
// Default action (no command)
|
|
33
|
+
program.action(() => {
|
|
34
|
+
console.log(`
|
|
35
|
+
╭──────────────────────────────────╮
|
|
36
|
+
│ 247 - The Vibe Company │
|
|
37
|
+
│ Access Claude Code 24/7 │
|
|
38
|
+
╰──────────────────────────────────╯
|
|
39
|
+
`);
|
|
40
|
+
program.help();
|
|
41
|
+
});
|
|
42
|
+
program.parse();
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,kEAAkE,CAAC;KAC/E,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,sBAAsB,EAAE,0CAA0C,CAAC,CAAC;AAE9E,eAAe;AACf,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AAEnC,mEAAmE;AACnE,OAAO,EAAE,OAAO,EAAE,CAAC;AAEnB,8BAA8B;AAC9B,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;IAClB,OAAO,CAAC,GAAG,CAAC;;;;;CAKb,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,EAAE,CAAC;AACjB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export interface AgentConfig {
|
|
2
|
+
machine: {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
};
|
|
6
|
+
agent: {
|
|
7
|
+
port: number;
|
|
8
|
+
};
|
|
9
|
+
projects: {
|
|
10
|
+
basePath: string;
|
|
11
|
+
whitelist: string[];
|
|
12
|
+
};
|
|
13
|
+
editor?: {
|
|
14
|
+
enabled: boolean;
|
|
15
|
+
portRange: {
|
|
16
|
+
start: number;
|
|
17
|
+
end: number;
|
|
18
|
+
};
|
|
19
|
+
idleTimeout: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get the profiles directory path
|
|
24
|
+
*/
|
|
25
|
+
export declare function getProfilesDir(): string;
|
|
26
|
+
/**
|
|
27
|
+
* Get the config file path for a specific profile
|
|
28
|
+
* @param profileName - Profile name, or undefined/null/'default' for default config
|
|
29
|
+
*/
|
|
30
|
+
export declare function getProfilePath(profileName?: string | null): string;
|
|
31
|
+
/**
|
|
32
|
+
* List all available profiles
|
|
33
|
+
*/
|
|
34
|
+
export declare function listProfiles(): string[];
|
|
35
|
+
/**
|
|
36
|
+
* Check if a profile exists
|
|
37
|
+
*/
|
|
38
|
+
export declare function profileExists(profileName?: string | null): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Delete a profile
|
|
41
|
+
*/
|
|
42
|
+
export declare function deleteProfile(profileName: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Load configuration from ~/.247/config.json or a profile
|
|
45
|
+
* @param profileName - Profile name to load, or undefined for default
|
|
46
|
+
*/
|
|
47
|
+
export declare function loadConfig(profileName?: string | null): AgentConfig | null;
|
|
48
|
+
/**
|
|
49
|
+
* Save configuration to ~/.247/config.json or a profile
|
|
50
|
+
* @param config - Configuration to save
|
|
51
|
+
* @param profileName - Profile name to save to, or undefined for default
|
|
52
|
+
*/
|
|
53
|
+
export declare function saveConfig(config: AgentConfig, profileName?: string | null): void;
|
|
54
|
+
/**
|
|
55
|
+
* Create a new configuration with defaults
|
|
56
|
+
*/
|
|
57
|
+
export declare function createConfig(options: {
|
|
58
|
+
machineName: string;
|
|
59
|
+
port?: number;
|
|
60
|
+
projectsPath?: string;
|
|
61
|
+
}): AgentConfig;
|
|
62
|
+
/**
|
|
63
|
+
* Check if configuration exists
|
|
64
|
+
* @param profileName - Profile name to check, or undefined for default
|
|
65
|
+
*/
|
|
66
|
+
export declare function configExists(profileName?: string | null): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Get default configuration
|
|
69
|
+
*/
|
|
70
|
+
export declare function getDefaultConfig(): AgentConfig;
|
|
71
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1C,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAqBD;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAGvC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAQlE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAsBvC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAGlE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAY1D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,GAAG,IAAI,CAwB1E;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAcjF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,WAAW,CAed;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAGjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,WAAW,CAE9C"}
|