vesper-wizard 2.0.1 → 2.0.2
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 +4 -6
- package/package.json +2 -4
- package/wizard.js +8 -78
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ npx vesper-wizard@latest
|
|
|
11
11
|
That's it. The wizard handles everything:
|
|
12
12
|
|
|
13
13
|
1. Creates `~/.vesper/` directories and local API key
|
|
14
|
-
2.
|
|
14
|
+
2. Initializes a local credentials vault in unified-key mode (no external API keys required)
|
|
15
15
|
3. Installs `@vespermcp/mcp-server` and auto-configures MCP for all detected agents (Claude, Cursor, VS Code, Codex, Gemini CLI)
|
|
16
16
|
4. Verifies the installation
|
|
17
17
|
|
|
@@ -31,10 +31,10 @@ After the wizard finishes, your AI assistant can immediately use Vesper tools:
|
|
|
31
31
|
|
|
32
32
|
## Security
|
|
33
33
|
|
|
34
|
-
- **Local-only**:
|
|
34
|
+
- **Local-only**: Uses one local key in `~/.vesper/config.toml`
|
|
35
35
|
- **Keyring-backed**: Uses OS keyring when available, falls back to local TOML
|
|
36
36
|
- **No cloud**: Zero external API calls during setup
|
|
37
|
-
- **No
|
|
37
|
+
- **No external keys**: No HuggingFace/Kaggle/Nia key prompts during setup
|
|
38
38
|
|
|
39
39
|
## Config file
|
|
40
40
|
|
|
@@ -42,9 +42,7 @@ The wizard generates `~/.vesper/config.toml`:
|
|
|
42
42
|
|
|
43
43
|
```toml
|
|
44
44
|
api_key = "vesper_sk_local_..."
|
|
45
|
-
|
|
46
|
-
kaggle_username = "your_username"
|
|
47
|
-
kaggle_key = "..."
|
|
45
|
+
auth_mode = "local_unified"
|
|
48
46
|
```
|
|
49
47
|
|
|
50
48
|
## Post-setup
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vesper-wizard",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"description": "Zero-friction setup wizard for Vesper — local MCP server, unified dataset API, and agent auto-config in 60 seconds",
|
|
5
5
|
"bin": {
|
|
6
6
|
"vesper-wizard": "wizard.js"
|
|
@@ -25,7 +25,5 @@
|
|
|
25
25
|
"engines": {
|
|
26
26
|
"node": ">=18.0.0"
|
|
27
27
|
},
|
|
28
|
-
"dependencies": {
|
|
29
|
-
"inquirer": "^8.2.0"
|
|
30
|
-
}
|
|
28
|
+
"dependencies": {}
|
|
31
29
|
}
|
package/wizard.js
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
// Run: npx vesper-wizard@latest
|
|
6
6
|
// ─────────────────────────────────────────────────────────────
|
|
7
7
|
|
|
8
|
-
const inquirer = require('inquirer');
|
|
9
8
|
const fs = require('fs');
|
|
10
9
|
const path = require('path');
|
|
11
10
|
const os = require('os');
|
|
@@ -47,24 +46,6 @@ function writeToml(filePath, data) {
|
|
|
47
46
|
fs.writeFileSync(filePath, lines.join('\n') + '\n', 'utf8');
|
|
48
47
|
}
|
|
49
48
|
|
|
50
|
-
function upsertEnvValue(filePath, key, value) {
|
|
51
|
-
const line = `${key}=${value}`;
|
|
52
|
-
let content = '';
|
|
53
|
-
if (fs.existsSync(filePath)) {
|
|
54
|
-
content = fs.readFileSync(filePath, 'utf8');
|
|
55
|
-
const regex = new RegExp(`^${key}=.*$`, 'm');
|
|
56
|
-
if (regex.test(content)) {
|
|
57
|
-
content = content.replace(regex, line);
|
|
58
|
-
} else {
|
|
59
|
-
content = content.replace(/\n?$/, `\n${line}\n`);
|
|
60
|
-
}
|
|
61
|
-
} else {
|
|
62
|
-
ensureDir(path.dirname(filePath));
|
|
63
|
-
content = `${line}\n`;
|
|
64
|
-
}
|
|
65
|
-
fs.writeFileSync(filePath, content, 'utf8');
|
|
66
|
-
}
|
|
67
|
-
|
|
68
49
|
function dim(text) { return `\x1b[2m${text}\x1b[0m`; }
|
|
69
50
|
function bold(text) { return `\x1b[1m${text}\x1b[0m`; }
|
|
70
51
|
function green(text) { return `\x1b[32m${text}\x1b[0m`; }
|
|
@@ -210,63 +191,12 @@ async function main() {
|
|
|
210
191
|
console.log(` ${green('✓')}`);
|
|
211
192
|
console.log(` ${dim('Key:')} ${dim(localKey.slice(0, 20) + '...')} ${dim('→')} ${dim(CONFIG_TOML)}`);
|
|
212
193
|
|
|
213
|
-
// ─── Step 3:
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
const { hfToken, kaggleUsername, kaggleKey, niaApiKey } = await inquirer.prompt([
|
|
217
|
-
{
|
|
218
|
-
type: 'input',
|
|
219
|
-
name: 'hfToken',
|
|
220
|
-
message: ` ${dim('HuggingFace token')}`,
|
|
221
|
-
prefix: ' ',
|
|
222
|
-
},
|
|
223
|
-
{
|
|
224
|
-
type: 'input',
|
|
225
|
-
name: 'kaggleUsername',
|
|
226
|
-
message: ` ${dim('Kaggle username')}`,
|
|
227
|
-
prefix: ' ',
|
|
228
|
-
},
|
|
229
|
-
{
|
|
230
|
-
type: 'password',
|
|
231
|
-
name: 'kaggleKey',
|
|
232
|
-
message: ` ${dim('Kaggle API key')}`,
|
|
233
|
-
mask: '*',
|
|
234
|
-
prefix: ' ',
|
|
235
|
-
},
|
|
236
|
-
{
|
|
237
|
-
type: 'input',
|
|
238
|
-
name: 'niaApiKey',
|
|
239
|
-
message: ` ${dim('Nia API key (NIA_API_KEY)')}`,
|
|
240
|
-
prefix: ' ',
|
|
241
|
-
},
|
|
242
|
-
]);
|
|
243
|
-
|
|
244
|
-
// Save credentials to config.toml (local keyring)
|
|
245
|
-
const saved = [];
|
|
246
|
-
if (hfToken) { configData.hf_token = hfToken; saved.push('HuggingFace'); }
|
|
247
|
-
if (kaggleUsername) { configData.kaggle_username = kaggleUsername; saved.push('Kaggle user'); }
|
|
248
|
-
if (kaggleKey) { configData.kaggle_key = kaggleKey; saved.push('Kaggle key'); }
|
|
249
|
-
if (niaApiKey) {
|
|
250
|
-
configData.nia_api_key = niaApiKey;
|
|
251
|
-
saved.push('Nia');
|
|
252
|
-
|
|
253
|
-
// Also write to .env.local for Next.js apps
|
|
254
|
-
const rootEnv = path.join(process.cwd(), '.env.local');
|
|
255
|
-
upsertEnvValue(rootEnv, 'NIA_API_KEY', niaApiKey);
|
|
256
|
-
const landingDir = path.join(process.cwd(), 'landing');
|
|
257
|
-
if (fs.existsSync(landingDir) && fs.statSync(landingDir).isDirectory()) {
|
|
258
|
-
upsertEnvValue(path.join(landingDir, '.env.local'), 'NIA_API_KEY', niaApiKey);
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
|
|
194
|
+
// ─── Step 3: Local vault initialization ────────────────────
|
|
195
|
+
process.stdout.write(`\n ${dim('[')}${cyan('3/6')}${dim(']')} Initializing local credentials vault...`);
|
|
196
|
+
configData.auth_mode = configData.auth_mode || 'local_unified';
|
|
262
197
|
writeToml(CONFIG_TOML, configData);
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
console.log(` ${dim('Location:')} ${CONFIG_TOML}`);
|
|
266
|
-
console.log(` ${dim('Security: local keyring — never leaves this machine')}`);
|
|
267
|
-
} else {
|
|
268
|
-
console.log(`\n ${dim('No credentials added (core tools work without them)')}`);
|
|
269
|
-
}
|
|
198
|
+
console.log(` ${green('✓')}`);
|
|
199
|
+
console.log(` ${dim('Mode:')} ${dim('single local Vesper key (no external keys required)')}`);
|
|
270
200
|
|
|
271
201
|
// ─── Step 4: Install @vespermcp/mcp-server ─────────────────
|
|
272
202
|
console.log(`\n ${dim('[')}${cyan('4/6')}${dim(']')} Installing Vesper MCP server...`);
|
|
@@ -334,7 +264,7 @@ ${dim('════════════════════════
|
|
|
334
264
|
|
|
335
265
|
${bold('What just happened:')}
|
|
336
266
|
${dim('1.')} Generated a local API key (never leaves your machine)
|
|
337
|
-
${dim('2.')}
|
|
267
|
+
${dim('2.')} Initialized local credentials vault
|
|
338
268
|
${dim('3.')} Auto-configured MCP for ${configuredAgents.length > 0 ? configuredAgents.join(', ') : 'detected agents'}
|
|
339
269
|
${dim('4.')} Vesper server ready on stdio transport
|
|
340
270
|
|
|
@@ -359,8 +289,8 @@ ${dim('────────────────────────
|
|
|
359
289
|
${bold('Unified API — one interface, every source:')}
|
|
360
290
|
HuggingFace · Kaggle · OpenML · data.world
|
|
361
291
|
|
|
362
|
-
${dim('
|
|
363
|
-
${dim('
|
|
292
|
+
${dim('Agents call localhost Vesper APIs with one local key.')}
|
|
293
|
+
${dim('Vesper adapters handle provider routing internally.')}
|
|
364
294
|
|
|
365
295
|
${dim('─────────────────────────────────────────────────')}
|
|
366
296
|
|