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.
Files changed (3) hide show
  1. package/README.md +4 -6
  2. package/package.json +2 -4
  3. 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. Collects optional credentials (HuggingFace, Kaggle, Nia) stored locally, never leaves your machine
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**: All credentials stored in `~/.vesper/config.toml`
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 tokens exposed**: Kaggle key input is masked
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
- hf_token = "hf_..."
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.1",
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: Credential collection ─────────────────────────
214
- console.log(`\n ${dim('[')}${cyan('3/6')}${dim(']')} ${bold('Credentials')} ${dim('(all optional — press Enter to skip)')}\n`);
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
- if (saved.length > 0) {
264
- console.log(`\n ${green('')} Stored locally: ${saved.join(', ')}`);
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.')} Stored credentials in local keyring
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('All routing is automatic. Agents call ONE set of')}
363
- ${dim('tools and Vesper handles source resolution.')}
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