wolbarg 0.5.5 → 0.5.6

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/CHANGELOG.md CHANGED
@@ -5,6 +5,20 @@ All notable changes to this project are documented here.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/).
7
7
 
8
+ ## [0.5.6] — 2026-07-24
9
+
10
+ ### Added
11
+
12
+ - **`wolbarg` CLI** with `wolbarg init` — interactive (or `--yes`) project setup for database + embedding provider
13
+ - Default SQLite path: `.wolbarg/shared-memory/memory.db`
14
+ - Provider presets (OpenAI, Ollama, OpenRouter, LM Studio, Gemini, Together, vLLM, custom) with **visible default base URLs** the user can edit
15
+ - Writes `.wolbarg/config.json` and optional `.wolbarg/.env` (API key); adds `.env` paths to `.gitignore`
16
+ - **`createWolbargFromProjectConfig()`** / `loadProjectConfig()` to boot the SDK from init output
17
+
18
+ ### Compatibility
19
+
20
+ - Additive. Existing programmatic `wolbarg({...})` usage unchanged.
21
+
8
22
  ## [0.5.5] — 2026-07-21
9
23
 
10
24
  ### Added
package/README.md CHANGED
@@ -15,9 +15,39 @@
15
15
  npm install wolbarg
16
16
  ```
17
17
 
18
+ ### Configure with the CLI (recommended)
19
+
20
+ ```bash
21
+ npx wolbarg init
22
+ ```
23
+
24
+ You will be prompted (all optional — Enter accepts defaults):
25
+
26
+ 1. **Database** — default `.wolbarg/shared-memory/memory.db` (or a Postgres URL)
27
+ 2. **Embedding provider** — OpenAI, Ollama, OpenRouter, LM Studio, Gemini, Together, vLLM, or custom
28
+ 3. **Base URL** — always shown with that provider’s default (edit or keep)
29
+ 4. **Model** — provider default pre-filled
30
+ 5. **API key** — written to `.wolbarg/.env` (not into config JSON)
31
+
32
+ Non-interactive:
33
+
34
+ ```bash
35
+ npx wolbarg init --yes --provider openai --api-key "$OPENAI_API_KEY"
36
+ npx wolbarg init --yes --skip-embedding
37
+ ```
38
+
39
+ Then in code:
40
+
41
+ ```ts
42
+ import { createWolbargFromProjectConfig } from "wolbarg";
43
+
44
+ const ctx = createWolbargFromProjectConfig();
45
+ await ctx.ready();
46
+ ```
47
+
18
48
  Wolbarg is **memory infrastructure**, not an agent framework. Agents call `remember()` / `recall()` (and optionally ingest, compress, subscribe, and link memories in a graph). You bring SQLite or PostgreSQL, any OpenAI-compatible embedding API, and optional peers for PDF/DOCX/OCR/Neo4j.
19
49
 
20
- **Current release: [v0.5.5](./CHANGELOG.md)** — comprehensive JSDoc for IDE hover docs across the SDK and adapters. Still includes official framework adapters (`@wolbarg/openai`, `@wolbarg/langchain`, `@wolbarg/llamaindex`, `@wolbarg/mastra`, `@wolbarg/vercel-ai`), experimental `rememberFromMessages()`, 0.5 graph memory (SQLite + Neo4j), `includeGraph` recall, and [Wolbarg Studio](https://wolbarg.com/docs/observability).
50
+ **Current release: [v0.5.6](./CHANGELOG.md)** — `wolbarg init` CLI + project config loader. Still includes official framework adapters (`@wolbarg/openai`, `@wolbarg/langchain`, `@wolbarg/llamaindex`, `@wolbarg/mastra`, `@wolbarg/vercel-ai`), experimental `rememberFromMessages()`, 0.5 graph memory (SQLite + Neo4j), `includeGraph` recall, and [Wolbarg Studio](https://wolbarg.com/docs/observability).
21
51
 
22
52
  ---
23
53
 
package/dist/cli.js ADDED
@@ -0,0 +1,515 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync, mkdirSync, writeFileSync, readFileSync } from "node:fs";
3
+ import { isAbsolute, resolve, dirname, join } from "node:path";
4
+ import * as readline from "node:readline/promises";
5
+ import { stdout, stdin } from 'process';
6
+
7
+ // src/version.ts
8
+ var SDK_VERSION = "0.5.6";
9
+
10
+ // src/config/providers.ts
11
+ var EMBEDDING_PROVIDER_PRESETS = [
12
+ {
13
+ id: "openai",
14
+ label: "OpenAI",
15
+ defaultBaseUrl: "https://api.openai.com/v1",
16
+ defaultModel: "text-embedding-3-small",
17
+ apiKeyEnv: "OPENAI_API_KEY"
18
+ },
19
+ {
20
+ id: "ollama",
21
+ label: "Ollama (local)",
22
+ defaultBaseUrl: "http://127.0.0.1:11434/v1",
23
+ defaultModel: "nomic-embed-text",
24
+ apiKeyEnv: "OLLAMA_API_KEY",
25
+ apiKeyHint: "Any non-empty value works locally (e.g. ollama)"
26
+ },
27
+ {
28
+ id: "openrouter",
29
+ label: "OpenRouter",
30
+ defaultBaseUrl: "https://openrouter.ai/api/v1",
31
+ defaultModel: "openai/text-embedding-3-small",
32
+ apiKeyEnv: "OPENROUTER_API_KEY"
33
+ },
34
+ {
35
+ id: "lmstudio",
36
+ label: "LM Studio (local)",
37
+ defaultBaseUrl: "http://127.0.0.1:1234/v1",
38
+ defaultModel: "text-embedding-nomic-embed-text-v1.5",
39
+ apiKeyEnv: "LM_STUDIO_API_KEY",
40
+ apiKeyHint: "Often unused locally \u2014 any non-empty value is fine"
41
+ },
42
+ {
43
+ id: "gemini",
44
+ label: "Google Gemini",
45
+ defaultBaseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
46
+ defaultModel: "text-embedding-004",
47
+ apiKeyEnv: "GEMINI_API_KEY"
48
+ },
49
+ {
50
+ id: "together",
51
+ label: "Together AI",
52
+ defaultBaseUrl: "https://api.together.xyz/v1",
53
+ defaultModel: "togethercomputer/m2-bert-80M-8k-retrieval",
54
+ apiKeyEnv: "TOGETHER_API_KEY"
55
+ },
56
+ {
57
+ id: "vllm",
58
+ label: "vLLM (local/server)",
59
+ defaultBaseUrl: "http://127.0.0.1:8000/v1",
60
+ defaultModel: "text-embedding-ada-002",
61
+ apiKeyEnv: "VLLM_API_KEY",
62
+ apiKeyHint: "Only if your server requires auth"
63
+ },
64
+ {
65
+ id: "custom",
66
+ label: "Custom OpenAI-compatible",
67
+ defaultBaseUrl: "https://api.openai.com/v1",
68
+ defaultModel: "text-embedding-3-small",
69
+ apiKeyEnv: "WOLBARG_EMBEDDING_API_KEY"
70
+ }
71
+ ];
72
+ function getEmbeddingProviderPreset(id) {
73
+ return EMBEDDING_PROVIDER_PRESETS.find((p) => p.id === id);
74
+ }
75
+ var DEFAULT_SQLITE_DB_PATH = ".wolbarg/shared-memory/memory.db";
76
+ var DEFAULT_ORGANIZATION = "default";
77
+ var DEFAULT_CONFIG_PATH = ".wolbarg/config.json";
78
+ var DEFAULT_ENV_PATH = ".wolbarg/.env";
79
+
80
+ // src/config/project-config.ts
81
+ function defaultProjectConfig() {
82
+ return {
83
+ version: 1,
84
+ organization: DEFAULT_ORGANIZATION,
85
+ database: {
86
+ provider: "sqlite",
87
+ url: DEFAULT_SQLITE_DB_PATH
88
+ },
89
+ paths: {
90
+ config: DEFAULT_CONFIG_PATH
91
+ }
92
+ };
93
+ }
94
+ function resolveConfigPath(cwd = process.cwd(), configPath) {
95
+ const rel = configPath ?? DEFAULT_CONFIG_PATH;
96
+ return isAbsolute(rel) ? rel : resolve(cwd, rel);
97
+ }
98
+ function resolveEnvPath(cwd = process.cwd(), envPath) {
99
+ const rel = envPath ?? DEFAULT_ENV_PATH;
100
+ return isAbsolute(rel) ? rel : resolve(cwd, rel);
101
+ }
102
+ function saveProjectConfig(config, options = {}) {
103
+ const cwd = options.cwd ?? process.cwd();
104
+ const configPath = resolveConfigPath(cwd, options.configPath);
105
+ const dir = dirname(configPath);
106
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
107
+ if (existsSync(configPath) && options.overwrite === false) {
108
+ throw new Error(`Config already exists: ${configPath} (pass --force to overwrite)`);
109
+ }
110
+ const toWrite = {
111
+ ...config,
112
+ paths: {
113
+ config: options.configPath ?? DEFAULT_CONFIG_PATH,
114
+ ...options.envPath || options.apiKey ? { env: options.envPath ?? DEFAULT_ENV_PATH } : config.paths?.env ? { env: config.paths.env } : {}
115
+ }
116
+ };
117
+ writeFileSync(configPath, `${JSON.stringify(toWrite, null, 2)}
118
+ `, "utf8");
119
+ let envPath;
120
+ if (options.apiKey && config.embedding?.apiKeyEnv) {
121
+ envPath = resolveEnvPath(cwd, options.envPath);
122
+ ensureParent(envPath);
123
+ upsertEnvVar(envPath, config.embedding.apiKeyEnv, options.apiKey);
124
+ ensureGitignore(cwd, [DEFAULT_ENV_PATH, ".env"]);
125
+ }
126
+ if (config.database.provider === "sqlite" && !config.database.url.includes("://")) {
127
+ const dbPath = isAbsolute(config.database.url) ? config.database.url : resolve(cwd, config.database.url);
128
+ ensureParent(dbPath);
129
+ }
130
+ return { configPath, envPath };
131
+ }
132
+ function ensureParent(filePath) {
133
+ const dir = dirname(filePath);
134
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
135
+ }
136
+ function upsertEnvVar(envPath, key, value) {
137
+ ensureParent(envPath);
138
+ let text = existsSync(envPath) ? readFileSync(envPath, "utf8") : "";
139
+ const line = `${key}=${shellQuoteEnv(value)}`;
140
+ const re = new RegExp(`^${escapeRegExp(key)}=.*$`, "m");
141
+ if (re.test(text)) {
142
+ text = text.replace(re, line);
143
+ } else {
144
+ if (text && !text.endsWith("\n")) text += "\n";
145
+ text += `${line}
146
+ `;
147
+ }
148
+ writeFileSync(envPath, text, "utf8");
149
+ }
150
+ function shellQuoteEnv(value) {
151
+ if (/[\s#"']/.test(value)) {
152
+ return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
153
+ }
154
+ return value;
155
+ }
156
+ function escapeRegExp(s) {
157
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
158
+ }
159
+ function ensureGitignore(cwd, entries) {
160
+ const gi = join(cwd, ".gitignore");
161
+ let text = existsSync(gi) ? readFileSync(gi, "utf8") : "";
162
+ let changed = false;
163
+ for (const entry of entries) {
164
+ if (text.split(/\r?\n/).some((l) => l.trim() === entry)) continue;
165
+ if (text && !text.endsWith("\n")) text += "\n";
166
+ text += `${entry}
167
+ `;
168
+ changed = true;
169
+ }
170
+ if (changed) writeFileSync(gi, text, "utf8");
171
+ }
172
+ async function withReadline(fn) {
173
+ const rl = readline.createInterface({ input: stdin, output: stdout });
174
+ try {
175
+ return await fn(rl);
176
+ } finally {
177
+ rl.close();
178
+ }
179
+ }
180
+ async function askText(rl, label, defaultValue2) {
181
+ const hint = defaultValue2 !== void 0 && defaultValue2 !== "" ? ` [${defaultValue2}]` : "";
182
+ const answer = (await rl.question(`${label}${hint}: `)).trim();
183
+ if (answer === "") return defaultValue2 ?? "";
184
+ return answer;
185
+ }
186
+ async function askOptionalText(rl, label, defaultValue2) {
187
+ const hintParts = [];
188
+ if (defaultValue2 !== void 0 && defaultValue2 !== "") {
189
+ hintParts.push(`default: ${defaultValue2}`);
190
+ }
191
+ hintParts.push("Enter to accept", '"-" to skip/clear');
192
+ const answer = (await rl.question(`${label} (${hintParts.join(", ")}): `)).trim();
193
+ if (answer === "-") return void 0;
194
+ if (answer === "") {
195
+ return defaultValue2 === "" ? void 0 : defaultValue2;
196
+ }
197
+ return answer;
198
+ }
199
+ async function askSelect(rl, label, choices, defaultValue2, allowSkip = true) {
200
+ console.log(`
201
+ ${label}`);
202
+ choices.forEach((c, i) => {
203
+ const mark = c.value === defaultValue2 ? " (default)" : "";
204
+ console.log(` ${i + 1}) ${c.label}${mark}`);
205
+ });
206
+ if (allowSkip) {
207
+ console.log(` 0) Skip`);
208
+ }
209
+ const defIndex = choices.findIndex((c) => c.value === defaultValue2) + 1 ;
210
+ const raw = (await rl.question(
211
+ `Choose [0-${choices.length}]${defIndex >= 0 ? ` (default ${defIndex})` : ""}: `
212
+ )).trim();
213
+ if (raw === "" && defIndex === 0 && allowSkip) return void 0;
214
+ if (raw === "" && defIndex > 0) return choices[defIndex - 1].value;
215
+ if (raw === "0" && allowSkip) return void 0;
216
+ const n = Number(raw);
217
+ if (!Number.isInteger(n) || n < 1 || n > choices.length) {
218
+ console.log("Invalid choice \u2014 skipped.");
219
+ return allowSkip ? void 0 : defaultValue2;
220
+ }
221
+ return choices[n - 1].value;
222
+ }
223
+ async function askConfirm(rl, label, defaultYes = true) {
224
+ const hint = defaultValue ? "Y/n" : "y/N";
225
+ const answer = (await rl.question(`${label} (${hint}): `)).trim().toLowerCase();
226
+ if (answer === "") return defaultValue;
227
+ if (answer === "y" || answer === "yes") return true;
228
+ if (answer === "n" || answer === "no") return false;
229
+ return defaultValue;
230
+ }
231
+
232
+ // src/cli/init.ts
233
+ function printHelp() {
234
+ console.log(`Usage: wolbarg init [options]
235
+
236
+ Configure Wolbarg for this project (database + optional embedding provider).
237
+
238
+ All prompts are optional \u2014 press Enter to accept defaults, or skip embedding.
239
+
240
+ Options:
241
+ -y, --yes Non-interactive; use defaults / flags
242
+ -f, --force Overwrite existing .wolbarg/config.json
243
+ --org <name> Organization id (default: ${DEFAULT_ORGANIZATION})
244
+ --db <path-or-url> SQLite path or Postgres URL
245
+ (default: ${DEFAULT_SQLITE_DB_PATH})
246
+ --db-provider <sqlite|postgres>
247
+ --provider <id> Embedding provider preset
248
+ (${EMBEDDING_PROVIDER_PRESETS.map((p) => p.id).join("|")})
249
+ --base-url <url> Embedding API base URL (shown with provider default)
250
+ --model <id> Embedding model id
251
+ --api-key <key> Write API key into .wolbarg/.env
252
+ --api-key-env <NAME> Env var name for the key
253
+ --skip-embedding Do not configure embedding
254
+ -h, --help Show help
255
+
256
+ Examples:
257
+ wolbarg init
258
+ wolbarg init --yes
259
+ wolbarg init --provider ollama --model nomic-embed-text --api-key ollama
260
+ wolbarg init --db postgresql://user:pass@localhost:5432/wolbarg --db-provider postgres
261
+ `);
262
+ }
263
+ function parseInitArgs(argv) {
264
+ const opts = {};
265
+ for (let i = 0; i < argv.length; i++) {
266
+ const a = argv[i];
267
+ const next = () => {
268
+ const v = argv[++i];
269
+ if (v === void 0) throw new Error(`Missing value after ${a}`);
270
+ return v;
271
+ };
272
+ switch (a) {
273
+ case "-h":
274
+ case "--help":
275
+ return { help: true };
276
+ case "-y":
277
+ case "--yes":
278
+ opts.yes = true;
279
+ break;
280
+ case "-f":
281
+ case "--force":
282
+ opts.force = true;
283
+ break;
284
+ case "--org":
285
+ opts.organization = next();
286
+ break;
287
+ case "--db":
288
+ opts.db = next();
289
+ break;
290
+ case "--db-provider": {
291
+ const p = next();
292
+ if (p !== "sqlite" && p !== "postgres") {
293
+ throw new Error(`--db-provider must be sqlite|postgres`);
294
+ }
295
+ opts.dbProvider = p;
296
+ break;
297
+ }
298
+ case "--provider":
299
+ opts.provider = next();
300
+ break;
301
+ case "--base-url":
302
+ opts.baseUrl = next();
303
+ break;
304
+ case "--model":
305
+ opts.model = next();
306
+ break;
307
+ case "--api-key":
308
+ opts.apiKey = next();
309
+ break;
310
+ case "--api-key-env":
311
+ opts.apiKeyEnv = next();
312
+ break;
313
+ case "--skip-embedding":
314
+ opts.skipEmbedding = true;
315
+ break;
316
+ default:
317
+ throw new Error(`Unknown argument: ${a}`);
318
+ }
319
+ }
320
+ return opts;
321
+ }
322
+ function inferDbProvider(url, explicit) {
323
+ if (explicit) return explicit;
324
+ if (/^postgres(ql)?:\/\//i.test(url)) return "postgres";
325
+ return "sqlite";
326
+ }
327
+ async function runInit(options = {}) {
328
+ const cwd = options.cwd ?? process.cwd();
329
+ const configPath = resolveConfigPath(cwd);
330
+ if (existsSync(configPath) && !options.force && !options.yes) {
331
+ const overwrite = await withReadline(
332
+ (rl) => askConfirm(
333
+ rl,
334
+ `Config already exists at ${configPath}. Overwrite?`,
335
+ false
336
+ )
337
+ );
338
+ if (!overwrite) {
339
+ console.log("Aborted. Pass --force to overwrite.");
340
+ return 1;
341
+ }
342
+ } else if (existsSync(configPath) && options.yes && !options.force) {
343
+ console.error(
344
+ `Config already exists at ${configPath}. Re-run with --force to overwrite.`
345
+ );
346
+ return 1;
347
+ }
348
+ const config = defaultProjectConfig();
349
+ let apiKey;
350
+ if (options.yes) {
351
+ config.organization = options.organization ?? DEFAULT_ORGANIZATION;
352
+ const dbUrl = options.db ?? DEFAULT_SQLITE_DB_PATH;
353
+ config.database = {
354
+ provider: inferDbProvider(dbUrl, options.dbProvider),
355
+ url: dbUrl
356
+ };
357
+ if (!options.skipEmbedding) {
358
+ const providerId = options.provider ?? "openai";
359
+ const preset = getEmbeddingProviderPreset(providerId);
360
+ if (!preset) {
361
+ console.error(`Unknown provider: ${providerId}`);
362
+ return 1;
363
+ }
364
+ const baseUrl = options.baseUrl ?? preset.defaultBaseUrl;
365
+ const model = options.model ?? preset.defaultModel;
366
+ config.embedding = {
367
+ provider: preset.id,
368
+ baseUrl,
369
+ model,
370
+ apiKeyEnv: options.apiKeyEnv ?? preset.apiKeyEnv
371
+ };
372
+ apiKey = options.apiKey;
373
+ }
374
+ } else {
375
+ await withReadline(async (rl) => {
376
+ console.log("\nWolbarg init \u2014 all fields optional (Enter = default / skip).\n");
377
+ const org = await askOptionalText(
378
+ rl,
379
+ "Organization",
380
+ options.organization ?? DEFAULT_ORGANIZATION
381
+ );
382
+ config.organization = org ?? DEFAULT_ORGANIZATION;
383
+ const dbUrl = await askOptionalText(
384
+ rl,
385
+ "Database path or Postgres URL",
386
+ options.db ?? DEFAULT_SQLITE_DB_PATH
387
+ );
388
+ const resolvedDb = dbUrl ?? DEFAULT_SQLITE_DB_PATH;
389
+ config.database = {
390
+ provider: inferDbProvider(resolvedDb, options.dbProvider),
391
+ url: resolvedDb
392
+ };
393
+ if (options.skipEmbedding) {
394
+ return;
395
+ }
396
+ const providerId = options.provider ?? await askSelect(
397
+ rl,
398
+ "Embedding provider",
399
+ EMBEDDING_PROVIDER_PRESETS.map((p) => ({
400
+ value: p.id,
401
+ label: `${p.label} \u2014 ${p.defaultBaseUrl}`
402
+ })),
403
+ "openai",
404
+ true
405
+ );
406
+ if (!providerId) {
407
+ console.log("Skipping embedding configuration.");
408
+ return;
409
+ }
410
+ const preset = getEmbeddingProviderPreset(providerId);
411
+ if (!preset) {
412
+ console.log(`Unknown provider ${providerId}; skipping embedding.`);
413
+ return;
414
+ }
415
+ console.log(
416
+ `
417
+ Provider default base URL for ${preset.label}: ${preset.defaultBaseUrl}`
418
+ );
419
+ const baseUrl = options.baseUrl ?? await askText(
420
+ rl,
421
+ "Embedding base URL",
422
+ preset.defaultBaseUrl
423
+ );
424
+ const model = options.model ?? await askText(rl, "Embedding model", preset.defaultModel);
425
+ const apiKeyEnv = options.apiKeyEnv ?? await askText(rl, "API key environment variable", preset.apiKeyEnv);
426
+ const keyPrompt = preset.apiKeyHint ? `API key (${preset.apiKeyHint})` : `API key (stored in ${DEFAULT_ENV_PATH} as ${apiKeyEnv})`;
427
+ const key = options.apiKey ?? await askOptionalText(rl, keyPrompt, void 0);
428
+ config.embedding = {
429
+ provider: preset.id,
430
+ baseUrl: baseUrl || preset.defaultBaseUrl,
431
+ model: model || preset.defaultModel,
432
+ apiKeyEnv: apiKeyEnv || preset.apiKeyEnv
433
+ };
434
+ if (key) apiKey = key;
435
+ });
436
+ }
437
+ const saved = saveProjectConfig(config, {
438
+ cwd,
439
+ overwrite: true,
440
+ apiKey,
441
+ envPath: DEFAULT_ENV_PATH
442
+ });
443
+ console.log("\nWolbarg configured.\n");
444
+ console.log(` config: ${saved.configPath}`);
445
+ if (saved.envPath) console.log(` env: ${saved.envPath}`);
446
+ console.log(` db: ${config.database.provider} \u2192 ${config.database.url}`);
447
+ if (config.embedding) {
448
+ console.log(` embed: ${config.embedding.provider}`);
449
+ console.log(` base: ${config.embedding.baseUrl}`);
450
+ console.log(` model: ${config.embedding.model}`);
451
+ console.log(` key: $${config.embedding.apiKeyEnv}`);
452
+ } else {
453
+ console.log(" embed: (not configured)");
454
+ }
455
+ console.log(`
456
+ Next:
457
+ import { createWolbargFromProjectConfig } from "wolbarg";
458
+ const ctx = createWolbargFromProjectConfig();
459
+ await ctx.ready();
460
+ `);
461
+ return 0;
462
+ }
463
+ async function initCommand(argv) {
464
+ try {
465
+ const parsed = parseInitArgs(argv);
466
+ if ("help" in parsed) {
467
+ printHelp();
468
+ return 0;
469
+ }
470
+ return await runInit(parsed);
471
+ } catch (err) {
472
+ console.error(err instanceof Error ? err.message : err);
473
+ return 1;
474
+ }
475
+ }
476
+
477
+ // src/cli/index.ts
478
+ function printRootHelp() {
479
+ console.log(`wolbarg ${SDK_VERSION}
480
+
481
+ Usage:
482
+ wolbarg init [options] Configure project database + embedding provider
483
+ wolbarg --version Print version
484
+ wolbarg --help Show help
485
+
486
+ Run \`wolbarg init --help\` for init options.
487
+ `);
488
+ }
489
+ async function cliMain(argv) {
490
+ const [cmd, ...rest] = argv;
491
+ if (!cmd || cmd === "-h" || cmd === "--help") {
492
+ printRootHelp();
493
+ return 0;
494
+ }
495
+ if (cmd === "-V" || cmd === "--version" || cmd === "version") {
496
+ console.log(SDK_VERSION);
497
+ return 0;
498
+ }
499
+ if (cmd === "init") {
500
+ return initCommand(rest);
501
+ }
502
+ console.error(`Unknown command: ${cmd}`);
503
+ printRootHelp();
504
+ return 1;
505
+ }
506
+ cliMain(process.argv.slice(2)).then((code) => {
507
+ process.exit(code);
508
+ }).catch((err) => {
509
+ console.error(err);
510
+ process.exit(1);
511
+ });
512
+
513
+ export { cliMain };
514
+ //# sourceMappingURL=cli.js.map
515
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/version.ts","../src/config/providers.ts","../src/config/project-config.ts","../src/cli/prompt.ts","../src/cli/init.ts","../src/cli/index.ts"],"names":["input","output","defaultValue","existsSync"],"mappings":"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","file":"cli.js","sourcesContent":["/** Published SDK semver — keep in sync with `package.json` `version`. */\nexport const SDK_VERSION = \"0.5.6\";\n","/**\n * Embedding provider presets for `wolbarg init` and project config.\n *\n * Base URLs are defaults the user must see and may edit — never silently applied\n * without showing the field.\n */\n\nexport type EmbeddingProviderId =\n | \"openai\"\n | \"ollama\"\n | \"openrouter\"\n | \"lmstudio\"\n | \"gemini\"\n | \"together\"\n | \"vllm\"\n | \"custom\";\n\nexport interface EmbeddingProviderPreset {\n id: EmbeddingProviderId;\n label: string;\n /** Default OpenAI-compatible embeddings base URL (shown to the user). */\n defaultBaseUrl: string;\n /** Suggested default model id (shown to the user). */\n defaultModel: string;\n /** Env var name written into config / `.env`. */\n apiKeyEnv: string;\n /** Hint shown next to the API key prompt. */\n apiKeyHint?: string;\n}\n\nexport const EMBEDDING_PROVIDER_PRESETS: readonly EmbeddingProviderPreset[] = [\n {\n id: \"openai\",\n label: \"OpenAI\",\n defaultBaseUrl: \"https://api.openai.com/v1\",\n defaultModel: \"text-embedding-3-small\",\n apiKeyEnv: \"OPENAI_API_KEY\",\n },\n {\n id: \"ollama\",\n label: \"Ollama (local)\",\n defaultBaseUrl: \"http://127.0.0.1:11434/v1\",\n defaultModel: \"nomic-embed-text\",\n apiKeyEnv: \"OLLAMA_API_KEY\",\n apiKeyHint: \"Any non-empty value works locally (e.g. ollama)\",\n },\n {\n id: \"openrouter\",\n label: \"OpenRouter\",\n defaultBaseUrl: \"https://openrouter.ai/api/v1\",\n defaultModel: \"openai/text-embedding-3-small\",\n apiKeyEnv: \"OPENROUTER_API_KEY\",\n },\n {\n id: \"lmstudio\",\n label: \"LM Studio (local)\",\n defaultBaseUrl: \"http://127.0.0.1:1234/v1\",\n defaultModel: \"text-embedding-nomic-embed-text-v1.5\",\n apiKeyEnv: \"LM_STUDIO_API_KEY\",\n apiKeyHint: \"Often unused locally — any non-empty value is fine\",\n },\n {\n id: \"gemini\",\n label: \"Google Gemini\",\n defaultBaseUrl:\n \"https://generativelanguage.googleapis.com/v1beta/openai\",\n defaultModel: \"text-embedding-004\",\n apiKeyEnv: \"GEMINI_API_KEY\",\n },\n {\n id: \"together\",\n label: \"Together AI\",\n defaultBaseUrl: \"https://api.together.xyz/v1\",\n defaultModel: \"togethercomputer/m2-bert-80M-8k-retrieval\",\n apiKeyEnv: \"TOGETHER_API_KEY\",\n },\n {\n id: \"vllm\",\n label: \"vLLM (local/server)\",\n defaultBaseUrl: \"http://127.0.0.1:8000/v1\",\n defaultModel: \"text-embedding-ada-002\",\n apiKeyEnv: \"VLLM_API_KEY\",\n apiKeyHint: \"Only if your server requires auth\",\n },\n {\n id: \"custom\",\n label: \"Custom OpenAI-compatible\",\n defaultBaseUrl: \"https://api.openai.com/v1\",\n defaultModel: \"text-embedding-3-small\",\n apiKeyEnv: \"WOLBARG_EMBEDDING_API_KEY\",\n },\n] as const;\n\nexport function getEmbeddingProviderPreset(\n id: string,\n): EmbeddingProviderPreset | undefined {\n return EMBEDDING_PROVIDER_PRESETS.find((p) => p.id === id);\n}\n\nexport const DEFAULT_SQLITE_DB_PATH = \".wolbarg/shared-memory/memory.db\";\nexport const DEFAULT_ORGANIZATION = \"default\";\nexport const DEFAULT_CONFIG_PATH = \".wolbarg/config.json\";\nexport const DEFAULT_ENV_PATH = \".wolbarg/.env\";\n","/**\n * Project-level Wolbarg configuration written by `wolbarg init`.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport {\n DEFAULT_CONFIG_PATH,\n DEFAULT_ENV_PATH,\n DEFAULT_ORGANIZATION,\n DEFAULT_SQLITE_DB_PATH,\n getEmbeddingProviderPreset,\n type EmbeddingProviderId,\n} from \"./providers.js\";\n\nexport interface WolbargProjectDatabaseConfig {\n provider: \"sqlite\" | \"postgres\";\n /** SQLite file path or Postgres connection URL. */\n url: string;\n}\n\nexport interface WolbargProjectEmbeddingConfig {\n /** Named provider preset id (or `custom`). */\n provider: EmbeddingProviderId;\n /** OpenAI-compatible embeddings base URL (always stored explicitly). */\n baseUrl: string;\n /** Embedding model id. */\n model: string;\n /** Env var that holds the API key (preferred over storing secrets). */\n apiKeyEnv: string;\n}\n\nexport interface WolbargProjectConfig {\n version: 1;\n organization: string;\n database: WolbargProjectDatabaseConfig;\n embedding?: WolbargProjectEmbeddingConfig;\n /** Relative paths written by init (informational). */\n paths?: {\n config: string;\n env?: string;\n };\n}\n\nexport interface SaveProjectConfigOptions {\n cwd?: string;\n configPath?: string;\n /** Absolute or cwd-relative path for `.env` (optional). */\n envPath?: string;\n /** Raw API key to write into the env file (optional). */\n apiKey?: string;\n /** When true, overwrite an existing config without merging. */\n overwrite?: boolean;\n}\n\nexport function defaultProjectConfig(): WolbargProjectConfig {\n return {\n version: 1,\n organization: DEFAULT_ORGANIZATION,\n database: {\n provider: \"sqlite\",\n url: DEFAULT_SQLITE_DB_PATH,\n },\n paths: {\n config: DEFAULT_CONFIG_PATH,\n },\n };\n}\n\nexport function resolveConfigPath(cwd = process.cwd(), configPath?: string): string {\n const rel = configPath ?? DEFAULT_CONFIG_PATH;\n return isAbsolute(rel) ? rel : resolve(cwd, rel);\n}\n\nexport function resolveEnvPath(cwd = process.cwd(), envPath?: string): string {\n const rel = envPath ?? DEFAULT_ENV_PATH;\n return isAbsolute(rel) ? rel : resolve(cwd, rel);\n}\n\nexport function loadProjectConfig(\n cwd = process.cwd(),\n configPath?: string,\n): WolbargProjectConfig | null {\n const full = resolveConfigPath(cwd, configPath);\n if (!existsSync(full)) return null;\n const raw = JSON.parse(readFileSync(full, \"utf8\")) as WolbargProjectConfig;\n if (!raw || raw.version !== 1 || !raw.database?.url) {\n throw new Error(`Invalid Wolbarg config at ${full}`);\n }\n return raw;\n}\n\nexport function saveProjectConfig(\n config: WolbargProjectConfig,\n options: SaveProjectConfigOptions = {},\n): { configPath: string; envPath?: string } {\n const cwd = options.cwd ?? process.cwd();\n const configPath = resolveConfigPath(cwd, options.configPath);\n const dir = dirname(configPath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n\n if (existsSync(configPath) && options.overwrite === false) {\n throw new Error(`Config already exists: ${configPath} (pass --force to overwrite)`);\n }\n\n const toWrite: WolbargProjectConfig = {\n ...config,\n paths: {\n config: options.configPath ?? DEFAULT_CONFIG_PATH,\n ...(options.envPath || options.apiKey\n ? { env: options.envPath ?? DEFAULT_ENV_PATH }\n : config.paths?.env\n ? { env: config.paths.env }\n : {}),\n },\n };\n\n writeFileSync(configPath, `${JSON.stringify(toWrite, null, 2)}\\n`, \"utf8\");\n\n let envPath: string | undefined;\n if (options.apiKey && config.embedding?.apiKeyEnv) {\n envPath = resolveEnvPath(cwd, options.envPath);\n ensureParent(envPath);\n upsertEnvVar(envPath, config.embedding.apiKeyEnv, options.apiKey);\n ensureGitignore(cwd, [DEFAULT_ENV_PATH, \".env\"]);\n }\n\n // Ensure sqlite parent dir exists for the default layout\n if (config.database.provider === \"sqlite\" && !config.database.url.includes(\"://\")) {\n const dbPath = isAbsolute(config.database.url)\n ? config.database.url\n : resolve(cwd, config.database.url);\n ensureParent(dbPath);\n }\n\n return { configPath, envPath };\n}\n\nfunction ensureParent(filePath: string): void {\n const dir = dirname(filePath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n}\n\nexport function upsertEnvVar(\n envPath: string,\n key: string,\n value: string,\n): void {\n ensureParent(envPath);\n let text = existsSync(envPath) ? readFileSync(envPath, \"utf8\") : \"\";\n const line = `${key}=${shellQuoteEnv(value)}`;\n const re = new RegExp(`^${escapeRegExp(key)}=.*$`, \"m\");\n if (re.test(text)) {\n text = text.replace(re, line);\n } else {\n if (text && !text.endsWith(\"\\n\")) text += \"\\n\";\n text += `${line}\\n`;\n }\n writeFileSync(envPath, text, \"utf8\");\n}\n\nfunction shellQuoteEnv(value: string): string {\n if (/[\\s#\"']/.test(value)) {\n return `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n }\n return value;\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction ensureGitignore(cwd: string, entries: string[]): void {\n const gi = join(cwd, \".gitignore\");\n let text = existsSync(gi) ? readFileSync(gi, \"utf8\") : \"\";\n let changed = false;\n for (const entry of entries) {\n if (text.split(/\\r?\\n/).some((l) => l.trim() === entry)) continue;\n if (text && !text.endsWith(\"\\n\")) text += \"\\n\";\n text += `${entry}\\n`;\n changed = true;\n }\n if (changed) writeFileSync(gi, text, \"utf8\");\n}\n\n/**\n * Resolve the API key for a project config from process.env (and optional `.env` load).\n * Does not invent keys — returns empty string if unset.\n */\nexport function resolveEmbeddingApiKey(\n config: WolbargProjectConfig,\n env: NodeJS.ProcessEnv = process.env,\n): string {\n const name = config.embedding?.apiKeyEnv;\n if (!name) return \"\";\n return env[name] ?? \"\";\n}\n\nexport function assertEmbeddingPreset(\n provider: string,\n): EmbeddingProviderId {\n const preset = getEmbeddingProviderPreset(provider);\n if (!preset) {\n throw new Error(\n `Unknown embedding provider \"${provider}\". Choose one of: ${[\n \"openai\",\n \"ollama\",\n \"openrouter\",\n \"lmstudio\",\n \"gemini\",\n \"together\",\n \"vllm\",\n \"custom\",\n ].join(\", \")}`,\n );\n }\n return preset.id;\n}\n","/**\n * Minimal interactive prompts (no third-party CLI deps).\n */\n\nimport * as readline from \"node:readline/promises\";\nimport { stdin as input, stdout as output } from \"node:process\";\n\nexport async function withReadline<T>(\n fn: (rl: readline.Interface) => Promise<T>,\n): Promise<T> {\n const rl = readline.createInterface({ input, output });\n try {\n return await fn(rl);\n } finally {\n rl.close();\n }\n}\n\nexport async function askText(\n rl: readline.Interface,\n label: string,\n defaultValue?: string,\n): Promise<string> {\n const hint =\n defaultValue !== undefined && defaultValue !== \"\"\n ? ` [${defaultValue}]`\n : \"\";\n const answer = (await rl.question(`${label}${hint}: `)).trim();\n if (answer === \"\") return defaultValue ?? \"\";\n return answer;\n}\n\n/**\n * Optional text field — empty Enter keeps default; typing \"-\" clears (leaves empty).\n */\nexport async function askOptionalText(\n rl: readline.Interface,\n label: string,\n defaultValue?: string,\n): Promise<string | undefined> {\n const hintParts: string[] = [];\n if (defaultValue !== undefined && defaultValue !== \"\") {\n hintParts.push(`default: ${defaultValue}`);\n }\n hintParts.push(\"Enter to accept\", '\"-\" to skip/clear');\n const answer = (\n await rl.question(`${label} (${hintParts.join(\", \")}): `)\n ).trim();\n if (answer === \"-\") return undefined;\n if (answer === \"\") {\n return defaultValue === \"\" ? undefined : defaultValue;\n }\n return answer;\n}\n\nexport async function askSelect<T extends string>(\n rl: readline.Interface,\n label: string,\n choices: Array<{ value: T; label: string }>,\n defaultValue?: T,\n allowSkip = true,\n): Promise<T | undefined> {\n console.log(`\\n${label}`);\n choices.forEach((c, i) => {\n const mark = c.value === defaultValue ? \" (default)\" : \"\";\n console.log(` ${i + 1}) ${c.label}${mark}`);\n });\n if (allowSkip) {\n console.log(` 0) Skip`);\n }\n const defIndex =\n defaultValue != null\n ? choices.findIndex((c) => c.value === defaultValue) + 1\n : allowSkip\n ? 0\n : 1;\n const raw = (\n await rl.question(\n `Choose [0-${choices.length}]${defIndex >= 0 ? ` (default ${defIndex})` : \"\"}: `,\n )\n ).trim();\n\n if (raw === \"\" && defIndex === 0 && allowSkip) return undefined;\n if (raw === \"\" && defIndex > 0) return choices[defIndex - 1]!.value;\n if (raw === \"0\" && allowSkip) return undefined;\n\n const n = Number(raw);\n if (!Number.isInteger(n) || n < 1 || n > choices.length) {\n console.log(\"Invalid choice — skipped.\");\n return allowSkip ? undefined : defaultValue;\n }\n return choices[n - 1]!.value;\n}\n\nexport async function askConfirm(\n rl: readline.Interface,\n label: string,\n defaultYes = true,\n): Promise<boolean> {\n const hint = defaultValue ? \"Y/n\" : \"y/N\";\n const answer = (await rl.question(`${label} (${hint}): `)).trim().toLowerCase();\n if (answer === \"\") return defaultValue;\n if (answer === \"y\" || answer === \"yes\") return true;\n if (answer === \"n\" || answer === \"no\") return false;\n return defaultValue;\n}\n","/**\n * `wolbarg init` — interactive (or flag-driven) project configuration.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport {\n defaultProjectConfig,\n resolveConfigPath,\n saveProjectConfig,\n type WolbargProjectConfig,\n} from \"../config/project-config.js\";\nimport {\n DEFAULT_ENV_PATH,\n DEFAULT_ORGANIZATION,\n DEFAULT_SQLITE_DB_PATH,\n EMBEDDING_PROVIDER_PRESETS,\n getEmbeddingProviderPreset,\n type EmbeddingProviderId,\n} from \"../config/providers.js\";\nimport {\n askConfirm,\n askOptionalText,\n askSelect,\n askText,\n withReadline,\n} from \"./prompt.js\";\n\nexport interface InitCliOptions {\n cwd?: string;\n /** Non-interactive: accept defaults / provided flags. */\n yes?: boolean;\n force?: boolean;\n organization?: string;\n db?: string;\n dbProvider?: \"sqlite\" | \"postgres\";\n provider?: string;\n baseUrl?: string;\n model?: string;\n apiKey?: string;\n apiKeyEnv?: string;\n /** Skip embedding entirely. */\n skipEmbedding?: boolean;\n}\n\nfunction printHelp(): void {\n console.log(`Usage: wolbarg init [options]\n\nConfigure Wolbarg for this project (database + optional embedding provider).\n\nAll prompts are optional — press Enter to accept defaults, or skip embedding.\n\nOptions:\n -y, --yes Non-interactive; use defaults / flags\n -f, --force Overwrite existing .wolbarg/config.json\n --org <name> Organization id (default: ${DEFAULT_ORGANIZATION})\n --db <path-or-url> SQLite path or Postgres URL\n (default: ${DEFAULT_SQLITE_DB_PATH})\n --db-provider <sqlite|postgres>\n --provider <id> Embedding provider preset\n (${EMBEDDING_PROVIDER_PRESETS.map((p) => p.id).join(\"|\")})\n --base-url <url> Embedding API base URL (shown with provider default)\n --model <id> Embedding model id\n --api-key <key> Write API key into .wolbarg/.env\n --api-key-env <NAME> Env var name for the key\n --skip-embedding Do not configure embedding\n -h, --help Show help\n\nExamples:\n wolbarg init\n wolbarg init --yes\n wolbarg init --provider ollama --model nomic-embed-text --api-key ollama\n wolbarg init --db postgresql://user:pass@localhost:5432/wolbarg --db-provider postgres\n`);\n}\n\nexport function parseInitArgs(argv: string[]): InitCliOptions | { help: true } {\n const opts: InitCliOptions = {};\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i]!;\n const next = () => {\n const v = argv[++i];\n if (v === undefined) throw new Error(`Missing value after ${a}`);\n return v;\n };\n switch (a) {\n case \"-h\":\n case \"--help\":\n return { help: true };\n case \"-y\":\n case \"--yes\":\n opts.yes = true;\n break;\n case \"-f\":\n case \"--force\":\n opts.force = true;\n break;\n case \"--org\":\n opts.organization = next();\n break;\n case \"--db\":\n opts.db = next();\n break;\n case \"--db-provider\": {\n const p = next();\n if (p !== \"sqlite\" && p !== \"postgres\") {\n throw new Error(`--db-provider must be sqlite|postgres`);\n }\n opts.dbProvider = p;\n break;\n }\n case \"--provider\":\n opts.provider = next();\n break;\n case \"--base-url\":\n opts.baseUrl = next();\n break;\n case \"--model\":\n opts.model = next();\n break;\n case \"--api-key\":\n opts.apiKey = next();\n break;\n case \"--api-key-env\":\n opts.apiKeyEnv = next();\n break;\n case \"--skip-embedding\":\n opts.skipEmbedding = true;\n break;\n default:\n throw new Error(`Unknown argument: ${a}`);\n }\n }\n return opts;\n}\n\nfunction inferDbProvider(url: string, explicit?: \"sqlite\" | \"postgres\"): \"sqlite\" | \"postgres\" {\n if (explicit) return explicit;\n if (/^postgres(ql)?:\\/\\//i.test(url)) return \"postgres\";\n return \"sqlite\";\n}\n\nexport async function runInit(options: InitCliOptions = {}): Promise<number> {\n const cwd = options.cwd ?? process.cwd();\n const configPath = resolveConfigPath(cwd);\n\n if (existsSync(configPath) && !options.force && !options.yes) {\n const overwrite = await withReadline((rl) =>\n askConfirm(\n rl,\n `Config already exists at ${configPath}. Overwrite?`,\n false,\n ),\n );\n if (!overwrite) {\n console.log(\"Aborted. Pass --force to overwrite.\");\n return 1;\n }\n } else if (existsSync(configPath) && options.yes && !options.force) {\n console.error(\n `Config already exists at ${configPath}. Re-run with --force to overwrite.`,\n );\n return 1;\n }\n\n const config: WolbargProjectConfig = defaultProjectConfig();\n let apiKey: string | undefined;\n\n if (options.yes) {\n config.organization = options.organization ?? DEFAULT_ORGANIZATION;\n const dbUrl = options.db ?? DEFAULT_SQLITE_DB_PATH;\n config.database = {\n provider: inferDbProvider(dbUrl, options.dbProvider),\n url: dbUrl,\n };\n\n if (!options.skipEmbedding) {\n const providerId = (options.provider ?? \"openai\") as EmbeddingProviderId;\n const preset = getEmbeddingProviderPreset(providerId);\n if (!preset) {\n console.error(`Unknown provider: ${providerId}`);\n return 1;\n }\n // Base URL must be explicit in the written config (even when using default).\n const baseUrl = options.baseUrl ?? preset.defaultBaseUrl;\n const model = options.model ?? preset.defaultModel;\n config.embedding = {\n provider: preset.id,\n baseUrl,\n model,\n apiKeyEnv: options.apiKeyEnv ?? preset.apiKeyEnv,\n };\n apiKey = options.apiKey;\n }\n } else {\n await withReadline(async (rl) => {\n console.log(\"\\nWolbarg init — all fields optional (Enter = default / skip).\\n\");\n\n const org = await askOptionalText(\n rl,\n \"Organization\",\n options.organization ?? DEFAULT_ORGANIZATION,\n );\n config.organization = org ?? DEFAULT_ORGANIZATION;\n\n const dbUrl = await askOptionalText(\n rl,\n \"Database path or Postgres URL\",\n options.db ?? DEFAULT_SQLITE_DB_PATH,\n );\n const resolvedDb = dbUrl ?? DEFAULT_SQLITE_DB_PATH;\n config.database = {\n provider: inferDbProvider(resolvedDb, options.dbProvider),\n url: resolvedDb,\n };\n\n if (options.skipEmbedding) {\n return;\n }\n\n const providerId =\n options.provider ??\n (await askSelect(\n rl,\n \"Embedding provider\",\n EMBEDDING_PROVIDER_PRESETS.map((p) => ({\n value: p.id,\n label: `${p.label} — ${p.defaultBaseUrl}`,\n })),\n \"openai\",\n true,\n ));\n\n if (!providerId) {\n console.log(\"Skipping embedding configuration.\");\n return;\n }\n\n const preset = getEmbeddingProviderPreset(providerId);\n if (!preset) {\n console.log(`Unknown provider ${providerId}; skipping embedding.`);\n return;\n }\n\n // CRITICAL: always show base URL field with the provider default visible.\n console.log(\n `\\nProvider default base URL for ${preset.label}: ${preset.defaultBaseUrl}`,\n );\n const baseUrl =\n options.baseUrl ??\n (await askText(\n rl,\n \"Embedding base URL\",\n preset.defaultBaseUrl,\n ));\n\n const model =\n options.model ??\n (await askText(rl, \"Embedding model\", preset.defaultModel));\n\n const apiKeyEnv =\n options.apiKeyEnv ??\n (await askText(rl, \"API key environment variable\", preset.apiKeyEnv));\n\n const keyPrompt = preset.apiKeyHint\n ? `API key (${preset.apiKeyHint})`\n : `API key (stored in ${DEFAULT_ENV_PATH} as ${apiKeyEnv})`;\n const key =\n options.apiKey ??\n (await askOptionalText(rl, keyPrompt, undefined));\n\n config.embedding = {\n provider: preset.id,\n baseUrl: baseUrl || preset.defaultBaseUrl,\n model: model || preset.defaultModel,\n apiKeyEnv: apiKeyEnv || preset.apiKeyEnv,\n };\n if (key) apiKey = key;\n });\n }\n\n const saved = saveProjectConfig(config, {\n cwd,\n overwrite: true,\n apiKey,\n envPath: DEFAULT_ENV_PATH,\n });\n\n console.log(\"\\nWolbarg configured.\\n\");\n console.log(` config: ${saved.configPath}`);\n if (saved.envPath) console.log(` env: ${saved.envPath}`);\n console.log(` db: ${config.database.provider} → ${config.database.url}`);\n if (config.embedding) {\n console.log(` embed: ${config.embedding.provider}`);\n console.log(` base: ${config.embedding.baseUrl}`);\n console.log(` model: ${config.embedding.model}`);\n console.log(` key: $${config.embedding.apiKeyEnv}`);\n } else {\n console.log(\" embed: (not configured)\");\n }\n console.log(`\nNext:\n import { createWolbargFromProjectConfig } from \"wolbarg\";\n const ctx = createWolbargFromProjectConfig();\n await ctx.ready();\n`);\n return 0;\n}\n\nexport async function initCommand(argv: string[]): Promise<number> {\n try {\n const parsed = parseInitArgs(argv);\n if (\"help\" in parsed) {\n printHelp();\n return 0;\n }\n return await runInit(parsed);\n } catch (err) {\n console.error(err instanceof Error ? err.message : err);\n return 1;\n }\n}\n\n/** Exposed for tests — builds config object without writing when needed. */\nexport function buildConfigFromFlags(options: InitCliOptions): WolbargProjectConfig {\n const config = defaultProjectConfig();\n config.organization = options.organization ?? DEFAULT_ORGANIZATION;\n const dbUrl = options.db ?? DEFAULT_SQLITE_DB_PATH;\n config.database = {\n provider: inferDbProvider(dbUrl, options.dbProvider),\n url: dbUrl,\n };\n if (!options.skipEmbedding) {\n const preset = getEmbeddingProviderPreset(options.provider ?? \"openai\");\n if (preset) {\n config.embedding = {\n provider: preset.id,\n baseUrl: options.baseUrl ?? preset.defaultBaseUrl,\n model: options.model ?? preset.defaultModel,\n apiKeyEnv: options.apiKeyEnv ?? preset.apiKeyEnv,\n };\n }\n }\n return config;\n}\n\nexport function resolveInitCwd(cwd?: string): string {\n return cwd ? resolve(cwd) : process.cwd();\n}\n","/**\n * Wolbarg CLI — `wolbarg <command>`\n */\n\nimport { SDK_VERSION } from \"../version.js\";\nimport { initCommand } from \"./init.js\";\n\nfunction printRootHelp(): void {\n console.log(`wolbarg ${SDK_VERSION}\n\nUsage:\n wolbarg init [options] Configure project database + embedding provider\n wolbarg --version Print version\n wolbarg --help Show help\n\nRun \\`wolbarg init --help\\` for init options.\n`);\n}\n\nexport async function cliMain(argv: string[]): Promise<number> {\n const [cmd, ...rest] = argv;\n\n if (!cmd || cmd === \"-h\" || cmd === \"--help\") {\n printRootHelp();\n return 0;\n }\n if (cmd === \"-V\" || cmd === \"--version\" || cmd === \"version\") {\n console.log(SDK_VERSION);\n return 0;\n }\n if (cmd === \"init\") {\n return initCommand(rest);\n }\n\n console.error(`Unknown command: ${cmd}`);\n printRootHelp();\n return 1;\n}\n\ncliMain(process.argv.slice(2))\n .then((code) => {\n process.exit(code);\n })\n .catch((err) => {\n console.error(err);\n process.exit(1);\n });\n"]}