vibora 0.1.13 → 0.1.15

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/bin/vibora.js CHANGED
@@ -441,7 +441,8 @@ async function handleTasksCommand(action, positional, flags) {
441
441
  }
442
442
 
443
443
  // cli/src/commands/up.ts
444
- import { spawn } from "child_process";
444
+ import { spawn, execSync } from "child_process";
445
+ import { existsSync as existsSync3 } from "fs";
445
446
  import { dirname as dirname2, join as join3 } from "path";
446
447
  import { fileURLToPath } from "url";
447
448
 
@@ -501,11 +502,29 @@ function getPort(portOverride) {
501
502
  }
502
503
 
503
504
  // cli/src/commands/up.ts
505
+ function isDtachInstalled() {
506
+ try {
507
+ execSync("which dtach", { stdio: "ignore" });
508
+ return true;
509
+ } catch {
510
+ return false;
511
+ }
512
+ }
504
513
  function getPackageRoot() {
505
514
  const currentFile = fileURLToPath(import.meta.url);
515
+ let dir = dirname2(currentFile);
516
+ for (let i = 0;i < 5; i++) {
517
+ if (existsSync3(join3(dir, "server", "index.js"))) {
518
+ return dir;
519
+ }
520
+ dir = dirname2(dir);
521
+ }
506
522
  return dirname2(dirname2(dirname2(currentFile)));
507
523
  }
508
524
  async function handleUpCommand(flags) {
525
+ if (!isDtachInstalled()) {
526
+ throw new CliError("MISSING_DEPENDENCY", "dtach is required but not installed. Install it with: brew install dtach (macOS) or apt install dtach (Linux)", ExitCodes.ERROR);
527
+ }
509
528
  const existingPid = readPid();
510
529
  if (existingPid && isProcessRunning(existingPid)) {
511
530
  throw new CliError("ALREADY_RUNNING", `Vibora server is already running (PID: ${existingPid})`, ExitCodes.ERROR);
@@ -513,7 +532,17 @@ async function handleUpCommand(flags) {
513
532
  const port = getPort(flags.port);
514
533
  const packageRoot = getPackageRoot();
515
534
  const serverPath = join3(packageRoot, "server", "index.js");
516
- const ptyLibPath = join3(packageRoot, "lib", "librust_pty.so");
535
+ const platform = process.platform;
536
+ const arch = process.arch;
537
+ let ptyLibName;
538
+ if (platform === "darwin") {
539
+ ptyLibName = arch === "arm64" ? "librust_pty_arm64.dylib" : "librust_pty.dylib";
540
+ } else if (platform === "win32") {
541
+ ptyLibName = "rust_pty.dll";
542
+ } else {
543
+ ptyLibName = arch === "arm64" ? "librust_pty_arm64.so" : "librust_pty.so";
544
+ }
545
+ const ptyLibPath = join3(packageRoot, "lib", ptyLibName);
517
546
  console.error("Starting Vibora server...");
518
547
  const serverProc = spawn("bun", [serverPath], {
519
548
  detached: true,
@@ -703,7 +732,7 @@ async function handleHealthCommand(flags) {
703
732
  import * as fs from "fs";
704
733
  import * as path from "path";
705
734
  import * as os from "os";
706
- import { execSync } from "child_process";
735
+ import { execSync as execSync2 } from "child_process";
707
736
  import { fileURLToPath as fileURLToPath2 } from "url";
708
737
  function getClaudeSettingsPath(global) {
709
738
  if (global) {
@@ -740,7 +769,7 @@ function getViboraHookPath() {
740
769
  for (const p of possiblePaths) {
741
770
  if (p === "vibora-plan-complete-hook") {
742
771
  try {
743
- execSync("which vibora-plan-complete-hook", { stdio: "pipe" });
772
+ execSync2("which vibora-plan-complete-hook", { stdio: "pipe" });
744
773
  return "vibora-plan-complete-hook";
745
774
  } catch {
746
775
  continue;
Binary file
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibora",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "description": "A lightweight PM cockpit for streamlining the software development lifecycle",
5
5
  "license": "PolyForm-Shield-1.0.0",
6
6
  "repository": {