vesper-memory 0.5.2 → 0.5.4
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 +49 -14
- package/config/claude-rules/memory-discipline.md +39 -0
- package/config/claude-rules/vesper.md +218 -0
- package/dist/cli.js +59 -0
- package/dist/cli.js.map +1 -1
- package/package.json +1 -2
- package/dist/cli 2.js +0 -583
- package/dist/cli.d 2.ts +0 -8
- package/dist/cli.d.ts 2.map +0 -1
- package/dist/cli.js 2.map +0 -1
- package/dist/config 2/rate-limits.d.ts +0 -76
- package/dist/config 2/rate-limits.d.ts.map +0 -1
- package/dist/config 2/rate-limits.js +0 -161
- package/dist/config 2/rate-limits.js.map +0 -1
- package/dist/consolidation 2/pipeline.d.ts +0 -52
- package/dist/consolidation 2/pipeline.d.ts.map +0 -1
- package/dist/consolidation 2/pipeline.js +0 -193
- package/dist/consolidation 2/pipeline.js.map +0 -1
- package/dist/embeddings 2/client.d.ts +0 -94
- package/dist/embeddings 2/client.d.ts.map +0 -1
- package/dist/embeddings 2/client.js +0 -144
- package/dist/embeddings 2/client.js.map +0 -1
- package/dist/memory-layers 2/semantic-memory.d.ts +0 -33
- package/dist/memory-layers 2/semantic-memory.d.ts.map +0 -1
- package/dist/memory-layers 2/semantic-memory.js +0 -114
- package/dist/memory-layers 2/semantic-memory.js.map +0 -1
- package/dist/memory-layers 2/skill-library.d.ts +0 -25
- package/dist/memory-layers 2/skill-library.d.ts.map +0 -1
- package/dist/memory-layers 2/skill-library.js +0 -54
- package/dist/memory-layers 2/skill-library.js.map +0 -1
- package/dist/memory-layers 2/working-memory.d.ts +0 -57
- package/dist/memory-layers 2/working-memory.d.ts.map +0 -1
- package/dist/memory-layers 2/working-memory.js +0 -153
- package/dist/memory-layers 2/working-memory.js.map +0 -1
- package/dist/middleware 2/auth.d.ts +0 -287
- package/dist/middleware 2/auth.d.ts.map +0 -1
- package/dist/middleware 2/auth.js +0 -610
- package/dist/middleware 2/auth.js.map +0 -1
- package/dist/monitoring 2/health.d.ts +0 -241
- package/dist/monitoring 2/health.d.ts.map +0 -1
- package/dist/monitoring 2/health.js +0 -649
- package/dist/monitoring 2/health.js.map +0 -1
- package/dist/monitoring 2/metrics.d.ts +0 -153
- package/dist/monitoring 2/metrics.d.ts.map +0 -1
- package/dist/monitoring 2/metrics.js +0 -349
- package/dist/monitoring 2/metrics.js.map +0 -1
- package/dist/retrieval 2/hybrid-search.d.ts +0 -186
- package/dist/retrieval 2/hybrid-search.d.ts.map +0 -1
- package/dist/retrieval 2/hybrid-search.js +0 -327
- package/dist/retrieval 2/hybrid-search.js.map +0 -1
- package/dist/router 2/smart-router.d.ts +0 -111
- package/dist/router 2/smart-router.d.ts.map +0 -1
- package/dist/router 2/smart-router.js +0 -383
- package/dist/router 2/smart-router.js.map +0 -1
- package/dist/security 2/rate-limit-middleware.d.ts +0 -119
- package/dist/security 2/rate-limit-middleware.d.ts.map +0 -1
- package/dist/security 2/rate-limit-middleware.js +0 -193
- package/dist/security 2/rate-limit-middleware.js.map +0 -1
- package/dist/server 2.js +0 -861
- package/dist/server-wrapper 2.js +0 -170
- package/dist/server-wrapper.d 2.ts +0 -12
- package/dist/server-wrapper.d.ts 2.map +0 -1
- package/dist/server-wrapper.js 2.map +0 -1
- package/dist/server.d 2.ts +0 -14
- package/dist/server.d.ts 2.map +0 -1
- package/dist/server.js 2.map +0 -1
- package/dist/synthesis 2/conflict-detector.d.ts +0 -43
- package/dist/synthesis 2/conflict-detector.d.ts.map +0 -1
- package/dist/synthesis 2/conflict-detector.js +0 -125
- package/dist/synthesis 2/conflict-detector.js.map +0 -1
- package/dist/utils 2/monitoring.d.ts +0 -25
- package/dist/utils 2/monitoring.d.ts.map +0 -1
- package/dist/utils 2/monitoring.js +0 -41
- package/dist/utils 2/monitoring.js.map +0 -1
- package/dist/utils 2/rate-limiter.d.ts +0 -97
- package/dist/utils 2/rate-limiter.d.ts.map +0 -1
- package/dist/utils 2/rate-limiter.js +0 -166
- package/dist/utils 2/rate-limiter.js.map +0 -1
- package/dist/utils 2/validation.d.ts +0 -139
- package/dist/utils 2/validation.d.ts.map +0 -1
- package/dist/utils 2/validation.js +0 -195
- package/dist/utils 2/validation.js.map +0 -1
package/dist/cli 2.js
DELETED
|
@@ -1,583 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Vesper CLI
|
|
4
|
-
*
|
|
5
|
-
* Command-line interface for installing and managing Vesper
|
|
6
|
-
*/
|
|
7
|
-
import { execSync } from 'child_process';
|
|
8
|
-
import { existsSync, mkdirSync, writeFileSync, readFileSync, cpSync } from 'fs';
|
|
9
|
-
import { homedir } from 'os';
|
|
10
|
-
import { join, dirname } from 'path';
|
|
11
|
-
import { fileURLToPath } from 'url';
|
|
12
|
-
import { randomBytes } from 'crypto';
|
|
13
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
-
const __dirname = dirname(__filename);
|
|
15
|
-
// Installation directory
|
|
16
|
-
const INSTALL_DIR = process.env.VESPER_INSTALL_DIR || join(homedir(), '.vesper');
|
|
17
|
-
// Colors for terminal output
|
|
18
|
-
const colors = {
|
|
19
|
-
reset: '\x1b[0m',
|
|
20
|
-
bright: '\x1b[1m',
|
|
21
|
-
green: '\x1b[32m',
|
|
22
|
-
blue: '\x1b[34m',
|
|
23
|
-
yellow: '\x1b[33m',
|
|
24
|
-
red: '\x1b[31m',
|
|
25
|
-
cyan: '\x1b[36m',
|
|
26
|
-
};
|
|
27
|
-
function log(message, color = colors.reset) {
|
|
28
|
-
console.log(`${color}${message}${colors.reset}`);
|
|
29
|
-
}
|
|
30
|
-
function header(message) {
|
|
31
|
-
log(`\n${message}`, colors.bright + colors.cyan);
|
|
32
|
-
}
|
|
33
|
-
function success(message) {
|
|
34
|
-
log(`✅ ${message}`, colors.green);
|
|
35
|
-
}
|
|
36
|
-
function error(message) {
|
|
37
|
-
log(`❌ ${message}`, colors.red);
|
|
38
|
-
}
|
|
39
|
-
function warning(message) {
|
|
40
|
-
log(`⚠️ ${message}`, colors.yellow);
|
|
41
|
-
}
|
|
42
|
-
function info(message) {
|
|
43
|
-
log(`ℹ️ ${message}`, colors.blue);
|
|
44
|
-
}
|
|
45
|
-
// Generate secure random password
|
|
46
|
-
function generatePassword() {
|
|
47
|
-
return randomBytes(32).toString('base64');
|
|
48
|
-
}
|
|
49
|
-
// Check if Docker is running
|
|
50
|
-
function checkDocker() {
|
|
51
|
-
try {
|
|
52
|
-
execSync('docker info', { stdio: 'ignore' });
|
|
53
|
-
return true;
|
|
54
|
-
}
|
|
55
|
-
catch {
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
// Install Vesper
|
|
60
|
-
async function install() {
|
|
61
|
-
header('🌟 Installing Vesper - AI Memory System for Claude Code');
|
|
62
|
-
// Check prerequisites
|
|
63
|
-
info('Checking prerequisites...');
|
|
64
|
-
try {
|
|
65
|
-
execSync('node --version', { stdio: 'ignore' });
|
|
66
|
-
success('Node.js found');
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
error('Node.js 20+ required. Install from https://nodejs.org');
|
|
70
|
-
process.exit(1);
|
|
71
|
-
}
|
|
72
|
-
if (!checkDocker()) {
|
|
73
|
-
error('Docker not running. Please start Docker Desktop');
|
|
74
|
-
process.exit(1);
|
|
75
|
-
}
|
|
76
|
-
success('Docker found');
|
|
77
|
-
// Create installation directory
|
|
78
|
-
info(`Installing to ${INSTALL_DIR}...`);
|
|
79
|
-
if (existsSync(INSTALL_DIR)) {
|
|
80
|
-
warning(`Directory ${INSTALL_DIR} already exists`);
|
|
81
|
-
info('Updating existing installation...');
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
mkdirSync(INSTALL_DIR, { recursive: true });
|
|
85
|
-
}
|
|
86
|
-
// Copy files from npm package to install directory
|
|
87
|
-
const packageRoot = join(__dirname, '..');
|
|
88
|
-
info('Copying files...');
|
|
89
|
-
const filesToCopy = [
|
|
90
|
-
'dist',
|
|
91
|
-
'config',
|
|
92
|
-
'embedding-service',
|
|
93
|
-
'scripts',
|
|
94
|
-
'docker-compose.yml',
|
|
95
|
-
'.env.example',
|
|
96
|
-
'package.json',
|
|
97
|
-
];
|
|
98
|
-
for (const file of filesToCopy) {
|
|
99
|
-
const src = join(packageRoot, file);
|
|
100
|
-
const dest = join(INSTALL_DIR, file);
|
|
101
|
-
if (existsSync(src)) {
|
|
102
|
-
cpSync(src, dest, { recursive: true });
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
success('Files copied');
|
|
106
|
-
// Create .env if it doesn't exist
|
|
107
|
-
const envFile = join(INSTALL_DIR, '.env');
|
|
108
|
-
if (!existsSync(envFile)) {
|
|
109
|
-
info('Creating .env configuration...');
|
|
110
|
-
cpSync(join(INSTALL_DIR, '.env.example'), envFile);
|
|
111
|
-
success('.env created');
|
|
112
|
-
}
|
|
113
|
-
// Install dependencies in install directory
|
|
114
|
-
info('Installing dependencies...');
|
|
115
|
-
try {
|
|
116
|
-
execSync('npm install --production --silent', {
|
|
117
|
-
cwd: INSTALL_DIR,
|
|
118
|
-
stdio: 'inherit',
|
|
119
|
-
});
|
|
120
|
-
success('Dependencies installed');
|
|
121
|
-
}
|
|
122
|
-
catch (err) {
|
|
123
|
-
error('Failed to install dependencies');
|
|
124
|
-
throw err;
|
|
125
|
-
}
|
|
126
|
-
// Start Docker services
|
|
127
|
-
info('Starting infrastructure services...');
|
|
128
|
-
try {
|
|
129
|
-
execSync('docker-compose up -d redis qdrant embedding', {
|
|
130
|
-
cwd: INSTALL_DIR,
|
|
131
|
-
stdio: 'inherit',
|
|
132
|
-
});
|
|
133
|
-
success('Services started');
|
|
134
|
-
}
|
|
135
|
-
catch (err) {
|
|
136
|
-
error('Failed to start services');
|
|
137
|
-
throw err;
|
|
138
|
-
}
|
|
139
|
-
// Wait for services
|
|
140
|
-
info('Waiting for services to be ready...');
|
|
141
|
-
await new Promise(resolve => setTimeout(resolve, 10000));
|
|
142
|
-
// Configure MCP using the official claude CLI
|
|
143
|
-
info('Configuring Claude Code MCP integration...');
|
|
144
|
-
// Check if claude CLI is available
|
|
145
|
-
try {
|
|
146
|
-
execSync('claude --version', { stdio: 'ignore' });
|
|
147
|
-
}
|
|
148
|
-
catch {
|
|
149
|
-
error('Claude Code CLI not found in PATH');
|
|
150
|
-
error('Please install Claude Code from: https://claude.ai/download');
|
|
151
|
-
throw new Error('Claude CLI not found');
|
|
152
|
-
}
|
|
153
|
-
// Remove old MCP server if it exists (to ensure clean install)
|
|
154
|
-
try {
|
|
155
|
-
execSync('claude mcp remove vesper', { stdio: 'ignore' });
|
|
156
|
-
}
|
|
157
|
-
catch {
|
|
158
|
-
// Ignore errors if server doesn't exist
|
|
159
|
-
}
|
|
160
|
-
// Add Vesper using the proper claude mcp add command
|
|
161
|
-
const serverPath = join(INSTALL_DIR, 'dist', 'server.js');
|
|
162
|
-
try {
|
|
163
|
-
execSync(`claude mcp add vesper --transport stdio --scope user -e NODE_ENV=production -- node "${serverPath}"`, { stdio: 'inherit' });
|
|
164
|
-
success('MCP server configured successfully');
|
|
165
|
-
}
|
|
166
|
-
catch (err) {
|
|
167
|
-
error('Failed to configure Vesper MCP server');
|
|
168
|
-
error(`You can manually configure it later with:`);
|
|
169
|
-
error(`claude mcp add vesper --transport stdio --scope user -e NODE_ENV=production -- node "${serverPath}"`);
|
|
170
|
-
throw err;
|
|
171
|
-
}
|
|
172
|
-
// Configure startup hook (optional - ensures Docker services are running)
|
|
173
|
-
info('Configuring startup hook...');
|
|
174
|
-
const settingsPath = join(homedir(), '.claude', 'settings.json');
|
|
175
|
-
let settings = { hooks: {} };
|
|
176
|
-
if (existsSync(settingsPath)) {
|
|
177
|
-
try {
|
|
178
|
-
settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));
|
|
179
|
-
}
|
|
180
|
-
catch (err) {
|
|
181
|
-
warning('Could not parse settings.json, creating new one');
|
|
182
|
-
settings = { hooks: {} };
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
// Ensure hooks structure exists
|
|
186
|
-
settings.hooks = settings.hooks || {};
|
|
187
|
-
settings.hooks.SessionStart = settings.hooks.SessionStart || [];
|
|
188
|
-
// Add or update Vesper startup hook (just for Docker services)
|
|
189
|
-
const hookScript = join(INSTALL_DIR, 'scripts', 'ensure-infrastructure.sh');
|
|
190
|
-
const vesperHook = {
|
|
191
|
-
description: 'Ensure Vesper memory infrastructure is running',
|
|
192
|
-
hooks: [{
|
|
193
|
-
type: 'command',
|
|
194
|
-
command: `if [ -f ${hookScript} ]; then ${hookScript} 2>&1; fi`,
|
|
195
|
-
continueOnError: true
|
|
196
|
-
}]
|
|
197
|
-
};
|
|
198
|
-
// Remove any existing Vesper hooks and add new one
|
|
199
|
-
settings.hooks.SessionStart = settings.hooks.SessionStart.filter((h) => !h.description?.includes('Vesper') && !h.description?.includes('memory infrastructure'));
|
|
200
|
-
settings.hooks.SessionStart.push(vesperHook);
|
|
201
|
-
// Ensure directory exists
|
|
202
|
-
mkdirSync(dirname(settingsPath), { recursive: true });
|
|
203
|
-
writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
|
|
204
|
-
success('Startup hook configured');
|
|
205
|
-
info('Note: Permissions are handled automatically by claude mcp add');
|
|
206
|
-
// Success message
|
|
207
|
-
header('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
208
|
-
success('✨ Vesper installation complete!');
|
|
209
|
-
header('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
210
|
-
log('\n🎯 Next steps:', colors.bright);
|
|
211
|
-
log(' 1. Restart Claude Code to load Vesper');
|
|
212
|
-
log(' 2. Ask Claude: "What MCP servers are available?"');
|
|
213
|
-
log(' 3. Test it: "Store a memory: I love TypeScript"');
|
|
214
|
-
log('\n📖 Documentation:', colors.bright);
|
|
215
|
-
log(` • Installation: ${INSTALL_DIR}`);
|
|
216
|
-
log(` • View config: claude mcp get vesper`);
|
|
217
|
-
log(` • Logs: cd ${INSTALL_DIR} && docker-compose logs`);
|
|
218
|
-
log('\n💡 Tip: Ask Claude to "store a memory" to test!\n');
|
|
219
|
-
}
|
|
220
|
-
// Uninstall Vesper
|
|
221
|
-
async function uninstall() {
|
|
222
|
-
header('🗑️ Uninstalling Vesper');
|
|
223
|
-
if (!existsSync(INSTALL_DIR)) {
|
|
224
|
-
warning('Vesper not installed');
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
// Stop services
|
|
228
|
-
info('Stopping services...');
|
|
229
|
-
try {
|
|
230
|
-
execSync('docker-compose down -v', {
|
|
231
|
-
cwd: INSTALL_DIR,
|
|
232
|
-
stdio: 'inherit',
|
|
233
|
-
});
|
|
234
|
-
success('Services stopped');
|
|
235
|
-
}
|
|
236
|
-
catch {
|
|
237
|
-
warning('Could not stop services (may not be running)');
|
|
238
|
-
}
|
|
239
|
-
// Remove from MCP config using claude CLI
|
|
240
|
-
info('Removing from MCP config...');
|
|
241
|
-
try {
|
|
242
|
-
execSync('claude mcp remove vesper', { stdio: 'inherit' });
|
|
243
|
-
success('Removed from MCP config');
|
|
244
|
-
}
|
|
245
|
-
catch {
|
|
246
|
-
warning('Could not remove from MCP config (may not be configured)');
|
|
247
|
-
}
|
|
248
|
-
// Remove startup hook
|
|
249
|
-
const settingsPath = join(homedir(), '.claude', 'settings.json');
|
|
250
|
-
if (existsSync(settingsPath)) {
|
|
251
|
-
info('Removing startup hook...');
|
|
252
|
-
try {
|
|
253
|
-
const settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));
|
|
254
|
-
if (settings.hooks?.SessionStart) {
|
|
255
|
-
settings.hooks.SessionStart = settings.hooks.SessionStart.filter((h) => !h.description?.includes('Vesper') && !h.description?.includes('memory infrastructure'));
|
|
256
|
-
writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
|
|
257
|
-
success('Startup hook removed');
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
catch (err) {
|
|
261
|
-
warning('Could not update settings.json');
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
// Remove installation directory
|
|
265
|
-
info('Removing files...');
|
|
266
|
-
execSync(`rm -rf "${INSTALL_DIR}"`, { stdio: 'inherit' });
|
|
267
|
-
success('Files removed');
|
|
268
|
-
log('\n✅ Vesper uninstalled successfully\n');
|
|
269
|
-
info('Restart Claude Code to complete removal');
|
|
270
|
-
}
|
|
271
|
-
// Load environment variables from .env file
|
|
272
|
-
// If .env doesn't exist, create it from .env.example with secure generated passwords
|
|
273
|
-
function loadEnvFile(packageRoot) {
|
|
274
|
-
const envPath = join(packageRoot, '.env');
|
|
275
|
-
const envExamplePath = join(packageRoot, '.env.example');
|
|
276
|
-
let envContent;
|
|
277
|
-
let shouldGeneratePasswords = false;
|
|
278
|
-
if (!existsSync(envPath)) {
|
|
279
|
-
if (existsSync(envExamplePath)) {
|
|
280
|
-
info('Creating .env from .env.example...');
|
|
281
|
-
envContent = readFileSync(envExamplePath, 'utf-8');
|
|
282
|
-
shouldGeneratePasswords = true;
|
|
283
|
-
}
|
|
284
|
-
else {
|
|
285
|
-
warning('.env and .env.example not found, using default values');
|
|
286
|
-
return {};
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
envContent = readFileSync(envPath, 'utf-8');
|
|
291
|
-
}
|
|
292
|
-
const env = {};
|
|
293
|
-
// Parse environment variables
|
|
294
|
-
for (const line of envContent.split('\n')) {
|
|
295
|
-
const trimmed = line.trim();
|
|
296
|
-
if (trimmed && !trimmed.startsWith('#')) {
|
|
297
|
-
const match = trimmed.match(/^([^=]+)=(.*)$/);
|
|
298
|
-
if (match) {
|
|
299
|
-
const [, key, value] = match;
|
|
300
|
-
env[key.trim()] = value.trim();
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
// Generate secure passwords if creating new .env
|
|
305
|
-
if (shouldGeneratePasswords) {
|
|
306
|
-
info('Generating secure passwords...');
|
|
307
|
-
const redisPassword = generatePassword();
|
|
308
|
-
const qdrantKey = generatePassword();
|
|
309
|
-
const postgresPassword = generatePassword();
|
|
310
|
-
// Replace placeholder passwords in content
|
|
311
|
-
envContent = envContent.replace(/REDIS_PASSWORD=.*/, `REDIS_PASSWORD=${redisPassword}`);
|
|
312
|
-
envContent = envContent.replace(/QDRANT_API_KEY=.*/, `QDRANT_API_KEY=${qdrantKey}`);
|
|
313
|
-
envContent = envContent.replace(/POSTGRES_PASSWORD=.*/, `POSTGRES_PASSWORD=${postgresPassword}`);
|
|
314
|
-
// Write new .env file
|
|
315
|
-
writeFileSync(envPath, envContent);
|
|
316
|
-
success('.env created with secure passwords');
|
|
317
|
-
// Update env object with generated passwords
|
|
318
|
-
env.REDIS_PASSWORD = redisPassword;
|
|
319
|
-
env.QDRANT_API_KEY = qdrantKey;
|
|
320
|
-
env.POSTGRES_PASSWORD = postgresPassword;
|
|
321
|
-
}
|
|
322
|
-
return env;
|
|
323
|
-
}
|
|
324
|
-
// Configure MCP only (no Docker services)
|
|
325
|
-
async function configure() {
|
|
326
|
-
header('⚙️ Configuring Vesper MCP Server');
|
|
327
|
-
// Determine package location (could be in node_modules or ~/.vesper)
|
|
328
|
-
const packageRoot = dirname(dirname(__filename));
|
|
329
|
-
const serverPath = join(packageRoot, 'dist', 'server.js');
|
|
330
|
-
if (!existsSync(serverPath)) {
|
|
331
|
-
error(`Server not found at ${serverPath}`);
|
|
332
|
-
error('Run "npm run build" first');
|
|
333
|
-
process.exit(1);
|
|
334
|
-
}
|
|
335
|
-
info('Loading environment configuration...');
|
|
336
|
-
const envVars = loadEnvFile(packageRoot);
|
|
337
|
-
// Resolve SQLite DB path relative to package root
|
|
338
|
-
const sqliteDb = envVars.SQLITE_DB || './data/memory.db';
|
|
339
|
-
const absoluteSqliteDb = sqliteDb.startsWith('/')
|
|
340
|
-
? sqliteDb
|
|
341
|
-
: join(packageRoot, sqliteDb);
|
|
342
|
-
info('Configuring Claude Code MCP integration...');
|
|
343
|
-
// Check if claude CLI is available
|
|
344
|
-
try {
|
|
345
|
-
execSync('claude --version', { stdio: 'ignore' });
|
|
346
|
-
}
|
|
347
|
-
catch {
|
|
348
|
-
error('Claude Code CLI not found in PATH');
|
|
349
|
-
error('Please install Claude Code from: https://claude.ai/download');
|
|
350
|
-
throw new Error('Claude CLI not found');
|
|
351
|
-
}
|
|
352
|
-
// Remove old MCP server if it exists (to ensure clean install)
|
|
353
|
-
try {
|
|
354
|
-
execSync('claude mcp remove vesper', { stdio: 'ignore' });
|
|
355
|
-
}
|
|
356
|
-
catch {
|
|
357
|
-
// Ignore errors if server doesn't exist
|
|
358
|
-
}
|
|
359
|
-
// Build environment variable flags (use -e for each variable)
|
|
360
|
-
const envFlags = [
|
|
361
|
-
// Connection settings
|
|
362
|
-
`-e REDIS_HOST=${envVars.REDIS_HOST || 'localhost'}`,
|
|
363
|
-
`-e REDIS_PORT=${envVars.REDIS_PORT || '6379'}`,
|
|
364
|
-
`-e QDRANT_URL=${envVars.QDRANT_URL || 'http://localhost:6333'}`,
|
|
365
|
-
`-e SQLITE_DB=${absoluteSqliteDb}`,
|
|
366
|
-
`-e EMBEDDING_SERVICE_URL=${envVars.EMBEDDING_SERVICE_URL || 'http://localhost:8000'}`,
|
|
367
|
-
// PostgreSQL (optional, for auth)
|
|
368
|
-
`-e POSTGRES_HOST=${envVars.POSTGRES_HOST || 'localhost'}`,
|
|
369
|
-
`-e POSTGRES_PORT=${envVars.POSTGRES_PORT || '5432'}`,
|
|
370
|
-
`-e POSTGRES_DB=${envVars.POSTGRES_DB || 'memory'}`,
|
|
371
|
-
`-e POSTGRES_USER=${envVars.POSTGRES_USER || 'postgres'}`,
|
|
372
|
-
// Application settings
|
|
373
|
-
`-e NODE_ENV=${envVars.NODE_ENV || 'production'}`,
|
|
374
|
-
`-e LOG_LEVEL=${envVars.LOG_LEVEL || 'info'}`,
|
|
375
|
-
// Authentication (optional)
|
|
376
|
-
`-e AUTH_ENABLED=${envVars.AUTH_ENABLED || 'false'}`,
|
|
377
|
-
`-e MCP_API_KEY_TIER=${envVars.MCP_API_KEY_TIER || 'standard'}`,
|
|
378
|
-
`-e MCP_API_KEY_SCOPES=${envVars.MCP_API_KEY_SCOPES || '*'}`,
|
|
379
|
-
// Rate limiting
|
|
380
|
-
`-e RATE_LIMIT_DEFAULT_TIER=${envVars.RATE_LIMIT_DEFAULT_TIER || 'standard'}`,
|
|
381
|
-
`-e RATE_LIMIT_FAIL_OPEN=${envVars.RATE_LIMIT_FAIL_OPEN || 'false'}`,
|
|
382
|
-
];
|
|
383
|
-
// Add password environment variables only if they're set (don't expose empty passwords)
|
|
384
|
-
if (envVars.REDIS_PASSWORD) {
|
|
385
|
-
envFlags.push(`-e REDIS_PASSWORD=${envVars.REDIS_PASSWORD}`);
|
|
386
|
-
}
|
|
387
|
-
if (envVars.QDRANT_API_KEY) {
|
|
388
|
-
envFlags.push(`-e QDRANT_API_KEY=${envVars.QDRANT_API_KEY}`);
|
|
389
|
-
}
|
|
390
|
-
if (envVars.POSTGRES_PASSWORD) {
|
|
391
|
-
envFlags.push(`-e POSTGRES_PASSWORD=${envVars.POSTGRES_PASSWORD}`);
|
|
392
|
-
}
|
|
393
|
-
if (envVars.MCP_API_KEY_HASH) {
|
|
394
|
-
envFlags.push(`-e MCP_API_KEY_HASH=${envVars.MCP_API_KEY_HASH}`);
|
|
395
|
-
}
|
|
396
|
-
if (envVars.MCP_API_KEY_USER_ID) {
|
|
397
|
-
envFlags.push(`-e MCP_API_KEY_USER_ID=${envVars.MCP_API_KEY_USER_ID}`);
|
|
398
|
-
}
|
|
399
|
-
// Add Vesper using the proper claude mcp add command
|
|
400
|
-
// Note: server name must come FIRST, then options
|
|
401
|
-
const command = `claude mcp add vesper --transport stdio --scope user ${envFlags.join(' ')} -- node "${serverPath}"`;
|
|
402
|
-
try {
|
|
403
|
-
execSync(command, { stdio: 'inherit' });
|
|
404
|
-
success('MCP server configured successfully');
|
|
405
|
-
}
|
|
406
|
-
catch (err) {
|
|
407
|
-
error('Failed to configure Vesper MCP server');
|
|
408
|
-
error(`You can manually configure it later with:`);
|
|
409
|
-
error(command);
|
|
410
|
-
throw err;
|
|
411
|
-
}
|
|
412
|
-
log(`\n📍 Server path: ${serverPath}`);
|
|
413
|
-
log(`📁 Package root: ${packageRoot}`);
|
|
414
|
-
info('Permissions are handled automatically by claude mcp add');
|
|
415
|
-
success('✨ Vesper MCP server configured!');
|
|
416
|
-
log('\n🎯 Next steps:', colors.bright);
|
|
417
|
-
log(' 1. Ensure Docker services are running:');
|
|
418
|
-
log(` cd ${packageRoot} && docker-compose up -d`);
|
|
419
|
-
log(' 2. Restart Claude Code to load Vesper');
|
|
420
|
-
log(' 3. Test: Ask Claude "What MCP servers are available?"\n');
|
|
421
|
-
}
|
|
422
|
-
// Enable Vesper
|
|
423
|
-
async function enableVesper() {
|
|
424
|
-
header('✅ Enabling Vesper Memory System');
|
|
425
|
-
if (!existsSync(INSTALL_DIR)) {
|
|
426
|
-
error('Vesper not installed');
|
|
427
|
-
log('\nRun: vesper install');
|
|
428
|
-
return;
|
|
429
|
-
}
|
|
430
|
-
// Re-run configure to enable (this will add the MCP server)
|
|
431
|
-
info('Reconfiguring Vesper to enable...');
|
|
432
|
-
await configure();
|
|
433
|
-
log('\n💡 Restart Claude Code for changes to take effect\n');
|
|
434
|
-
}
|
|
435
|
-
// Disable Vesper
|
|
436
|
-
async function disableVesper() {
|
|
437
|
-
header('⏸️ Disabling Vesper Memory System');
|
|
438
|
-
// Remove the MCP server to disable it
|
|
439
|
-
info('Removing Vesper MCP server...');
|
|
440
|
-
try {
|
|
441
|
-
execSync('claude mcp remove vesper', { stdio: 'inherit' });
|
|
442
|
-
success('Vesper memory system disabled');
|
|
443
|
-
}
|
|
444
|
-
catch {
|
|
445
|
-
warning('Vesper not configured or already disabled');
|
|
446
|
-
}
|
|
447
|
-
log('\n📊 Useful for benchmarking or debugging');
|
|
448
|
-
log('💡 Run "vesper enable" to re-enable');
|
|
449
|
-
log('💡 Restart Claude Code for changes to take effect\n');
|
|
450
|
-
}
|
|
451
|
-
// Show status
|
|
452
|
-
function status() {
|
|
453
|
-
header('📊 Vesper Status');
|
|
454
|
-
// Check installation
|
|
455
|
-
log(`\n📁 Installation: ${INSTALL_DIR}`);
|
|
456
|
-
if (existsSync(INSTALL_DIR)) {
|
|
457
|
-
success('Installed');
|
|
458
|
-
}
|
|
459
|
-
else {
|
|
460
|
-
error('Not installed');
|
|
461
|
-
log('\nRun: vesper install');
|
|
462
|
-
return;
|
|
463
|
-
}
|
|
464
|
-
// Check MCP config using claude CLI
|
|
465
|
-
log('\n🤖 MCP Configuration:');
|
|
466
|
-
try {
|
|
467
|
-
const output = execSync('claude mcp get vesper', { encoding: 'utf-8', stdio: 'pipe' });
|
|
468
|
-
if (output.includes('"vesper"') || output.toLowerCase().includes('vesper')) {
|
|
469
|
-
success('Configured in Claude Code ✅');
|
|
470
|
-
success('Memory system: ENABLED');
|
|
471
|
-
}
|
|
472
|
-
else {
|
|
473
|
-
warning('Not configured in Claude Code');
|
|
474
|
-
log(' Run "vesper configure" to set up');
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
catch {
|
|
478
|
-
warning('Not configured in Claude Code');
|
|
479
|
-
log(' Run "vesper configure" to set up');
|
|
480
|
-
}
|
|
481
|
-
// Check services
|
|
482
|
-
log('\n🐳 Docker Services:');
|
|
483
|
-
if (checkDocker()) {
|
|
484
|
-
try {
|
|
485
|
-
const output = execSync('docker-compose ps --format json', {
|
|
486
|
-
cwd: INSTALL_DIR,
|
|
487
|
-
encoding: 'utf-8',
|
|
488
|
-
});
|
|
489
|
-
const services = output.trim().split('\n').filter(Boolean).map(line => JSON.parse(line));
|
|
490
|
-
for (const service of services) {
|
|
491
|
-
if (service.State === 'running') {
|
|
492
|
-
success(`${service.Service}: running`);
|
|
493
|
-
}
|
|
494
|
-
else {
|
|
495
|
-
warning(`${service.Service}: ${service.State}`);
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
catch {
|
|
500
|
-
warning('Could not check service status');
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
else {
|
|
504
|
-
error('Docker not running');
|
|
505
|
-
}
|
|
506
|
-
log('');
|
|
507
|
-
}
|
|
508
|
-
// Main CLI
|
|
509
|
-
const command = process.argv[2];
|
|
510
|
-
switch (command) {
|
|
511
|
-
case 'install':
|
|
512
|
-
install().catch((err) => {
|
|
513
|
-
error(`Installation failed: ${err.message}`);
|
|
514
|
-
process.exit(1);
|
|
515
|
-
});
|
|
516
|
-
break;
|
|
517
|
-
case 'uninstall':
|
|
518
|
-
uninstall().catch((err) => {
|
|
519
|
-
error(`Uninstallation failed: ${err.message}`);
|
|
520
|
-
process.exit(1);
|
|
521
|
-
});
|
|
522
|
-
break;
|
|
523
|
-
case 'configure':
|
|
524
|
-
configure().catch((err) => {
|
|
525
|
-
error(`Configuration failed: ${err.message}`);
|
|
526
|
-
process.exit(1);
|
|
527
|
-
});
|
|
528
|
-
break;
|
|
529
|
-
case 'status':
|
|
530
|
-
status();
|
|
531
|
-
break;
|
|
532
|
-
case 'enable':
|
|
533
|
-
enableVesper().catch((err) => {
|
|
534
|
-
error(`Enable failed: ${err.message}`);
|
|
535
|
-
process.exit(1);
|
|
536
|
-
});
|
|
537
|
-
break;
|
|
538
|
-
case 'disable':
|
|
539
|
-
disableVesper().catch((err) => {
|
|
540
|
-
error(`Disable failed: ${err.message}`);
|
|
541
|
-
process.exit(1);
|
|
542
|
-
});
|
|
543
|
-
break;
|
|
544
|
-
case 'help':
|
|
545
|
-
case '--help':
|
|
546
|
-
case '-h':
|
|
547
|
-
case undefined:
|
|
548
|
-
log(`
|
|
549
|
-
${colors.bright}Vesper - AI Memory System for Claude Code${colors.reset}
|
|
550
|
-
|
|
551
|
-
${colors.bright}USAGE:${colors.reset}
|
|
552
|
-
vesper <command>
|
|
553
|
-
|
|
554
|
-
${colors.bright}COMMANDS:${colors.reset}
|
|
555
|
-
install Install Vesper and configure Claude Code (full setup)
|
|
556
|
-
configure Configure MCP server only (no Docker setup)
|
|
557
|
-
uninstall Remove Vesper completely
|
|
558
|
-
status Show installation and service status
|
|
559
|
-
enable Enable Vesper memory system
|
|
560
|
-
disable Disable Vesper memory system (pass-through mode)
|
|
561
|
-
help Show this help message
|
|
562
|
-
|
|
563
|
-
${colors.bright}EXAMPLES:${colors.reset}
|
|
564
|
-
vesper install # Full installation with Docker setup
|
|
565
|
-
vesper configure # Configure MCP only (lightweight)
|
|
566
|
-
vesper status # Check if running
|
|
567
|
-
vesper enable # Enable memory system
|
|
568
|
-
vesper disable # Disable for benchmarking
|
|
569
|
-
vesper uninstall # Remove Vesper
|
|
570
|
-
|
|
571
|
-
${colors.bright}DOCUMENTATION:${colors.reset}
|
|
572
|
-
https://github.com/fitz2882/vesper
|
|
573
|
-
|
|
574
|
-
${colors.bright}SUPPORT:${colors.reset}
|
|
575
|
-
https://github.com/fitz2882/vesper/issues
|
|
576
|
-
`);
|
|
577
|
-
break;
|
|
578
|
-
default:
|
|
579
|
-
error(`Unknown command: ${command}`);
|
|
580
|
-
log('Run "vesper help" for usage');
|
|
581
|
-
process.exit(1);
|
|
582
|
-
}
|
|
583
|
-
//# sourceMappingURL=cli.js.map
|
package/dist/cli.d 2.ts
DELETED
package/dist/cli.d.ts 2.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;GAIG"}
|
package/dist/cli.js 2.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|