withvibe 0.1.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.
Files changed (62) hide show
  1. package/LICENSE +93 -0
  2. package/README.md +67 -0
  3. package/dist/api.js +29 -0
  4. package/dist/api.js.map +1 -0
  5. package/dist/assets/docker-compose.yml +130 -0
  6. package/dist/config.js +48 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/env-command.js +331 -0
  9. package/dist/env-command.js.map +1 -0
  10. package/dist/exec.js +35 -0
  11. package/dist/exec.js.map +1 -0
  12. package/dist/git-auth.js +64 -0
  13. package/dist/git-auth.js.map +1 -0
  14. package/dist/index.js +42 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/install/anthropic-validate.js +73 -0
  17. package/dist/install/anthropic-validate.js.map +1 -0
  18. package/dist/install/build-images.js +99 -0
  19. package/dist/install/build-images.js.map +1 -0
  20. package/dist/install/commands/build-images-cmd.js +68 -0
  21. package/dist/install/commands/build-images-cmd.js.map +1 -0
  22. package/dist/install/commands/configure.js +276 -0
  23. package/dist/install/commands/configure.js.map +1 -0
  24. package/dist/install/commands/lifecycle.js +129 -0
  25. package/dist/install/commands/lifecycle.js.map +1 -0
  26. package/dist/install/commands/uninstall.js +88 -0
  27. package/dist/install/commands/uninstall.js.map +1 -0
  28. package/dist/install/commands/upgrade.js +164 -0
  29. package/dist/install/commands/upgrade.js.map +1 -0
  30. package/dist/install/compose-rewriter.js +298 -0
  31. package/dist/install/compose-rewriter.js.map +1 -0
  32. package/dist/install/compose.js +118 -0
  33. package/dist/install/compose.js.map +1 -0
  34. package/dist/install/doctor.js +176 -0
  35. package/dist/install/doctor.js.map +1 -0
  36. package/dist/install/env-file.js +63 -0
  37. package/dist/install/env-file.js.map +1 -0
  38. package/dist/install/exec.js +32 -0
  39. package/dist/install/exec.js.map +1 -0
  40. package/dist/install/images.js +78 -0
  41. package/dist/install/images.js.map +1 -0
  42. package/dist/install/init.js +584 -0
  43. package/dist/install/init.js.map +1 -0
  44. package/dist/install/log.js +15 -0
  45. package/dist/install/log.js.map +1 -0
  46. package/dist/install/paths.js +26 -0
  47. package/dist/install/paths.js.map +1 -0
  48. package/dist/install/ports.js +23 -0
  49. package/dist/install/ports.js.map +1 -0
  50. package/dist/install/register.js +155 -0
  51. package/dist/install/register.js.map +1 -0
  52. package/dist/install/secrets.js +9 -0
  53. package/dist/install/secrets.js.map +1 -0
  54. package/dist/install/state.js +29 -0
  55. package/dist/install/state.js.map +1 -0
  56. package/dist/login.js +56 -0
  57. package/dist/login.js.map +1 -0
  58. package/dist/ports.js +33 -0
  59. package/dist/ports.js.map +1 -0
  60. package/dist/preflight.js +150 -0
  61. package/dist/preflight.js.map +1 -0
  62. package/package.json +38 -0
