vibora 0.1.13 → 0.1.14

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 (2) hide show
  1. package/bin/vibora.js +22 -3
  2. package/package.json +1 -1
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);
@@ -703,7 +722,7 @@ async function handleHealthCommand(flags) {
703
722
  import * as fs from "fs";
704
723
  import * as path from "path";
705
724
  import * as os from "os";
706
- import { execSync } from "child_process";
725
+ import { execSync as execSync2 } from "child_process";
707
726
  import { fileURLToPath as fileURLToPath2 } from "url";
708
727
  function getClaudeSettingsPath(global) {
709
728
  if (global) {
@@ -740,7 +759,7 @@ function getViboraHookPath() {
740
759
  for (const p of possiblePaths) {
741
760
  if (p === "vibora-plan-complete-hook") {
742
761
  try {
743
- execSync("which vibora-plan-complete-hook", { stdio: "pipe" });
762
+ execSync2("which vibora-plan-complete-hook", { stdio: "pipe" });
744
763
  return "vibora-plan-complete-hook";
745
764
  } catch {
746
765
  continue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibora",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "description": "A lightweight PM cockpit for streamlining the software development lifecycle",
5
5
  "license": "PolyForm-Shield-1.0.0",
6
6
  "repository": {