@delfos-ai/cli 1.0.7 → 1.0.10
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/LICENSE +55 -0
- package/dist/commands/login.command.d.ts.map +1 -1
- package/dist/commands/login.command.js +0 -3
- package/dist/commands/login.command.js.map +1 -1
- package/dist/commands/logout.command.d.ts.map +1 -1
- package/dist/commands/logout.command.js +0 -4
- package/dist/commands/logout.command.js.map +1 -1
- package/dist/commands/setup/platform.d.ts +12 -0
- package/dist/commands/setup/platform.d.ts.map +1 -0
- package/dist/commands/setup/platform.js +67 -0
- package/dist/commands/setup/platform.js.map +1 -0
- package/dist/commands/setup/setup-context.d.ts +27 -0
- package/dist/commands/setup/setup-context.d.ts.map +1 -0
- package/dist/commands/setup/setup-context.js +45 -0
- package/dist/commands/setup/setup-context.js.map +1 -0
- package/dist/commands/setup/setup-wizard.d.ts +2 -0
- package/dist/commands/setup/setup-wizard.d.ts.map +1 -0
- package/dist/commands/setup/setup-wizard.js +75 -0
- package/dist/commands/setup/setup-wizard.js.map +1 -0
- package/dist/commands/setup/setup.command.d.ts +3 -0
- package/dist/commands/setup/setup.command.d.ts.map +1 -0
- package/dist/commands/setup/setup.command.js +6 -0
- package/dist/commands/setup/setup.command.js.map +1 -0
- package/dist/commands/setup/steps/authenticate.d.ts +6 -0
- package/dist/commands/setup/steps/authenticate.d.ts.map +1 -0
- package/dist/commands/setup/steps/authenticate.js +91 -0
- package/dist/commands/setup/steps/authenticate.js.map +1 -0
- package/dist/commands/setup/steps/check-chromadb.d.ts +3 -0
- package/dist/commands/setup/steps/check-chromadb.d.ts.map +1 -0
- package/dist/commands/setup/steps/check-chromadb.js +208 -0
- package/dist/commands/setup/steps/check-chromadb.js.map +1 -0
- package/dist/commands/setup/steps/check-docker.d.ts +3 -0
- package/dist/commands/setup/steps/check-docker.d.ts.map +1 -0
- package/dist/commands/setup/steps/check-docker.js +238 -0
- package/dist/commands/setup/steps/check-docker.js.map +1 -0
- package/dist/commands/setup/steps/check-node.d.ts +3 -0
- package/dist/commands/setup/steps/check-node.d.ts.map +1 -0
- package/dist/commands/setup/steps/check-node.js +34 -0
- package/dist/commands/setup/steps/check-node.js.map +1 -0
- package/dist/commands/setup/steps/configure-mcp.d.ts +6 -0
- package/dist/commands/setup/steps/configure-mcp.d.ts.map +1 -0
- package/dist/commands/setup/steps/configure-mcp.js +189 -0
- package/dist/commands/setup/steps/configure-mcp.js.map +1 -0
- package/dist/commands/setup/steps/configure-vault.d.ts +6 -0
- package/dist/commands/setup/steps/configure-vault.d.ts.map +1 -0
- package/dist/commands/setup/steps/configure-vault.js +165 -0
- package/dist/commands/setup/steps/configure-vault.js.map +1 -0
- package/dist/commands/setup/steps/index-vault.d.ts +6 -0
- package/dist/commands/setup/steps/index-vault.d.ts.map +1 -0
- package/dist/commands/setup/steps/index-vault.js +66 -0
- package/dist/commands/setup/steps/index-vault.js.map +1 -0
- package/dist/commands/setup/steps/init-vault.d.ts +6 -0
- package/dist/commands/setup/steps/init-vault.d.ts.map +1 -0
- package/dist/commands/setup/steps/init-vault.js +68 -0
- package/dist/commands/setup/steps/init-vault.js.map +1 -0
- package/dist/commands/setup/steps/summary.d.ts +3 -0
- package/dist/commands/setup/steps/summary.d.ts.map +1 -0
- package/dist/commands/setup/steps/summary.js +66 -0
- package/dist/commands/setup/steps/summary.js.map +1 -0
- package/dist/commands/setup/steps/welcome.d.ts +3 -0
- package/dist/commands/setup/steps/welcome.d.ts.map +1 -0
- package/dist/commands/setup/steps/welcome.js +61 -0
- package/dist/commands/setup/steps/welcome.js.map +1 -0
- package/dist/features/memory-server/config-loader.js +1 -1
- package/dist/features/memory-server/config-loader.js.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/crypto/crypto.js +1 -1
- package/dist/infrastructure/crypto/crypto.js.map +1 -1
- package/package.json +11 -9
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { writeConfig } from '../../../config/cli-config.js';
|
|
4
|
+
async function checkHeartbeat(host, port) {
|
|
5
|
+
const url = `http://${host}:${port}/api/v1/heartbeat`;
|
|
6
|
+
const fallbackUrl = `http://${host}:${port}/api/v1`;
|
|
7
|
+
try {
|
|
8
|
+
const response = await fetch(url, {
|
|
9
|
+
signal: AbortSignal.timeout(3000),
|
|
10
|
+
});
|
|
11
|
+
return response.ok;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// Try fallback for older ChromaDB versions
|
|
15
|
+
try {
|
|
16
|
+
const response = await fetch(fallbackUrl, {
|
|
17
|
+
signal: AbortSignal.timeout(3000),
|
|
18
|
+
});
|
|
19
|
+
return response.ok;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function pollHeartbeat(host, port, maxSeconds = 30) {
|
|
27
|
+
const { default: ora } = await import('ora');
|
|
28
|
+
const spinner = ora('Waiting for ChromaDB to start...').start();
|
|
29
|
+
const startTime = Date.now();
|
|
30
|
+
const interval = 2000; // 2 seconds
|
|
31
|
+
while (Date.now() - startTime < maxSeconds * 1000) {
|
|
32
|
+
const isAlive = await checkHeartbeat(host, port);
|
|
33
|
+
if (isAlive) {
|
|
34
|
+
spinner.succeed('ChromaDB is responding');
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
await new Promise((resolve) => setTimeout(resolve, interval));
|
|
38
|
+
}
|
|
39
|
+
spinner.fail('ChromaDB did not start within timeout');
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
async function startChromaContainer(port) {
|
|
43
|
+
const { default: ora } = await import('ora');
|
|
44
|
+
const spinner = ora('Starting ChromaDB container...').start();
|
|
45
|
+
try {
|
|
46
|
+
// Check if container exists
|
|
47
|
+
const containerStatus = execSync('docker ps -a --filter name=delfos-chromadb --format "{{.Status}}"', { stdio: 'pipe', encoding: 'utf-8' }).trim();
|
|
48
|
+
if (containerStatus) {
|
|
49
|
+
// Container exists
|
|
50
|
+
if (containerStatus.includes('Exited')) {
|
|
51
|
+
// Stopped - start it
|
|
52
|
+
execSync('docker start delfos-chromadb', { stdio: 'pipe' });
|
|
53
|
+
spinner.succeed('ChromaDB container started');
|
|
54
|
+
return { success: true, message: 'Container started' };
|
|
55
|
+
}
|
|
56
|
+
else if (containerStatus.includes('Up')) {
|
|
57
|
+
// Running but unreachable - likely port conflict
|
|
58
|
+
spinner.stop();
|
|
59
|
+
return {
|
|
60
|
+
success: false,
|
|
61
|
+
message: 'Container running but unreachable (port conflict?)',
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Create new container
|
|
66
|
+
const command = `docker run -d --name delfos-chromadb --restart unless-stopped -p ${port}:8000 -v delfos-chroma-data:/chroma/chroma chromadb/chroma:latest`;
|
|
67
|
+
execSync(command, { stdio: 'pipe' });
|
|
68
|
+
spinner.succeed('ChromaDB container created and started');
|
|
69
|
+
return { success: true, message: 'Container created' };
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
73
|
+
spinner.fail(`Failed to start ChromaDB: ${errorMessage}`);
|
|
74
|
+
return { success: false, message: errorMessage };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function promptCustomHostPort() {
|
|
78
|
+
const { default: inquirer } = await import('inquirer');
|
|
79
|
+
const { custom } = await inquirer.prompt([
|
|
80
|
+
{
|
|
81
|
+
type: 'confirm',
|
|
82
|
+
name: 'custom',
|
|
83
|
+
message: 'Use custom ChromaDB host:port?',
|
|
84
|
+
default: false,
|
|
85
|
+
},
|
|
86
|
+
]);
|
|
87
|
+
if (!custom) {
|
|
88
|
+
return { host: 'localhost', port: 8000, accepted: false };
|
|
89
|
+
}
|
|
90
|
+
const { hostPort } = await inquirer.prompt([
|
|
91
|
+
{
|
|
92
|
+
type: 'input',
|
|
93
|
+
name: 'hostPort',
|
|
94
|
+
message: 'Enter ChromaDB host:port (e.g., localhost:8000)',
|
|
95
|
+
default: 'localhost:8000',
|
|
96
|
+
validate: (input) => {
|
|
97
|
+
const parts = input.split(':');
|
|
98
|
+
if (parts.length !== 2) {
|
|
99
|
+
return 'Invalid format. Use host:port (e.g., localhost:8000)';
|
|
100
|
+
}
|
|
101
|
+
const port = parseInt(parts[1], 10);
|
|
102
|
+
if (isNaN(port) || port < 1 || port > 65535) {
|
|
103
|
+
return 'Invalid port number';
|
|
104
|
+
}
|
|
105
|
+
return true;
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
]);
|
|
109
|
+
const [host, portStr] = hostPort.split(':');
|
|
110
|
+
const port = parseInt(portStr, 10);
|
|
111
|
+
return { host, port, accepted: true };
|
|
112
|
+
}
|
|
113
|
+
export async function checkChromaDB(ctx) {
|
|
114
|
+
const host = ctx.chromaHost;
|
|
115
|
+
const port = ctx.chromaPort;
|
|
116
|
+
// Heartbeat check
|
|
117
|
+
const isAlive = await checkHeartbeat(host, port);
|
|
118
|
+
if (isAlive) {
|
|
119
|
+
ctx.chromaMethod = 'docker';
|
|
120
|
+
console.log(chalk.green('✓'), ` ChromaDB running at ${host}:${port}`);
|
|
121
|
+
return { status: 'pass', message: `${host}:${port}` };
|
|
122
|
+
}
|
|
123
|
+
// Check if Docker was skipped
|
|
124
|
+
const dockerResult = ctx.results['check-docker'];
|
|
125
|
+
if (dockerResult?.status !== 'pass') {
|
|
126
|
+
ctx.chromaMethod = 'none';
|
|
127
|
+
console.log(chalk.yellow('⚠'), ' Docker unavailable — ChromaDB skipped');
|
|
128
|
+
console.log(chalk.yellow('\nAlternative: Install ChromaDB via pip'));
|
|
129
|
+
console.log(chalk.gray(' pip install chromadb && chroma run --host localhost --port 8000 --path ~/.delfos/chroma-data'));
|
|
130
|
+
return {
|
|
131
|
+
status: 'skip',
|
|
132
|
+
message: 'Docker unavailable — install ChromaDB manually',
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// Docker is available - offer to start ChromaDB
|
|
136
|
+
console.log(chalk.yellow('⚠'), ` ChromaDB not reachable at ${host}:${port}`);
|
|
137
|
+
const { default: inquirer } = await import('inquirer');
|
|
138
|
+
const { action } = await inquirer.prompt([
|
|
139
|
+
{
|
|
140
|
+
type: 'list',
|
|
141
|
+
name: 'action',
|
|
142
|
+
message: 'Start ChromaDB via Docker?',
|
|
143
|
+
choices: [
|
|
144
|
+
{ name: 'Yes (default)', value: 'yes' },
|
|
145
|
+
{ name: 'Custom host:port', value: 'custom' },
|
|
146
|
+
{ name: 'Skip', value: 'skip' },
|
|
147
|
+
],
|
|
148
|
+
default: 'yes',
|
|
149
|
+
},
|
|
150
|
+
]);
|
|
151
|
+
if (action === 'skip') {
|
|
152
|
+
ctx.chromaMethod = 'none';
|
|
153
|
+
console.log(chalk.yellow('⚠'), ' Skipped — RAG indexing will not work');
|
|
154
|
+
return {
|
|
155
|
+
status: 'skip',
|
|
156
|
+
message: 'Skipped by user',
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
if (action === 'custom') {
|
|
160
|
+
const { host: customHost, port: customPort, accepted, } = await promptCustomHostPort();
|
|
161
|
+
if (!accepted) {
|
|
162
|
+
return checkChromaDB(ctx); // Retry with default
|
|
163
|
+
}
|
|
164
|
+
ctx.chromaHost = customHost;
|
|
165
|
+
ctx.chromaPort = customPort;
|
|
166
|
+
const customAlive = await checkHeartbeat(customHost, customPort);
|
|
167
|
+
if (customAlive) {
|
|
168
|
+
ctx.chromaMethod = 'docker';
|
|
169
|
+
console.log(chalk.green('✓'), ` ChromaDB running at ${customHost}:${customPort}`);
|
|
170
|
+
return { status: 'pass', message: `${customHost}:${customPort}` };
|
|
171
|
+
}
|
|
172
|
+
console.log(chalk.red('✗'), ` ChromaDB not reachable at ${customHost}:${customPort}`);
|
|
173
|
+
return {
|
|
174
|
+
status: 'fail',
|
|
175
|
+
message: `ChromaDB not reachable at ${customHost}:${customPort}`,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
// Start ChromaDB via Docker
|
|
179
|
+
const startResult = await startChromaContainer(port);
|
|
180
|
+
if (!startResult.success) {
|
|
181
|
+
return {
|
|
182
|
+
status: 'fail',
|
|
183
|
+
message: startResult.message,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
// Poll for heartbeat
|
|
187
|
+
const alive = await pollHeartbeat(host, port, 60);
|
|
188
|
+
if (!alive) {
|
|
189
|
+
return {
|
|
190
|
+
status: 'fail',
|
|
191
|
+
message: 'ChromaDB container started but not responding',
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
// Save config
|
|
195
|
+
try {
|
|
196
|
+
await writeConfig({ chromaPersistDir: 'delfos-chroma-data' });
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
console.log(chalk.yellow('\nWarning: Failed to save ChromaDB config'), error instanceof Error ? error.message : String(error));
|
|
200
|
+
}
|
|
201
|
+
ctx.chromaMethod = 'docker';
|
|
202
|
+
console.log(chalk.green('✓'), ` ChromaDB running at ${host}:${port} (docker)`);
|
|
203
|
+
return {
|
|
204
|
+
status: 'pass',
|
|
205
|
+
message: `${host}:${port} (docker)`,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=check-chromadb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-chromadb.js","sourceRoot":"","sources":["../../../../src/commands/setup/steps/check-chromadb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-docker.d.ts","sourceRoot":"","sources":["../../../../src/commands/setup/steps/check-docker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAmLpE,wBAAsB,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CA0HxE"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { hasSudo, runInstallCommand } from '../platform.js';
|
|
4
|
+
async function installDocker(platform) {
|
|
5
|
+
const { default: ora } = await import('ora');
|
|
6
|
+
const spinner = ora('Installing Docker...').start();
|
|
7
|
+
let command;
|
|
8
|
+
let useSudo = false;
|
|
9
|
+
switch (platform) {
|
|
10
|
+
case 'ubuntu':
|
|
11
|
+
case 'debian':
|
|
12
|
+
command =
|
|
13
|
+
'apt-get update && apt-get install -y docker.io docker-compose-plugin && systemctl enable --now docker && usermod -aG docker $USER';
|
|
14
|
+
useSudo = true;
|
|
15
|
+
break;
|
|
16
|
+
case 'fedora':
|
|
17
|
+
command =
|
|
18
|
+
'dnf install -y docker && systemctl enable --now docker && usermod -aG docker $USER';
|
|
19
|
+
useSudo = true;
|
|
20
|
+
break;
|
|
21
|
+
case 'arch':
|
|
22
|
+
command =
|
|
23
|
+
'pacman -S --noconfirm docker && systemctl enable --now docker && usermod -aG docker $USER';
|
|
24
|
+
useSudo = true;
|
|
25
|
+
break;
|
|
26
|
+
case 'macos':
|
|
27
|
+
spinner.stop();
|
|
28
|
+
// Check for Homebrew
|
|
29
|
+
try {
|
|
30
|
+
execSync('which brew', { stdio: 'pipe' });
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Offer to install Homebrew
|
|
34
|
+
const { default: inquirer } = await import('inquirer');
|
|
35
|
+
const { installHomebrew } = await inquirer.prompt([
|
|
36
|
+
{
|
|
37
|
+
type: 'confirm',
|
|
38
|
+
name: 'installHomebrew',
|
|
39
|
+
message: 'Homebrew is required. Install Homebrew now?',
|
|
40
|
+
default: true,
|
|
41
|
+
},
|
|
42
|
+
]);
|
|
43
|
+
if (!installHomebrew) {
|
|
44
|
+
return { success: false };
|
|
45
|
+
}
|
|
46
|
+
const brewSpinner = ora('Installing Homebrew...').start();
|
|
47
|
+
const brewResult = await runInstallCommand('/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"', { timeout: 600000 });
|
|
48
|
+
if (!brewResult.success) {
|
|
49
|
+
brewSpinner.fail('Homebrew installation failed');
|
|
50
|
+
return { success: false };
|
|
51
|
+
}
|
|
52
|
+
brewSpinner.succeed('Homebrew installed');
|
|
53
|
+
}
|
|
54
|
+
spinner.start();
|
|
55
|
+
command = 'brew install --cask docker';
|
|
56
|
+
useSudo = false;
|
|
57
|
+
break;
|
|
58
|
+
case 'windows':
|
|
59
|
+
spinner.stop();
|
|
60
|
+
// Check for winget
|
|
61
|
+
try {
|
|
62
|
+
execSync('winget --version', { stdio: 'pipe' });
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
console.log(chalk.yellow('winget not found. Please install Docker Desktop from: https://www.docker.com/products/docker-desktop'));
|
|
66
|
+
return { success: false };
|
|
67
|
+
}
|
|
68
|
+
spinner.start();
|
|
69
|
+
command =
|
|
70
|
+
'winget install -e --id Docker.DockerDesktop --accept-source-agreements --accept-package-agreements';
|
|
71
|
+
useSudo = false;
|
|
72
|
+
break;
|
|
73
|
+
case 'unknown-linux':
|
|
74
|
+
spinner.stop();
|
|
75
|
+
console.log(chalk.yellow('Unknown Linux distribution. Please install Docker manually following the official documentation: https://docs.docker.com/engine/install/'));
|
|
76
|
+
return { success: false };
|
|
77
|
+
default:
|
|
78
|
+
spinner.stop();
|
|
79
|
+
return { success: false };
|
|
80
|
+
}
|
|
81
|
+
// Check sudo on Linux
|
|
82
|
+
if (useSudo && !hasSudo()) {
|
|
83
|
+
spinner.stop();
|
|
84
|
+
console.log(chalk.yellow('sudo access required. Please install Docker manually with sudo privileges.'));
|
|
85
|
+
console.log(chalk.gray('For Ubuntu/Debian: sudo apt-get update && sudo apt-get install -y docker.io docker-compose-plugin && sudo systemctl enable --now docker'));
|
|
86
|
+
return { success: false };
|
|
87
|
+
}
|
|
88
|
+
const result = await runInstallCommand(command, { sudo: useSudo });
|
|
89
|
+
if (!result.success) {
|
|
90
|
+
spinner.fail('Docker installation failed');
|
|
91
|
+
return { success: false };
|
|
92
|
+
}
|
|
93
|
+
spinner.succeed('Docker installed');
|
|
94
|
+
// Warn about group change on Linux
|
|
95
|
+
if (useSudo &&
|
|
96
|
+
(platform === 'ubuntu' ||
|
|
97
|
+
platform === 'debian' ||
|
|
98
|
+
platform === 'fedora' ||
|
|
99
|
+
platform === 'arch')) {
|
|
100
|
+
console.log(chalk.yellow('\n⚠ Your user was added to the docker group.'));
|
|
101
|
+
console.log(chalk.gray('You may need to log out and log back in for this to take effect.'));
|
|
102
|
+
console.log(chalk.gray('Alternatively, run: newgrp docker (to apply group change in current session)'));
|
|
103
|
+
}
|
|
104
|
+
// Verify installation
|
|
105
|
+
try {
|
|
106
|
+
const versionOutput = execSync('docker --version', {
|
|
107
|
+
stdio: 'pipe',
|
|
108
|
+
encoding: 'utf-8',
|
|
109
|
+
});
|
|
110
|
+
const versionMatch = versionOutput.match(/Docker version (\d+\.\d+\.\d+)/);
|
|
111
|
+
const version = versionMatch ? versionMatch[1] : 'unknown';
|
|
112
|
+
return { success: true, version };
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return { success: false };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async function pollDockerDaemon(maxSeconds = 60) {
|
|
119
|
+
const { default: ora } = await import('ora');
|
|
120
|
+
const spinner = ora('Waiting for Docker daemon to start...').start();
|
|
121
|
+
const startTime = Date.now();
|
|
122
|
+
const interval = 3000; // 3 seconds
|
|
123
|
+
while (Date.now() - startTime < maxSeconds * 1000) {
|
|
124
|
+
try {
|
|
125
|
+
execSync('docker info', { stdio: 'pipe' });
|
|
126
|
+
spinner.succeed('Docker daemon is running');
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// Daemon not ready yet
|
|
131
|
+
}
|
|
132
|
+
await new Promise((resolve) => setTimeout(resolve, interval));
|
|
133
|
+
}
|
|
134
|
+
spinner.fail('Docker daemon did not start within timeout');
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
export async function checkDocker(ctx) {
|
|
138
|
+
const platform = ctx.platform;
|
|
139
|
+
// Detection: try docker --version
|
|
140
|
+
let version = null;
|
|
141
|
+
try {
|
|
142
|
+
const versionOutput = execSync('docker --version', {
|
|
143
|
+
stdio: 'pipe',
|
|
144
|
+
encoding: 'utf-8',
|
|
145
|
+
});
|
|
146
|
+
const versionMatch = versionOutput.match(/Docker version (\d+\.\d+\.\d+)/);
|
|
147
|
+
version = versionMatch ? versionMatch[1] : null;
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Docker not found
|
|
151
|
+
}
|
|
152
|
+
if (version) {
|
|
153
|
+
// Docker is installed, check if daemon is running
|
|
154
|
+
try {
|
|
155
|
+
execSync('docker info', { stdio: 'pipe' });
|
|
156
|
+
console.log(chalk.green('✓'), ` Docker v${version}`);
|
|
157
|
+
return { status: 'pass', message: `v${version}` };
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// Daemon not running
|
|
161
|
+
console.log(chalk.yellow('⚠'), ` Docker v${version} installed, but daemon not running`);
|
|
162
|
+
if (platform === 'macos' || platform === 'windows') {
|
|
163
|
+
console.log(chalk.yellow('\nPlease open Docker Desktop to start the daemon'));
|
|
164
|
+
const daemonReady = await pollDockerDaemon(60);
|
|
165
|
+
if (daemonReady) {
|
|
166
|
+
return { status: 'pass', message: `v${version}` };
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
status: 'skip',
|
|
170
|
+
message: 'Docker found, daemon not running',
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
// Linux: try to start daemon
|
|
175
|
+
console.log(chalk.yellow('\nAttempting to start Docker daemon...'));
|
|
176
|
+
const startResult = await runInstallCommand('systemctl start docker', {
|
|
177
|
+
sudo: true,
|
|
178
|
+
});
|
|
179
|
+
if (startResult.success) {
|
|
180
|
+
try {
|
|
181
|
+
execSync('docker info', { stdio: 'pipe' });
|
|
182
|
+
console.log(chalk.green('✓'), ` Docker v${version} (daemon started)`);
|
|
183
|
+
return { status: 'pass', message: `v${version}` };
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// Still not running
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
status: 'skip',
|
|
191
|
+
message: 'Docker found, daemon not running',
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Docker not found - offer to install
|
|
197
|
+
const { default: inquirer } = await import('inquirer');
|
|
198
|
+
const { installDocker: shouldInstall } = await inquirer.prompt([
|
|
199
|
+
{
|
|
200
|
+
type: 'confirm',
|
|
201
|
+
name: 'installDocker',
|
|
202
|
+
message: 'Docker is required for ChromaDB. Install Docker now?',
|
|
203
|
+
default: true,
|
|
204
|
+
},
|
|
205
|
+
]);
|
|
206
|
+
if (!shouldInstall) {
|
|
207
|
+
console.log(chalk.yellow('⚠'), ' Skipped — ChromaDB and indexing will also skip');
|
|
208
|
+
return {
|
|
209
|
+
status: 'skip',
|
|
210
|
+
message: 'Skipped — ChromaDB and indexing will also skip',
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
const installResult = await installDocker(platform);
|
|
214
|
+
if (!installResult.success) {
|
|
215
|
+
return {
|
|
216
|
+
status: 'skip',
|
|
217
|
+
message: 'Docker installation failed or skipped',
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
// Wait for daemon on macOS/Windows
|
|
221
|
+
if (platform === 'macos' || platform === 'windows') {
|
|
222
|
+
console.log(chalk.yellow('\nStarting Docker Desktop...'));
|
|
223
|
+
const daemonReady = await pollDockerDaemon(60);
|
|
224
|
+
if (!daemonReady) {
|
|
225
|
+
console.log(chalk.yellow('\nPlease open Docker Desktop manually and re-run `delfos setup`'));
|
|
226
|
+
return {
|
|
227
|
+
status: 'skip',
|
|
228
|
+
message: 'Docker installed, daemon pending',
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
console.log(chalk.green('✓'), ` Docker v${installResult.version} (installed)`);
|
|
233
|
+
return {
|
|
234
|
+
status: 'pass',
|
|
235
|
+
message: `v${installResult.version} (installed)`,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=check-docker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-docker.js","sourceRoot":"","sources":["../../../../src/commands/setup/steps/check-docker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-node.d.ts","sourceRoot":"","sources":["../../../../src/commands/setup/steps/check-node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEpE,wBAAsB,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAqCtE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export async function checkNode(ctx) {
|
|
3
|
+
const version = process.version;
|
|
4
|
+
const majorVersion = parseInt(version.replace(/^v/, '').split('.')[0], 10);
|
|
5
|
+
if (majorVersion >= 22) {
|
|
6
|
+
console.log(chalk.green('✓'), ` Node.js ${version}`);
|
|
7
|
+
return { status: 'pass', message: version };
|
|
8
|
+
}
|
|
9
|
+
console.log(chalk.red('✗'), ` Node.js ${version} — requires v22+`);
|
|
10
|
+
// Show platform-specific upgrade instructions
|
|
11
|
+
const platform = ctx.platform;
|
|
12
|
+
let instructions = '';
|
|
13
|
+
switch (platform) {
|
|
14
|
+
case 'ubuntu':
|
|
15
|
+
case 'debian':
|
|
16
|
+
instructions =
|
|
17
|
+
'curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - && sudo apt-get install -y nodejs';
|
|
18
|
+
break;
|
|
19
|
+
case 'macos':
|
|
20
|
+
instructions = 'brew install node@22 or nvm install 22';
|
|
21
|
+
break;
|
|
22
|
+
case 'windows':
|
|
23
|
+
instructions =
|
|
24
|
+
'winget install OpenJS.NodeJS.LTS or download from nodejs.org';
|
|
25
|
+
break;
|
|
26
|
+
default:
|
|
27
|
+
instructions = 'nvm install 22 or download from nodejs.org';
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
console.log(chalk.yellow('\nUpgrade instructions:'));
|
|
31
|
+
console.log(chalk.gray(instructions));
|
|
32
|
+
return { status: 'fail', message: `${version} — requires v22+` };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=check-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-node.js","sourceRoot":"","sources":["../../../../src/commands/setup/steps/check-node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAiB;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE3E,IAAI,YAAY,IAAI,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,YAAY,OAAO,EAAE,CAAC,CAAC;QACrD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC9C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,YAAY,OAAO,kBAAkB,CAAC,CAAC;IAEnE,8CAA8C;IAC9C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC9B,IAAI,YAAY,GAAG,EAAE,CAAC;IAEtB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ;YACX,YAAY;gBACV,qGAAqG,CAAC;YACxG,MAAM;QACR,KAAK,OAAO;YACV,YAAY,GAAG,wCAAwC,CAAC;YACxD,MAAM;QACR,KAAK,SAAS;YACZ,YAAY;gBACV,8DAA8D,CAAC;YACjE,MAAM;QACR;YACE,YAAY,GAAG,4CAA4C,CAAC;YAC5D,MAAM;IACV,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAEtC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,kBAAkB,EAAE,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* configure-mcp.ts — Step 7: Detect IDEs and configure MCP servers.
|
|
3
|
+
*/
|
|
4
|
+
import type { SetupContext, StepResult } from '../setup-context.js';
|
|
5
|
+
export declare function configureMcp(ctx: SetupContext): Promise<StepResult>;
|
|
6
|
+
//# sourceMappingURL=configure-mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure-mcp.d.ts","sourceRoot":"","sources":["../../../../src/commands/setup/steps/configure-mcp.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAyGpE,wBAAsB,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAgLzE"}
|