@@ -0,0 +1,584 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import prompts from "prompts";
4
+ import { runDoctor, printReport } from "./doctor.js";
5
+ import { log } from "./log.js";
6
+ import { randomPassword, randomSecret } from "./secrets.js";
7
+ import { serializeEnv, writeEnvFile } from "./env-file.js";
8
+ import { composePath, DEFAULT_INSTALL_DIR, DEFAULT_REPO_BASE_DIR, ensureDir, envPath, expandHome, } from "./paths.js";
9
+ import { defaultFeatures, writeState, } from "./state.js";
10
+ import { setNoPull, setTraefik, stripBuildBlocks } from "./compose-rewriter.js";
11
+ import { findFreePort } from "./ports.js";
12
+ import { runBuildImages } from "./commands/build-images-cmd.js";
13
+ import { runStart } from "./commands/lifecycle.js";
14
+ const ENV_KEY_ORDER = [
15
+ "POSTGRES_USER",
16
+ "POSTGRES_PASSWORD",
17
+ "POSTGRES_DB",
18
+ "INTERNAL_JWT_SECRET",
19
+ "ANTHROPIC_API_KEY",
20
+ "GOOGLE_CLIENT_ID",
21
+ "GOOGLE_CLIENT_SECRET",
22
+ "GITHUB_TOKEN",
23
+ "WEB_PUBLIC_URL",
24
+ "API_PUBLIC_URL",
25
+ "PUBLIC_HOST",
26
+ "WEB_HOST_PORT",
27
+ "API_HOST_PORT",
28
+ "REPO_BASE_DIR",
29
+ "LOG_LEVEL",
30
+ "WITHVIBE_VERSION",
31
+ "TRAEFIK_BASE_DOMAIN",
32
+ "TRAEFIK_ACME_EMAIL",
33
+ "TRAEFIK_HTTP_HOST_PORT",
34
+ "TRAEFIK_HTTPS_HOST_PORT",
35
+ ];
36
+ const ENV_COMMENTS = {
37
+ POSTGRES_USER: "Postgres credentials — used by both the postgres service and the api DATABASE_URL.",
38
+ INTERNAL_JWT_SECRET: "Signs session JWTs. Generated automatically. Rotating invalidates active sessions.",
39
+ ANTHROPIC_API_KEY: "Set later from the workspace UI (Settings → Anthropic). Leaving blank keeps agent runs disabled until you configure it.",
40
+ WEB_PUBLIC_URL: "Public-facing URLs — set to whatever the browser uses to reach the stack.",
41
+ WEB_HOST_PORT: "Host-side ports for the api/web containers. Default 3000/4000; auto-bumped by `init` when those are taken.",
42
+ REPO_BASE_DIR: "Where the api stores per-env clones. Bind-mounted into the api container at the SAME path (DooD path-parity).",
43
+ TRAEFIK_BASE_DOMAIN: "Traefik base domain (only used when Traefik is enabled).",
44
+ TRAEFIK_HTTP_HOST_PORT: "Host-side ports Traefik listens on. Default 80/443; auto-bumped on macOS where 80 is often taken by AirPlay.",
45
+ };
46
+ // Pick free host ports for api/web/Traefik. Scans upward from the standard
47
+ // values so installs on a host with :3000 already in use silently land on
48
+ // :3001 (etc.) instead of failing preflight.
49
+ async function pickPorts() {
50
+ const webHostPort = (await findFreePort(3000)) ?? 3000;
51
+ // Skip the just-picked web port when scanning for the api port.
52
+ const apiStart = webHostPort >= 4000 ? webHostPort + 1 : 4000;
53
+ const apiHostPort = (await findFreePort(apiStart)) ?? 4000;
54
+ const traefikHttp = (await findFreePort(80)) ?? 80;
55
+ const traefikHttps = (await findFreePort(443)) ?? 443;
56
+ return { webHostPort, apiHostPort, traefikHttp, traefikHttps };
57
+ }
58
+ async function buildDefaults(installDir) {
59
+ const ports = await pickPorts();
60
+ return {
61
+ installDir,
62
+ publicHost: "localhost",
63
+ webHostPort: ports.webHostPort,
64
+ apiHostPort: ports.apiHostPort,
65
+ webPublicUrl: `http://localhost:${ports.webHostPort}`,
66
+ apiPublicUrl: `http://localhost:${ports.apiHostPort}`,
67
+ repoBaseDir: path.join(installDir, "repos"),
68
+ enableQaBrowser: true,
69
+ enableCodeServer: true,
70
+ traefik: {
71
+ baseDomain: "localhost",
72
+ acmeEmail: "admin@localhost",
73
+ httpPort: ports.traefikHttp,
74
+ httpsPort: ports.traefikHttps,
75
+ },
76
+ };
77
+ }
78
+ export async function runInit(opts) {
79
+ log.header("withvibe install");
80
+ // 1. Preflight (always runs — there's no scenario where we want to skip this).
81
+ log.step("Running host preflight…");
82
+ const preflight = await runDoctor({
83
+ repoBaseDir: opts.installDir
84
+ ? path.join(opts.installDir, "repos")
85
+ : DEFAULT_REPO_BASE_DIR,
86
+ });
87
+ printReport(preflight);
88
+ if (!preflight.ok) {
89
+ log.fail("Preflight failed. Fix the items above and re-run `withvibe init`.");
90
+ process.exit(1);
91
+ }
92
+ // 2. Default vs custom — the only top-level question.
93
+ const preset = opts.yes ? "default" : await pickPreset();
94
+ // 3. Install dir — asked only in custom mode (default uses ~/.withvibe).
95
+ const installDir = opts.installDir
96
+ ? path.resolve(expandHome(opts.installDir))
97
+ : preset === "default"
98
+ ? DEFAULT_INSTALL_DIR
99
+ : await ask({
100
+ type: "text",
101
+ name: "v",
102
+ message: "Install directory (where .env, docker-compose.yml, and state live):",
103
+ initial: DEFAULT_INSTALL_DIR,
104
+ });
105
+ await ensureDir(installDir);
106
+ // 4. Mode — only the install source picker. Default = from-source if a
107
+ // repo root is detectable; otherwise we error out and ask the user to
108
+ // rerun in custom mode.
109
+ const mode = (opts.mode ?? (await pickMode(preset)));
110
+ // 5. Mode-specific paths.
111
+ let registry;
112
+ let source;
113
+ let bundle;
114
+ if (mode === "from-registry") {
115
+ if (preset === "default") {
116
+ registry = { namespace: "ghcr.io/withvibe", tag: "latest" };
117
+ }
118
+ else {
119
+ const namespace = await ask({
120
+ type: "text",
121
+ name: "v",
122
+ message: "Registry namespace for prebuilt images:",
123
+ initial: "ghcr.io/withvibe",
124
+ });
125
+ const tag = await ask({
126
+ type: "text",
127
+ name: "v",
128
+ message: "Image tag:",
129
+ initial: "latest",
130
+ });
131
+ registry = { namespace, tag };
132
+ }
133
+ }
134
+ else if (mode === "from-source") {
135
+ const guess = await guessRepoRoot();
136
+ if (preset === "default") {
137
+ if (!guess) {
138
+ log.fail("Default install picked from-source mode but couldn't auto-detect the repo root. " +
139
+ "Re-run with `withvibe init` and choose Custom, or pass --install-dir / clone the repo first.");
140
+ process.exit(1);
141
+ }
142
+ source = { repoPath: guess };
143
+ }
144
+ else {
145
+ const repoPath = await ask({
146
+ type: "text",
147
+ name: "v",
148
+ message: "Path to the withvibe source tree (will run pnpm install + build images):",
149
+ initial: guess ?? "",
150
+ validate: async (v) => {
151
+ const abs = path.resolve(expandHome(v.trim()));
152
+ try {
153
+ await fs.access(path.join(abs, "apps", "api", "Dockerfile"));
154
+ await fs.access(path.join(abs, "apps", "web", "Dockerfile"));
155
+ return true;
156
+ }
157
+ catch {
158
+ return `No apps/api/Dockerfile or apps/web/Dockerfile under ${abs}. Pick the repo root.`;
159
+ }
160
+ },
161
+ });
162
+ source = { repoPath: path.resolve(expandHome(repoPath)) };
163
+ }
164
+ }
165
+ else {
166
+ let bundlePath;
167
+ if (opts.bundlePath) {
168
+ bundlePath = opts.bundlePath;
169
+ }
170
+ else if (preset === "default") {
171
+ log.fail("Default install can't pick from-bundle without --bundle-path. Pass it, or re-run in Custom mode.");
172
+ process.exit(1);
173
+ }
174
+ else {
175
+ bundlePath = await ask({
176
+ type: "text",
177
+ name: "v",
178
+ message: "Path to the deploy bundle (.tar.gz or extracted directory):",
179
+ initial: "",
180
+ validate: (v) => v.trim().length === 0 ? "Path is required" : true,
181
+ });
182
+ }
183
+ const resolvedBundle = path.resolve(expandHome(bundlePath));
184
+ const bundleVersion = await readBundleVersion(resolvedBundle);
185
+ bundle = { bundlePath: resolvedBundle, version: bundleVersion };
186
+ }
187
+ // 6. Collect remaining answers (default preset uses computed defaults; custom prompts).
188
+ const answers = await collectAnswers(preset, installDir);
189
+ // 7. Generate secrets.
190
+ const internalJwtSecret = randomSecret(32);
191
+ const postgresPassword = randomPassword(24);
192
+ // 8. Build .env. Note: ANTHROPIC_API_KEY / GOOGLE_* / GITHUB_TOKEN are
193
+ // intentionally blank — the user configures those later from the UI.
194
+ const envValues = {
195
+ POSTGRES_USER: "withvibe",
196
+ POSTGRES_PASSWORD: postgresPassword,
197
+ POSTGRES_DB: "withvibe",
198
+ INTERNAL_JWT_SECRET: internalJwtSecret,
199
+ ANTHROPIC_API_KEY: "",
200
+ GOOGLE_CLIENT_ID: "",
201
+ GOOGLE_CLIENT_SECRET: "",
202
+ GITHUB_TOKEN: "",
203
+ WEB_PUBLIC_URL: answers.webPublicUrl,
204
+ API_PUBLIC_URL: answers.apiPublicUrl,
205
+ PUBLIC_HOST: answers.publicHost,
206
+ WEB_HOST_PORT: String(answers.webHostPort),
207
+ API_HOST_PORT: String(answers.apiHostPort),
208
+ REPO_BASE_DIR: expandHome(answers.repoBaseDir),
209
+ LOG_LEVEL: "info",
210
+ };
211
+ if (bundle?.version) {
212
+ envValues.WITHVIBE_VERSION = bundle.version;
213
+ }
214
+ if (answers.traefik) {
215
+ envValues.TRAEFIK_BASE_DOMAIN = answers.traefik.baseDomain;
216
+ envValues.TRAEFIK_ACME_EMAIL = answers.traefik.acmeEmail;
217
+ envValues.TRAEFIK_HTTP_HOST_PORT = String(answers.traefik.httpPort);
218
+ envValues.TRAEFIK_HTTPS_HOST_PORT = String(answers.traefik.httpsPort);
219
+ }
220
+ await ensureDir(expandHome(answers.repoBaseDir));
221
+ const envText = serializeEnv(envValues, ENV_KEY_ORDER, ENV_COMMENTS);
222
+ await writeEnvFile(envPath(installDir), envText);
223
+ log.ok(`Wrote ${envPath(installDir)} (chmod 600)`);
224
+ // 9. Materialize compose. Pass the Traefik base domain so the rewriter
225
+ // picks the right variant (TLS for real domains, HTTP-only for localhost).
226
+ await materializeCompose(installDir, mode, source, bundle, answers.traefik);
227
+ // 10. Persist install state. googleOAuth always starts off; user enables
228
+ // it later via `withvibe configure` (which collects + saves the creds).
229
+ const state = {
230
+ version: 1,
231
+ mode,
232
+ installDir,
233
+ installedAt: new Date().toISOString(),
234
+ features: {
235
+ ...defaultFeatures(),
236
+ traefik: !!answers.traefik,
237
+ qaBrowser: answers.enableQaBrowser,
238
+ codeServer: answers.enableCodeServer,
239
+ googleOAuth: false,
240
+ },
241
+ registry,
242
+ source,
243
+ bundle,
244
+ traefik: answers.traefik ?? undefined,
245
+ };
246
+ await writeState(installDir, state);
247
+ log.ok(`Saved install state to ${path.join(installDir, "install.json")}`);
248
+ // 11. Final summary.
249
+ log.header("Install initialized");
250
+ log.info(`Mode: ${mode}`);
251
+ log.info(`Install dir: ${installDir}`);
252
+ log.info(`REPO_BASE_DIR: ${envValues.REPO_BASE_DIR}`);
253
+ log.info(`Web URL: ${answers.webPublicUrl} (host port ${answers.webHostPort})`);
254
+ log.info(`API URL: ${answers.apiPublicUrl} (host port ${answers.apiHostPort})`);
255
+ log.info(`Traefik: ${answers.traefik
256
+ ? `enabled (${answers.traefik.baseDomain}, ports ${answers.traefik.httpPort}/${answers.traefik.httpsPort})`
257
+ : "disabled"}`);
258
+ log.info(`QA browser: ${answers.enableQaBrowser ? "enabled" : "disabled"}`);
259
+ log.info(`code-server: ${answers.enableCodeServer ? "enabled" : "disabled"}`);
260
+ // 12. Decide whether to continue into build-images + start.
261
+ // Default preset auto-continues (one-click is the whole point).
262
+ // Custom preset asks. Both honor --no-build / --no-start.
263
+ const wantBuild = !opts.noBuild &&
264
+ (preset === "default" ||
265
+ (await confirm("Build images now? (~5–10 min the first time)", true)));
266
+ const wantStart = !opts.noStart &&
267
+ (preset === "default" ||
268
+ (await confirm("Start the stack now (docker compose up -d)?", true)));
269
+ if (wantBuild) {
270
+ console.log("");
271
+ log.header("Building images");
272
+ try {
273
+ await runBuildImages({ installDir });
274
+ }
275
+ catch (e) {
276
+ log.fail(`build-images failed: ${e.message}`);
277
+ log.dim("Re-run with `withvibe build-images` once you've fixed it.");
278
+ process.exit(1);
279
+ }
280
+ }
281
+ if (wantStart) {
282
+ console.log("");
283
+ await runStart({ installDir });
284
+ }
285
+ console.log("");
286
+ if (!wantBuild || !wantStart) {
287
+ log.info("Remaining steps:");
288
+ if (!wantBuild)
289
+ log.dim(` withvibe build-images # ${imageStepHint(mode)}`);
290
+ if (!wantStart)
291
+ log.dim(` withvibe start # docker compose up -d + health gate`);
292
+ log.dim(` withvibe status # confirm services + URLs`);
293
+ console.log("");
294
+ }
295
+ log.info("Configure Anthropic / Google OAuth / GitHub credentials later from the UI (Workspace Settings).");
296
+ }
297
+ // Bundles include a `bundle.json` next to images.tar with the image tag
298
+ // they were saved under. Returns undefined for legacy bundles without it
299
+ // (callers will fall back to :latest via compose's WITHVIBE_VERSION default).
300
+ async function readBundleVersion(bundlePath) {
301
+ const candidate = bundlePath.endsWith(".tar.gz")
302
+ ? path.join(path.dirname(bundlePath), "bundle.json")
303
+ : path.join(bundlePath, "bundle.json");
304
+ try {
305
+ const text = await fs.readFile(candidate, "utf8");
306
+ const parsed = JSON.parse(text);
307
+ if (typeof parsed.version === "string" && parsed.version.length > 0) {
308
+ return parsed.version;
309
+ }
310
+ }
311
+ catch {
312
+ // No bundle.json — older bundle format. Compose default kicks in.
313
+ }
314
+ return undefined;
315
+ }
316
+ function imageStepHint(mode) {
317
+ switch (mode) {
318
+ case "from-source":
319
+ return "build api/web/sidecars from source";
320
+ case "from-bundle":
321
+ return "load images from the bundle's images.tar";
322
+ case "from-registry":
323
+ return "pull api/web/sidecars from the registry";
324
+ }
325
+ }
326
+ async function pickPreset() {
327
+ const res = await prompts({
328
+ type: "select",
329
+ name: "v",
330
+ message: "How do you want to install?",
331
+ choices: [
332
+ {
333
+ title: "Default (recommended) — one-click install with sane defaults",
334
+ description: "localhost URLs, all sidecars + Traefik on. Anthropic/Google/GitHub keys configured later from the UI.",
335
+ value: "default",
336
+ },
337
+ {
338
+ title: "Custom",
339
+ description: "Pick public URLs, ports, sidecars, Traefik, install dir, etc.",
340
+ value: "custom",
341
+ },
342
+ ],
343
+ initial: 0,
344
+ }, {
345
+ onCancel: () => {
346
+ log.fail("Cancelled.");
347
+ process.exit(1);
348
+ },
349
+ });
350
+ return res.v;
351
+ }
352
+ async function pickMode(preset) {
353
+ // Default install: try from-source first (if we can detect the repo root),
354
+ // otherwise from-registry. This keeps the one-click flow functional whether
355
+ // the user is running from a clone or from a fresh `npm i -g withvibe`.
356
+ if (preset === "default") {
357
+ const guess = await guessRepoRoot();
358
+ return guess ? "from-source" : "from-registry";
359
+ }
360
+ const res = await prompts({
361
+ type: "select",
362
+ name: "v",
363
+ message: "How do you want to obtain the images?",
364
+ choices: [
365
+ {
366
+ title: "From source (build images locally)",
367
+ description: "Use an existing source tree and run docker build.",
368
+ value: "from-source",
369
+ },
370
+ {
371
+ title: "From registry (pull prebuilt images)",
372
+ description: "Default: ghcr.io/withvibe.",
373
+ value: "from-registry",
374
+ },
375
+ {
376
+ title: "From bundle (offline tarball)",
377
+ description: "Use scripts/build-bundle.sh output. No network registry needed.",
378
+ value: "from-bundle",
379
+ },
380
+ ],
381
+ initial: 0,
382
+ });
383
+ if (!res.v) {
384
+ log.fail("Cancelled.");
385
+ process.exit(1);
386
+ }
387
+ return res.v;
388
+ }
389
+ async function collectAnswers(preset, installDir) {
390
+ const d = await buildDefaults(installDir);
391
+ if (preset === "default") {
392
+ // Tell the user when we had to bump a port off its standard value so
393
+ // they're not surprised when status shows :3001 instead of :3000.
394
+ if (d.webHostPort !== 3000)
395
+ log.warn(`Port 3000 in use — web bound to :${d.webHostPort}.`);
396
+ if (d.apiHostPort !== 4000)
397
+ log.warn(`Port 4000 in use — api bound to :${d.apiHostPort}.`);
398
+ if (d.traefik.httpPort !== 80)
399
+ log.warn(`Port 80 in use — Traefik HTTP bound to :${d.traefik.httpPort}.`);
400
+ return { ...d, traefik: d.traefik };
401
+ }
402
+ const publicHost = await ask({
403
+ type: "text",
404
+ name: "v",
405
+ message: "Public host (the hostname/IP browsers use to reach this VM):",
406
+ initial: d.publicHost,
407
+ });
408
+ const webHostPort = await askPort("Host port for the web app:", d.webHostPort);
409
+ const apiHostPort = await askPort("Host port for the api:", d.apiHostPort);
410
+ const webPublicUrl = await ask({
411
+ type: "text",
412
+ name: "v",
413
+ message: "Public URL of the web app:",
414
+ initial: `http://${publicHost}:${webHostPort}`,
415
+ });
416
+ const apiPublicUrl = await ask({
417
+ type: "text",
418
+ name: "v",
419
+ message: "Public URL of the api:",
420
+ initial: `http://${publicHost}:${apiHostPort}`,
421
+ });
422
+ // Traefik defaults to ON. With a localhost base domain we emit an HTTP-only
423
+ // Traefik (no ACME); with a real domain we emit the full HTTPS config.
424
+ const useTraefik = await confirm("Enable Traefik (reverse proxy + subdomain routing)?", true);
425
+ let traefik = null;
426
+ if (useTraefik) {
427
+ const baseDomain = await ask({
428
+ type: "text",
429
+ name: "v",
430
+ message: "Traefik base domain (use `localhost` for local dev, or e.g. withvibe.example.com for production):",
431
+ initial: d.traefik.baseDomain,
432
+ validate: (v) => /^[a-z0-9.-]+(\.[a-z]{2,}|^localhost)$/i.test(v.trim()) ||
433
+ v.trim().toLowerCase() === "localhost"
434
+ ? true
435
+ : "Enter `localhost` or a real domain like withvibe.example.com",
436
+ });
437
+ const acmeEmail = await ask({
438
+ type: "text",
439
+ name: "v",
440
+ message: "ACME email (Let's Encrypt — only used when the base domain is a real public domain):",
441
+ initial: d.traefik.acmeEmail,
442
+ validate: (v) => /.+@.+/.test(v.trim()) ? true : "Enter a valid email",
443
+ });
444
+ const httpPort = await askPort("Traefik HTTP host port:", d.traefik.httpPort);
445
+ const httpsPort = await askPort("Traefik HTTPS host port:", d.traefik.httpsPort);
446
+ traefik = {
447
+ baseDomain: baseDomain.trim(),
448
+ acmeEmail: acmeEmail.trim(),
449
+ httpPort,
450
+ httpsPort,
451
+ };
452
+ }
453
+ const enableQaBrowser = await confirm("Enable the QA browser sidecar image (used by QA agent for browser automation)?", d.enableQaBrowser);
454
+ const enableCodeServer = await confirm("Enable the code-server sidecar image (browser-based VSCode per env)?", d.enableCodeServer);
455
+ const repoBaseDir = await ask({
456
+ type: "text",
457
+ name: "v",
458
+ message: "REPO_BASE_DIR (host path for per-env clones, bind-mounted to api):",
459
+ initial: d.repoBaseDir,
460
+ });
461
+ return {
462
+ installDir: d.installDir,
463
+ publicHost,
464
+ webHostPort,
465
+ apiHostPort,
466
+ webPublicUrl,
467
+ apiPublicUrl,
468
+ repoBaseDir,
469
+ enableQaBrowser,
470
+ enableCodeServer,
471
+ traefik,
472
+ };
473
+ }
474
+ async function askPort(message, initial) {
475
+ const v = await ask({
476
+ type: "text",
477
+ name: "v",
478
+ message,
479
+ initial: String(initial),
480
+ validate: (raw) => {
481
+ const n = Number(raw.trim());
482
+ if (!Number.isInteger(n) || n < 1 || n > 65535)
483
+ return "Enter a port between 1 and 65535";
484
+ return true;
485
+ },
486
+ });
487
+ return Number(v.trim());
488
+ }
489
+ // Best-effort guess of the source tree root. Tries cwd → walk up from cwd
490
+ // → walk up from the running script's location (catches `pnpm link --global`
491
+ // installs where the binary lives inside the source tree). Returns null
492
+ // when nothing convincing is found.
493
+ async function guessRepoRoot() {
494
+ const candidates = [process.cwd()];
495
+ const scriptDir = path.dirname(new URL(import.meta.url).pathname);
496
+ candidates.push(scriptDir);
497
+ for (const start of candidates) {
498
+ let cur = start;
499
+ for (let i = 0; i < 8; i++) {
500
+ const ok = await isRepoRoot(cur);
501
+ if (ok)
502
+ return cur;
503
+ const parent = path.dirname(cur);
504
+ if (parent === cur)
505
+ break;
506
+ cur = parent;
507
+ }
508
+ }
509
+ return null;
510
+ }
511
+ async function isRepoRoot(p) {
512
+ try {
513
+ await fs.access(path.join(p, "apps", "api", "Dockerfile"));
514
+ await fs.access(path.join(p, "apps", "web", "Dockerfile"));
515
+ await fs.access(path.join(p, "pnpm-workspace.yaml"));
516
+ return true;
517
+ }
518
+ catch {
519
+ return false;
520
+ }
521
+ }
522
+ async function materializeCompose(installDir, mode, source, bundle, traefik) {
523
+ const dst = composePath(installDir);
524
+ // Locate an existing docker-compose.yml and copy it. We don't generate a
525
+ // brand-new one — we reuse the project's tested manifest so `init` never
526
+ // drifts from what `docker compose up` will run.
527
+ const candidates = [];
528
+ if (mode === "from-source" && source?.repoPath) {
529
+ candidates.push(path.join(source.repoPath, "docker-compose.yml"));
530
+ }
531
+ else if (mode === "from-bundle" && bundle?.bundlePath) {
532
+ candidates.push(path.join(bundle.bundlePath, "docker-compose.yml"));
533
+ }
534
+ // Fallbacks: the package's own assets dir (shipped with the npm package),
535
+ // and the repo we're currently running from (dev install).
536
+ const here = path.dirname(new URL(import.meta.url).pathname);
537
+ candidates.push(path.join(here, "..", "assets", "docker-compose.yml"));
538
+ candidates.push(path.join(here, "..", "..", "..", "..", "docker-compose.yml"));
539
+ for (const c of candidates) {
540
+ try {
541
+ const raw = await fs.readFile(c, "utf8");
542
+ // The repo's compose has `build:` blocks for the dev/from-source path.
543
+ // The materialized copy lives in the install dir with no source tree
544
+ // beside it, so strip the build blocks and pin pull_policy:never on
545
+ // our images — `withvibe build-images` is the only legitimate way to
546
+ // get the api/web images locally. Then layer in Traefik if requested.
547
+ let text = setNoPull(stripBuildBlocks(raw));
548
+ text = setTraefik(text, !!traefik, traefik?.baseDomain);
549
+ await fs.writeFile(dst, text);
550
+ log.ok(`Copied compose file from ${c}`);
551
+ return;
552
+ }
553
+ catch {
554
+ // try next
555
+ }
556
+ }
557
+ log.warn(`No docker-compose.yml found yet. You'll need to drop one at ${dst} before \`compose up\`.`);
558
+ }
559
+ // Wrappers around prompts() that exit the process on Ctrl+C instead of
560
+ // returning undefined and letting the caller proceed with garbage.
561
+ async function ask(q) {
562
+ const res = await prompts(q, {
563
+ onCancel: () => {
564
+ log.fail("Cancelled.");
565
+ process.exit(1);
566
+ },
567
+ });
568
+ const v = res.v;
569
+ if (typeof v !== "string") {
570
+ log.fail("Cancelled.");
571
+ process.exit(1);
572
+ }
573
+ return v;
574
+ }
575
+ async function confirm(message, initial) {
576
+ const res = await prompts({ type: "confirm", name: "v", message, initial }, {
577
+ onCancel: () => {
578
+ log.fail("Cancelled.");
579
+ process.exit(1);
580
+ },
581
+ });
582
+ return !!res.v;
583
+ }
584
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/install/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import chalk from "chalk";
2
+ export const log = {
3
+ info: (msg) => console.log(msg),
4
+ ok: (msg) => console.log(chalk.green("✓"), msg),
5
+ warn: (msg) => console.log(chalk.yellow("!"), msg),
6
+ fail: (msg) => console.log(chalk.red("✗"), msg),
7
+ step: (msg) => console.log(chalk.cyan("→"), msg),
8
+ dim: (msg) => console.log(chalk.dim(msg)),
9
+ header: (msg) => {
10
+ console.log("");
11
+ console.log(chalk.bold.cyan(msg));
12
+ console.log(chalk.dim("─".repeat(Math.max(8, msg.length))));
13
+ },
14
+ };
15
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/install/log.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;IACvC,EAAE,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IACvD,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAC1D,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IACvD,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IACxD,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,GAAW,EAAE,EAAE;QACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;CACF,CAAC"}
@@ -0,0 +1,26 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ import { promises as fs } from "node:fs";
4
+ export const DEFAULT_INSTALL_DIR = path.join(os.homedir(), ".withvibe");
5
+ export const DEFAULT_REPO_BASE_DIR = path.join(DEFAULT_INSTALL_DIR, "repos");
6
+ export const STATE_FILENAME = "install.json";
7
+ export const ENV_FILENAME = ".env";
8
+ export const COMPOSE_FILENAME = "docker-compose.yml";
9
+ export function expandHome(p) {
10
+ if (p.startsWith("~"))
11
+ return path.join(os.homedir(), p.slice(1));
12
+ return p;
13
+ }
14
+ export async function ensureDir(p) {
15
+ await fs.mkdir(p, { recursive: true });
16
+ }
17
+ export function statePath(installDir) {
18
+ return path.join(installDir, STATE_FILENAME);
19
+ }
20
+ export function envPath(installDir) {
21
+ return path.join(installDir, ENV_FILENAME);
22
+ }
23
+ export function composePath(installDir) {
24
+ return path.join(installDir, COMPOSE_FILENAME);
25
+ }
26
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/install/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AACxE,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;AAC7E,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAC;AAC7C,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC;AACnC,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAErD,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,CAAS;IACvC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,UAAkB;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,UAAkB;IACxC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;AACjD,CAAC"}