@matrixhub/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 ADDED
@@ -0,0 +1,156 @@
1
+ # @matrixhub/cli
2
+
3
+ CLI tool for deploying and managing MatrixHub - your self-hosted AI model registry.
4
+
5
+ ## 🚀 Quick Start
6
+
7
+ No installation needed! Use `npx` to run MatrixHub directly:
8
+
9
+ ```bash
10
+ npx @matrixhub/cli start
11
+ ```
12
+
13
+ Or install globally:
14
+
15
+ ```bash
16
+ npm install -g @matrixhub/cli
17
+ matrixhub start
18
+ ```
19
+
20
+ ## 📋 Prerequisites
21
+
22
+ - Docker installed and running
23
+ - Node.js 18+ (for npx/npm)
24
+
25
+ ## 🎯 Commands
26
+
27
+ ### `start`
28
+
29
+ Start a new MatrixHub container:
30
+
31
+ ```bash
32
+ npx @matrixhub/cli start [options]
33
+ ```
34
+
35
+ **Options:**
36
+ - `-p, --port <port>` - Port to expose (default: 9527)
37
+ - `-d, --data <path>` - Data directory path (default: ./data)
38
+ - `-n, --name <name>` - Container name (default: matrixhub)
39
+ - `--image <image>` - Docker image to use (default: ghcr.io/matrixhub-ai/matrixhub:main)
40
+
41
+ **Examples:**
42
+
43
+ ```bash
44
+ # Start with defaults (port 9527, ./data directory)
45
+ npx @matrixhub/cli start
46
+
47
+ # Start on custom port with custom data directory
48
+ npx @matrixhub/cli start -p 8080 -d ~/matrixhub-data
49
+
50
+ # Use a specific image version
51
+ npx @matrixhub/cli start --image ghcr.io/matrixhub-ai/matrixhub:v1.0.0
52
+ ```
53
+
54
+ ### `stop`
55
+
56
+ Stop the running MatrixHub container:
57
+
58
+ ```bash
59
+ npx @matrixhub/cli stop
60
+ ```
61
+
62
+ ### `restart`
63
+
64
+ Restart the MatrixHub container:
65
+
66
+ ```bash
67
+ npx @matrixhub/cli restart
68
+ ```
69
+
70
+ ### `status`
71
+
72
+ Check the status of the MatrixHub container:
73
+
74
+ ```bash
75
+ npx @matrixhub/cli status
76
+ ```
77
+
78
+ ### `logs`
79
+
80
+ View container logs:
81
+
82
+ ```bash
83
+ npx @matrixhub/cli logs [options]
84
+ ```
85
+
86
+ **Options:**
87
+ - `-f, --follow` - Follow log output (like `tail -f`)
88
+ - `--tail <lines>` - Number of lines to show from the end (default: 100)
89
+
90
+ **Examples:**
91
+
92
+ ```bash
93
+ # View last 100 lines of logs
94
+ npx @matrixhub/cli logs
95
+
96
+ # Follow logs in real-time
97
+ npx @matrixhub/cli logs -f
98
+
99
+ # View last 500 lines
100
+ npx @matrixhub/cli logs --tail 500
101
+ ```
102
+
103
+ ### `update`
104
+
105
+ Update MatrixHub to the latest version:
106
+
107
+ ```bash
108
+ npx @matrixhub/cli update
109
+ ```
110
+
111
+ This will:
112
+ 1. Pull the latest Docker image
113
+ 2. Stop the current container
114
+ 3. Remove the old container
115
+ 4. Prompt you to start the new version
116
+
117
+ ## 🎨 Features
118
+
119
+ - **Zero Configuration**: Works out of the box with sensible defaults
120
+ - **Interactive**: Prompts for confirmation when needed
121
+ - **Colorful Output**: Clear, easy-to-read terminal output
122
+ - **Error Handling**: Helpful error messages and recovery suggestions
123
+ - **Docker Detection**: Checks if Docker is installed before running
124
+
125
+ ## 🛠️ Development
126
+
127
+ ```bash
128
+ # Clone the repository
129
+ git clone https://github.com/matrixhub-ai/matrixhub.git
130
+ cd matrixhub/packages/cli
131
+
132
+ # Install dependencies
133
+ npm install
134
+
135
+ # Build
136
+ npm run build
137
+
138
+ # Link locally for testing
139
+ npm link
140
+
141
+ # Now you can use the command
142
+ matrixhub start
143
+ ```
144
+
145
+ ## 📄 License
146
+
147
+ Apache-2.0 - see [LICENSE](../../LICENSE) for details.
148
+
149
+ ## 🤝 Contributing
150
+
151
+ Contributions are welcome! Please see [CONTRIBUTING.md](../../CONTRIBUTING.md) for details.
152
+
153
+ ## 📞 Support
154
+
155
+ - [GitHub Issues](https://github.com/matrixhub-ai/matrixhub/issues)
156
+ - [Slack Community](https://cloud-native.slack.com/archives/C0A8UKWR8HG)
@@ -0,0 +1,2 @@
1
+ export declare function logsCommand(options: any): Promise<void>;
2
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,CAAC,OAAO,EAAE,GAAG,iBAiB7C"}
@@ -0,0 +1,20 @@
1
+ import chalk from 'chalk';
2
+ import { doesContainerExist, getContainerLogs } from '../utils/docker.js';
3
+ export async function logsCommand(options) {
4
+ const exists = await doesContainerExist(options.name);
5
+ if (!exists) {
6
+ console.log(chalk.yellow(`\n⚠️ Container "${options.name}" not found\n`));
7
+ process.exit(0);
8
+ }
9
+ if (options.follow) {
10
+ console.log(chalk.gray(`Following logs for "${options.name}" (Ctrl+C to stop)...\n`));
11
+ }
12
+ try {
13
+ await getContainerLogs(options.name, options.follow, options.tail);
14
+ }
15
+ catch (error) {
16
+ console.error(chalk.red('\nError:'), error.message);
17
+ process.exit(1);
18
+ }
19
+ }
20
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAY;IAC5C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,OAAO,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,OAAO,CAAC,IAAI,yBAAyB,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,CAAC;QACH,MAAM,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function restartCommand(options: any): Promise<void>;
2
+ //# sourceMappingURL=restart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restart.d.ts","sourceRoot":"","sources":["../../src/commands/restart.ts"],"names":[],"mappings":"AAOA,wBAAsB,cAAc,CAAC,OAAO,EAAE,GAAG,iBAoBhD"}
@@ -0,0 +1,24 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { doesContainerExist, restartContainer } from '../utils/docker.js';
4
+ export async function restartCommand(options) {
5
+ console.log(chalk.blue.bold('\n🔄 Restarting MatrixHub\n'));
6
+ const exists = await doesContainerExist(options.name);
7
+ if (!exists) {
8
+ console.log(chalk.yellow(`⚠️ Container "${options.name}" not found`));
9
+ console.log(chalk.gray('💡 Use "matrixhub start" to create a new container\n'));
10
+ process.exit(0);
11
+ }
12
+ const spinner = ora('Restarting container...').start();
13
+ try {
14
+ await restartContainer(options.name);
15
+ spinner.succeed('MatrixHub container restarted');
16
+ console.log(chalk.green.bold('\n✅ MatrixHub is now running!\n'));
17
+ }
18
+ catch (error) {
19
+ spinner.fail('Failed to restart container');
20
+ console.error(chalk.red('\nError:'), error.message);
21
+ process.exit(1);
22
+ }
23
+ }
24
+ //# sourceMappingURL=restart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restart.js","sourceRoot":"","sources":["../../src/commands/restart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAY;IAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAE5D,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,OAAO,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC5C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function startCommand(options: any): Promise<void>;
2
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAaA,wBAAsB,YAAY,CAAC,OAAO,EAAE,GAAG,iBAmF9C"}
@@ -0,0 +1,79 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import prompts from 'prompts';
4
+ import { checkDockerInstalled, isContainerRunning, doesContainerExist, runContainer, removeContainer, getAbsolutePath } from '../utils/docker.js';
5
+ export async function startCommand(options) {
6
+ console.log(chalk.blue.bold('\n🚀 MatrixHub Deployment\n'));
7
+ // Check if Docker is installed
8
+ const spinner = ora('Checking Docker installation...').start();
9
+ const dockerInstalled = await checkDockerInstalled();
10
+ if (!dockerInstalled) {
11
+ spinner.fail('Docker is not installed or not in PATH');
12
+ console.log(chalk.yellow('\nPlease install Docker first:'));
13
+ console.log(chalk.cyan(' https://docs.docker.com/get-docker/\n'));
14
+ process.exit(1);
15
+ }
16
+ spinner.succeed('Docker is installed');
17
+ // Check if container already exists
18
+ const containerExists = await doesContainerExist(options.name);
19
+ const containerRunning = await isContainerRunning(options.name);
20
+ if (containerRunning) {
21
+ console.log(chalk.yellow(`\n⚠️ Container "${options.name}" is already running`));
22
+ console.log(chalk.cyan(` Access MatrixHub at http://localhost:${options.port}\n`));
23
+ process.exit(0);
24
+ }
25
+ if (containerExists) {
26
+ const response = await prompts({
27
+ type: 'confirm',
28
+ name: 'remove',
29
+ message: `Container "${options.name}" already exists. Remove and recreate?`,
30
+ initial: true
31
+ });
32
+ if (!response.remove) {
33
+ console.log(chalk.yellow('\nOperation cancelled\n'));
34
+ process.exit(0);
35
+ }
36
+ const removeSpinner = ora('Removing existing container...').start();
37
+ await removeContainer(options.name);
38
+ removeSpinner.succeed('Container removed');
39
+ }
40
+ // Convert data path to absolute path
41
+ const absoluteDataPath = getAbsolutePath(options.data);
42
+ // Pull image
43
+ const pullSpinner = ora(`Pulling Docker image: ${options.image}...`).start();
44
+ try {
45
+ await import('../utils/docker.js').then(m => m.pullImage(options.image));
46
+ pullSpinner.succeed('Docker image pulled');
47
+ }
48
+ catch (error) {
49
+ pullSpinner.warn('Failed to pull image, will use local image if available');
50
+ }
51
+ // Start container
52
+ const startSpinner = ora('Starting MatrixHub container...').start();
53
+ try {
54
+ const runOptions = {
55
+ name: options.name,
56
+ image: options.image,
57
+ port: options.port,
58
+ dataPath: absoluteDataPath,
59
+ detach: options.detach
60
+ };
61
+ await runContainer(runOptions);
62
+ startSpinner.succeed('MatrixHub container started');
63
+ console.log(chalk.green.bold('\n✅ MatrixHub is now running!\n'));
64
+ console.log(chalk.cyan('📍 Access MatrixHub at:'), chalk.bold(`http://localhost:${options.port}`));
65
+ console.log(chalk.cyan('📁 Data directory:'), chalk.bold(absoluteDataPath));
66
+ console.log(chalk.cyan('🐳 Container name:'), chalk.bold(options.name));
67
+ console.log(chalk.gray('\n💡 Useful commands:'));
68
+ console.log(chalk.gray(' matrixhub status - Check container status'));
69
+ console.log(chalk.gray(' matrixhub logs - View container logs'));
70
+ console.log(chalk.gray(' matrixhub stop - Stop the container'));
71
+ console.log(chalk.gray(' matrixhub restart - Restart the container\n'));
72
+ }
73
+ catch (error) {
74
+ startSpinner.fail('Failed to start container');
75
+ console.error(chalk.red('\nError:'), error.message);
76
+ process.exit(1);
77
+ }
78
+ }
79
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function statusCommand(options: any): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAOA,wBAAsB,aAAa,CAAC,OAAO,EAAE,GAAG,iBAoB/C"}
@@ -0,0 +1,20 @@
1
+ import chalk from 'chalk';
2
+ import { doesContainerExist, isContainerRunning, getContainerStatus } from '../utils/docker.js';
3
+ export async function statusCommand(options) {
4
+ console.log(chalk.blue.bold('\n📊 MatrixHub Status\n'));
5
+ const exists = await doesContainerExist(options.name);
6
+ if (!exists) {
7
+ console.log(chalk.yellow(`⚠️ Container "${options.name}" not found\n`));
8
+ process.exit(0);
9
+ }
10
+ const running = await isContainerRunning(options.name);
11
+ const status = await getContainerStatus(options.name);
12
+ console.log(chalk.cyan('Container name:'), chalk.bold(options.name));
13
+ console.log(chalk.cyan('Status:'), running ? chalk.green.bold('Running ✅') : chalk.red.bold('Stopped ❌'));
14
+ console.log(chalk.cyan('Details:'), status);
15
+ if (running) {
16
+ console.log(chalk.cyan('\n📍 Access MatrixHub at:'), chalk.bold('http://localhost:9527'));
17
+ }
18
+ console.log();
19
+ }
20
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAY;IAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAExD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,OAAO,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAE5C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function stopCommand(options: any): Promise<void>;
2
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAQA,wBAAsB,WAAW,CAAC,OAAO,EAAE,GAAG,iBAyB7C"}
@@ -0,0 +1,28 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { isContainerRunning, doesContainerExist, stopContainer } from '../utils/docker.js';
4
+ export async function stopCommand(options) {
5
+ console.log(chalk.blue.bold('\n🛑 Stopping MatrixHub\n'));
6
+ const exists = await doesContainerExist(options.name);
7
+ if (!exists) {
8
+ console.log(chalk.yellow(`⚠️ Container "${options.name}" not found\n`));
9
+ process.exit(0);
10
+ }
11
+ const running = await isContainerRunning(options.name);
12
+ if (!running) {
13
+ console.log(chalk.yellow(`⚠️ Container "${options.name}" is not running\n`));
14
+ process.exit(0);
15
+ }
16
+ const spinner = ora('Stopping container...').start();
17
+ try {
18
+ await stopContainer(options.name);
19
+ spinner.succeed('MatrixHub container stopped');
20
+ console.log(chalk.gray('\n💡 Use "matrixhub start" to start it again\n'));
21
+ }
22
+ catch (error) {
23
+ spinner.fail('Failed to stop container');
24
+ console.error(chalk.red('\nError:'), error.message);
25
+ process.exit(1);
26
+ }
27
+ }
28
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACd,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAY;IAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,OAAO,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,OAAO,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function updateCommand(options: any): Promise<void>;
2
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAaA,wBAAsB,aAAa,CAAC,OAAO,EAAE,GAAG,iBA8D/C"}
@@ -0,0 +1,63 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import prompts from 'prompts';
4
+ import { doesContainerExist, isContainerRunning, stopContainer, removeContainer, pullImage } from '../utils/docker.js';
5
+ export async function updateCommand(options) {
6
+ console.log(chalk.blue.bold('\n🔄 Updating MatrixHub\n'));
7
+ const exists = await doesContainerExist(options.name);
8
+ if (!exists) {
9
+ console.log(chalk.yellow(`⚠️ Container "${options.name}" not found\n`));
10
+ process.exit(0);
11
+ }
12
+ const running = await isContainerRunning(options.name);
13
+ const response = await prompts({
14
+ type: 'confirm',
15
+ name: 'confirm',
16
+ message: running
17
+ ? 'This will stop the current container and start a new one with the latest image. Continue?'
18
+ : 'This will remove the current container and start a new one with the latest image. Continue?',
19
+ initial: true
20
+ });
21
+ if (!response.confirm) {
22
+ console.log(chalk.yellow('\nUpdate cancelled\n'));
23
+ process.exit(0);
24
+ }
25
+ // Pull latest image
26
+ const pullSpinner = ora(`Pulling latest image: ${options.image}...`).start();
27
+ try {
28
+ await pullImage(options.image);
29
+ pullSpinner.succeed('Latest image pulled');
30
+ }
31
+ catch (error) {
32
+ pullSpinner.fail('Failed to pull image');
33
+ console.error(chalk.red('\nError:'), error.message);
34
+ process.exit(1);
35
+ }
36
+ // Stop container if running
37
+ if (running) {
38
+ const stopSpinner = ora('Stopping container...').start();
39
+ try {
40
+ await stopContainer(options.name);
41
+ stopSpinner.succeed('Container stopped');
42
+ }
43
+ catch (error) {
44
+ stopSpinner.fail('Failed to stop container');
45
+ console.error(chalk.red('\nError:'), error.message);
46
+ process.exit(1);
47
+ }
48
+ }
49
+ // Remove old container
50
+ const removeSpinner = ora('Removing old container...').start();
51
+ try {
52
+ await removeContainer(options.name);
53
+ removeSpinner.succeed('Old container removed');
54
+ }
55
+ catch (error) {
56
+ removeSpinner.fail('Failed to remove container');
57
+ console.error(chalk.red('\nError:'), error.message);
58
+ process.exit(1);
59
+ }
60
+ console.log(chalk.green.bold('\n✅ MatrixHub updated successfully!'));
61
+ console.log(chalk.gray('\n💡 Use "matrixhub start" to start the updated version\n'));
62
+ }
63
+ //# 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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { startCommand } from './commands/start.js';
4
+ import { stopCommand } from './commands/stop.js';
5
+ import { restartCommand } from './commands/restart.js';
6
+ import { statusCommand } from './commands/status.js';
7
+ import { logsCommand } from './commands/logs.js';
8
+ import { updateCommand } from './commands/update.js';
9
+ const program = new Command();
10
+ program
11
+ .name('matrixhub')
12
+ .description('CLI tool for deploying and managing MatrixHub')
13
+ .version('0.1.0');
14
+ program
15
+ .command('start')
16
+ .description('Start MatrixHub container')
17
+ .option('-p, --port <port>', 'Port to expose (default: 9527)', '9527')
18
+ .option('-d, --data <path>', 'Data directory path (default: ./data)', './data')
19
+ .option('-n, --name <name>', 'Container name (default: matrixhub)', 'matrixhub')
20
+ .option('--image <image>', 'Docker image to use', 'ghcr.io/matrixhub-ai/matrixhub:main')
21
+ .option('--detach', 'Run container in detached mode', true)
22
+ .action(startCommand);
23
+ program
24
+ .command('stop')
25
+ .description('Stop MatrixHub container')
26
+ .option('-n, --name <name>', 'Container name (default: matrixhub)', 'matrixhub')
27
+ .action(stopCommand);
28
+ program
29
+ .command('restart')
30
+ .description('Restart MatrixHub container')
31
+ .option('-n, --name <name>', 'Container name (default: matrixhub)', 'matrixhub')
32
+ .action(restartCommand);
33
+ program
34
+ .command('status')
35
+ .description('Check MatrixHub container status')
36
+ .option('-n, --name <name>', 'Container name (default: matrixhub)', 'matrixhub')
37
+ .action(statusCommand);
38
+ program
39
+ .command('logs')
40
+ .description('View MatrixHub container logs')
41
+ .option('-n, --name <name>', 'Container name (default: matrixhub)', 'matrixhub')
42
+ .option('-f, --follow', 'Follow log output', false)
43
+ .option('--tail <lines>', 'Number of lines to show from the end of the logs', '100')
44
+ .action(logsCommand);
45
+ program
46
+ .command('update')
47
+ .description('Update MatrixHub to the latest version')
48
+ .option('-n, --name <name>', 'Container name (default: matrixhub)', 'matrixhub')
49
+ .option('--image <image>', 'Docker image to use', 'ghcr.io/matrixhub-ai/matrixhub:main')
50
+ .action(updateCommand);
51
+ program.parse();
52
+ //# 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;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,2BAA2B,CAAC;KACxC,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,EAAE,MAAM,CAAC;KACrE,MAAM,CAAC,mBAAmB,EAAE,uCAAuC,EAAE,QAAQ,CAAC;KAC9E,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,WAAW,CAAC;KAC/E,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,qCAAqC,CAAC;KACvF,MAAM,CAAC,UAAU,EAAE,gCAAgC,EAAE,IAAI,CAAC;KAC1D,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,WAAW,CAAC;KAC/E,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,WAAW,CAAC;KAC/E,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,WAAW,CAAC;KAC/E,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,WAAW,CAAC;KAC/E,MAAM,CAAC,cAAc,EAAE,mBAAmB,EAAE,KAAK,CAAC;KAClD,MAAM,CAAC,gBAAgB,EAAE,kDAAkD,EAAE,KAAK,CAAC;KACnF,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,WAAW,CAAC;KAC/E,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,qCAAqC,CAAC;KACvF,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,19 @@
1
+ export interface DockerRunOptions {
2
+ name: string;
3
+ image: string;
4
+ port: string;
5
+ dataPath: string;
6
+ detach: boolean;
7
+ }
8
+ export declare function checkDockerInstalled(): Promise<boolean>;
9
+ export declare function isContainerRunning(name: string): Promise<boolean>;
10
+ export declare function doesContainerExist(name: string): Promise<boolean>;
11
+ export declare function runContainer(options: DockerRunOptions): Promise<void>;
12
+ export declare function stopContainer(name: string): Promise<void>;
13
+ export declare function removeContainer(name: string): Promise<void>;
14
+ export declare function restartContainer(name: string): Promise<void>;
15
+ export declare function getContainerStatus(name: string): Promise<string>;
16
+ export declare function getContainerLogs(name: string, follow?: boolean, tail?: string): Promise<void>;
17
+ export declare function pullImage(image: string): Promise<void>;
18
+ export declare function getAbsolutePath(path: string): string;
19
+ //# sourceMappingURL=docker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/utils/docker.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO7D;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASvE;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASvE;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAc3E;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/D;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjE;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAElE;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAStE;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,OAAe,EACvB,IAAI,GAAE,MAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQpD"}
@@ -0,0 +1,97 @@
1
+ import { exec } from 'child_process';
2
+ import { promisify } from 'util';
3
+ const execAsync = promisify(exec);
4
+ export async function checkDockerInstalled() {
5
+ try {
6
+ await execAsync('docker --version');
7
+ return true;
8
+ }
9
+ catch (error) {
10
+ return false;
11
+ }
12
+ }
13
+ export async function isContainerRunning(name) {
14
+ try {
15
+ const { stdout } = await execAsync(`docker ps --filter "name=${name}" --format "{{.Names}}"`);
16
+ return stdout.trim() === name;
17
+ }
18
+ catch (error) {
19
+ return false;
20
+ }
21
+ }
22
+ export async function doesContainerExist(name) {
23
+ try {
24
+ const { stdout } = await execAsync(`docker ps -a --filter "name=${name}" --format "{{.Names}}"`);
25
+ return stdout.trim() === name;
26
+ }
27
+ catch (error) {
28
+ return false;
29
+ }
30
+ }
31
+ export async function runContainer(options) {
32
+ const { name, image, port, dataPath, detach } = options;
33
+ const cmd = [
34
+ 'docker run',
35
+ detach ? '-d' : '',
36
+ `--name ${name}`,
37
+ `--restart unless-stopped`,
38
+ `-p ${port}:9527`,
39
+ `-v ${dataPath}:/data`,
40
+ image
41
+ ].filter(Boolean).join(' ');
42
+ await execAsync(cmd);
43
+ }
44
+ export async function stopContainer(name) {
45
+ await execAsync(`docker stop ${name}`);
46
+ }
47
+ export async function removeContainer(name) {
48
+ await execAsync(`docker rm ${name}`);
49
+ }
50
+ export async function restartContainer(name) {
51
+ await execAsync(`docker restart ${name}`);
52
+ }
53
+ export async function getContainerStatus(name) {
54
+ try {
55
+ const { stdout } = await execAsync(`docker ps -a --filter "name=${name}" --format "{{.Status}}"`);
56
+ return stdout.trim();
57
+ }
58
+ catch (error) {
59
+ return 'Not found';
60
+ }
61
+ }
62
+ export async function getContainerLogs(name, follow = false, tail = '100') {
63
+ const cmd = [
64
+ 'docker logs',
65
+ follow ? '-f' : '',
66
+ `--tail ${tail}`,
67
+ name
68
+ ].filter(Boolean).join(' ');
69
+ if (follow) {
70
+ // For follow mode, we need to use spawn instead of exec
71
+ const { spawn } = await import('child_process');
72
+ const child = spawn('docker', ['logs', '-f', '--tail', tail, name], {
73
+ stdio: 'inherit'
74
+ });
75
+ process.on('SIGINT', () => {
76
+ child.kill('SIGTERM');
77
+ process.exit(0);
78
+ });
79
+ }
80
+ else {
81
+ const { stdout } = await execAsync(cmd);
82
+ console.log(stdout);
83
+ }
84
+ }
85
+ export async function pullImage(image) {
86
+ await execAsync(`docker pull ${image}`);
87
+ }
88
+ export function getAbsolutePath(path) {
89
+ if (path.startsWith('/')) {
90
+ return path;
91
+ }
92
+ if (path.startsWith('~/')) {
93
+ return path.replace('~', process.env.HOME || '~');
94
+ }
95
+ return `${process.cwd()}/${path}`;
96
+ }
97
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/utils/docker.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@matrixhub/cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI tool for deploying and managing MatrixHub",
5
+ "type": "module",
6
+ "bin": {
7
+ "matrixhub": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "dev": "tsc --watch",
15
+ "prepublishOnly": "npm run build"
16
+ },
17
+ "keywords": [
18
+ "matrixhub",
19
+ "ai",
20
+ "model-registry",
21
+ "huggingface",
22
+ "docker",
23
+ "cli"
24
+ ],
25
+ "author": "MatrixHub Authors",
26
+ "license": "Apache-2.0",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "https://github.com/matrixhub-ai/matrixhub.git",
30
+ "directory": "packages/cli"
31
+ },
32
+ "bugs": {
33
+ "url": "https://github.com/matrixhub-ai/matrixhub/issues"
34
+ },
35
+ "homepage": "https://github.com/matrixhub-ai/matrixhub#readme",
36
+ "dependencies": {
37
+ "commander": "^12.1.0",
38
+ "chalk": "^5.4.1",
39
+ "ora": "^8.1.1",
40
+ "prompts": "^2.4.2"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^22.10.6",
44
+ "@types/prompts": "^2.4.9",
45
+ "typescript": "^5.7.3"
46
+ },
47
+ "engines": {
48
+ "node": ">=18.0.0"
49
+ }
50
+ }