omo-suites 1.7.5 → 1.7.7

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,18 @@ All notable changes to OMO Suites will be documented in this file.
5
5
  Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
  This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.7.7] - 2026-03-07
9
+
10
+ ### Fixed
11
+ - Launchboard start now works on Windows — replaced `bash setup.sh` with cross-platform TypeScript logic
12
+ - Deps install, DB setup, and process management all work without bash
13
+
14
+ ## [1.7.6] - 2026-03-07
15
+
16
+ ### Fixed
17
+ - Config detection now checks `opencode.json`, `.opencode/opencode.json`, and `~/.config/opencode/opencode.json` (was only checking `.opencode.json`)
18
+ - Doctor now also checks for `oh-my-opencode.json`
19
+
8
20
  ## [1.7.5] - 2026-03-07
9
21
 
10
22
  ### Added
package/dist/cli/omocs.js CHANGED
@@ -1999,7 +1999,10 @@ import { join as join3, resolve as resolve3, dirname as dirname3 } from "path";
1999
1999
  import { homedir as homedir3 } from "os";
2000
2000
  function getConfigPaths() {
2001
2001
  return [
2002
+ join3(process.cwd(), "opencode.json"),
2002
2003
  join3(process.cwd(), ".opencode.json"),
2004
+ join3(process.cwd(), ".opencode", "opencode.json"),
2005
+ join3(homedir3(), ".config", "opencode", "opencode.json"),
2003
2006
  join3(homedir3(), ".opencode.json"),
2004
2007
  join3(homedir3(), ".config", "opencode", "config.json")
2005
2008
  ];
@@ -2395,6 +2398,8 @@ var init_lsp = __esm(() => {
2395
2398
  });
2396
2399
 
2397
2400
  // src/tui/views/doctor.ts
2401
+ import { existsSync as existsSync4 } from "fs";
2402
+ import { join as join4 } from "path";
2398
2403
  function initialDoctorState() {
2399
2404
  return {
2400
2405
  results: [],
@@ -2473,14 +2478,32 @@ async function runDoctorChecks(state, onProgress) {
2473
2478
  status: foundKeys.length > 0 ? "pass" : "warn",
2474
2479
  message: foundKeys.length > 0 ? `${foundKeys.length} key(s) in environment` : "No API keys in environment"
2475
2480
  });
2476
- state.currentCheck = ".opencode.json";
2481
+ state.currentCheck = "opencode.json";
2477
2482
  onProgress();
2478
2483
  const ocConfig = await readOpenCodeConfig();
2479
2484
  addResult({
2480
- name: ".opencode.json",
2485
+ name: "opencode.json",
2481
2486
  status: ocConfig ? "pass" : "warn",
2482
2487
  message: ocConfig ? `Found at ${ocConfig.path}` : "Not found"
2483
2488
  });
2489
+ state.currentCheck = "oh-my-opencode.json";
2490
+ onProgress();
2491
+ const omoConfigPaths = [
2492
+ join4(process.cwd(), "oh-my-opencode.json"),
2493
+ join4(process.cwd(), ".opencode", "oh-my-opencode.json")
2494
+ ];
2495
+ let omoConfigPath = null;
2496
+ for (const p of omoConfigPaths) {
2497
+ if (existsSync4(p)) {
2498
+ omoConfigPath = p;
2499
+ break;
2500
+ }
2501
+ }
2502
+ addResult({
2503
+ name: "oh-my-opencode.json",
2504
+ status: omoConfigPath ? "pass" : "warn",
2505
+ message: omoConfigPath ? `Found at ${omoConfigPath}` : "Not found (optional)"
2506
+ });
2484
2507
  state.currentCheck = "LSP Servers";
2485
2508
  onProgress();
2486
2509
  let lspInstalled = 0;
@@ -2557,15 +2580,15 @@ var init_doctor = __esm(() => {
2557
2580
  });
2558
2581
 
2559
2582
  // src/tui/views/stats.ts
2560
- import { existsSync as existsSync4, readFileSync as readFileSync6 } from "fs";
2561
- import { join as join4 } from "path";
2583
+ import { existsSync as existsSync5, readFileSync as readFileSync6 } from "fs";
2584
+ import { join as join5 } from "path";
2562
2585
  import { homedir as homedir4 } from "os";
2563
2586
  function initialStatsState() {
2564
2587
  return { loaded: false, data: null };
2565
2588
  }
2566
2589
  async function loadStats(state) {
2567
- const statsPath = join4(homedir4(), ".omocs", "stats.json");
2568
- if (!existsSync4(statsPath)) {
2590
+ const statsPath = join5(homedir4(), ".omocs", "stats.json");
2591
+ if (!existsSync5(statsPath)) {
2569
2592
  state.data = null;
2570
2593
  state.loaded = true;
2571
2594
  return;
@@ -2951,11 +2974,11 @@ function lspCommand(args) {
2951
2974
  return [dim(`Usage: /lsp [detect|list]`)];
2952
2975
  }
2953
2976
  async function statsCommand() {
2954
- const { existsSync: existsSync5 } = await import("fs");
2955
- const { join: join5 } = await import("path");
2977
+ const { existsSync: existsSync6 } = await import("fs");
2978
+ const { join: join6 } = await import("path");
2956
2979
  const { homedir: homedir5 } = await import("os");
2957
- const statsPath = join5(homedir5(), ".omocs", "stats.json");
2958
- if (!existsSync5(statsPath)) {
2980
+ const statsPath = join6(homedir5(), ".omocs", "stats.json");
2981
+ if (!existsSync6(statsPath)) {
2959
2982
  return [
2960
2983
  goldBold("═══ Stats ═══"),
2961
2984
  "",
@@ -8324,7 +8347,7 @@ __export(exports_ui, {
8324
8347
  createTable: () => createTable,
8325
8348
  bullet: () => bullet
8326
8349
  });
8327
- import { readFileSync as readFileSync7, existsSync as existsSync5 } from "fs";
8350
+ import { readFileSync as readFileSync7, existsSync as existsSync6 } from "fs";
8328
8351
  import { dirname as dirname4, resolve as resolve4 } from "path";
8329
8352
  import { fileURLToPath as fileURLToPath3 } from "url";
8330
8353
  function getVersion() {
@@ -8332,7 +8355,7 @@ function getVersion() {
8332
8355
  let dir = dirname4(fileURLToPath3(import.meta.url));
8333
8356
  for (let i = 0;i < 5; i++) {
8334
8357
  const candidate = resolve4(dir, "package.json");
8335
- if (existsSync5(candidate)) {
8358
+ if (existsSync6(candidate)) {
8336
8359
  return JSON.parse(readFileSync7(candidate, "utf-8")).version || "?";
8337
8360
  }
8338
8361
  dir = dirname4(dir);
@@ -33257,28 +33280,28 @@ var init_esm17 = __esm(() => {
33257
33280
  });
33258
33281
 
33259
33282
  // src/utils/detect.ts
33260
- import { existsSync as existsSync6, readdirSync, readFileSync as readFileSync9 } from "fs";
33261
- import { join as join5 } from "path";
33283
+ import { existsSync as existsSync7, readdirSync, readFileSync as readFileSync9 } from "fs";
33284
+ import { join as join6 } from "path";
33262
33285
  function fileOrDirExists(base, name) {
33263
- const full = join5(base, name);
33264
- return existsSync6(full);
33286
+ const full = join6(base, name);
33287
+ return existsSync7(full);
33265
33288
  }
33266
33289
  function detectPackageManager(base) {
33267
- if (existsSync6(join5(base, "bun.lockb")) || existsSync6(join5(base, "bun.lock")))
33290
+ if (existsSync7(join6(base, "bun.lockb")) || existsSync7(join6(base, "bun.lock")))
33268
33291
  return "bun";
33269
- if (existsSync6(join5(base, "pnpm-lock.yaml")))
33292
+ if (existsSync7(join6(base, "pnpm-lock.yaml")))
33270
33293
  return "pnpm";
33271
- if (existsSync6(join5(base, "yarn.lock")))
33294
+ if (existsSync7(join6(base, "yarn.lock")))
33272
33295
  return "yarn";
33273
- if (existsSync6(join5(base, "package-lock.json")))
33296
+ if (existsSync7(join6(base, "package-lock.json")))
33274
33297
  return "npm";
33275
- if (existsSync6(join5(base, "Pipfile.lock")))
33298
+ if (existsSync7(join6(base, "Pipfile.lock")))
33276
33299
  return "pipenv";
33277
- if (existsSync6(join5(base, "poetry.lock")))
33300
+ if (existsSync7(join6(base, "poetry.lock")))
33278
33301
  return "poetry";
33279
- if (existsSync6(join5(base, "Cargo.lock")))
33302
+ if (existsSync7(join6(base, "Cargo.lock")))
33280
33303
  return "cargo";
33281
- if (existsSync6(join5(base, "go.sum")))
33304
+ if (existsSync7(join6(base, "go.sum")))
33282
33305
  return "go";
33283
33306
  return null;
33284
33307
  }
@@ -33389,26 +33412,26 @@ var init_detect = __esm(() => {
33389
33412
 
33390
33413
  // src/utils/launchboard-resolver.ts
33391
33414
  import { execSync as execSync3 } from "child_process";
33392
- import { existsSync as existsSync7, mkdirSync as mkdirSync4, rmSync } from "fs";
33415
+ import { existsSync as existsSync8, mkdirSync as mkdirSync4, rmSync } from "fs";
33393
33416
  import { resolve as resolve5, dirname as dirname5 } from "path";
33394
33417
  import { homedir as homedir5 } from "os";
33395
33418
  function resolveLaunchboardDir() {
33396
33419
  const bundledDir = resolve5(dirname5(new URL(import.meta.url).pathname), "../../packages/launchboard");
33397
- if (existsSync7(bundledDir)) {
33420
+ if (existsSync8(bundledDir)) {
33398
33421
  return { dir: bundledDir };
33399
33422
  }
33400
33423
  const persistentDir = resolve5(homedir5(), ".omocs", "launchboard");
33401
- if (existsSync7(persistentDir)) {
33424
+ if (existsSync8(persistentDir)) {
33402
33425
  return { dir: persistentDir };
33403
33426
  }
33404
33427
  const cloneSpinner = ora("Downloading Launchboard from GitHub...").start();
33405
33428
  const tmpDir = resolve5(homedir5(), ".omocs", ".launchboard-clone-tmp");
33406
33429
  try {
33407
33430
  const omocsDir = resolve5(homedir5(), ".omocs");
33408
- if (!existsSync7(omocsDir)) {
33431
+ if (!existsSync8(omocsDir)) {
33409
33432
  mkdirSync4(omocsDir, { recursive: true });
33410
33433
  }
33411
- if (existsSync7(tmpDir)) {
33434
+ if (existsSync8(tmpDir)) {
33412
33435
  cleanupDir(tmpDir);
33413
33436
  }
33414
33437
  execSync3(`git clone ${GITHUB_REPO} --depth 1 "${tmpDir}"`, {
@@ -33416,7 +33439,7 @@ function resolveLaunchboardDir() {
33416
33439
  timeout: 120000
33417
33440
  });
33418
33441
  const srcDir = resolve5(tmpDir, "packages", "launchboard");
33419
- if (existsSync7(srcDir)) {
33442
+ if (existsSync8(srcDir)) {
33420
33443
  copyDir(srcDir, persistentDir);
33421
33444
  cloneSpinner.succeed("Launchboard downloaded from GitHub");
33422
33445
  cleanupDir(tmpDir);
@@ -33447,7 +33470,7 @@ function copyDir(src, dest) {
33447
33470
  }
33448
33471
  }
33449
33472
  function cleanupDir(dir) {
33450
- if (!existsSync7(dir))
33473
+ if (!existsSync8(dir))
33451
33474
  return;
33452
33475
  try {
33453
33476
  rmSync(dir, { recursive: true, force: true });
@@ -33466,7 +33489,7 @@ var init_launchboard_resolver = __esm(() => {
33466
33489
 
33467
33490
  // src/commands/init.ts
33468
33491
  import { execSync as execSync4 } from "child_process";
33469
- import { existsSync as existsSync8, readFileSync as readFileSync10, writeFileSync as writeFileSync5, mkdirSync as mkdirSync5 } from "fs";
33492
+ import { existsSync as existsSync9, readFileSync as readFileSync10, writeFileSync as writeFileSync5, mkdirSync as mkdirSync5 } from "fs";
33470
33493
  import { resolve as resolve6, dirname as dirname6 } from "path";
33471
33494
  function registerInitCommand(program2) {
33472
33495
  program2.command("init").description("Interactive setup wizard — configure OMOCS for the first time").option("-f, --force", "Overwrite existing configuration").action(async (options) => {
@@ -33512,7 +33535,7 @@ function registerInitCommand(program2) {
33512
33535
  try {
33513
33536
  const opencodeConfigPath = findOpencodeConfig();
33514
33537
  let opencodeConfig = {};
33515
- if (existsSync8(opencodeConfigPath)) {
33538
+ if (existsSync9(opencodeConfigPath)) {
33516
33539
  opencodeConfig = JSON.parse(readFileSync10(opencodeConfigPath, "utf-8"));
33517
33540
  }
33518
33541
  if (!opencodeConfig.plugin)
@@ -33524,7 +33547,7 @@ function registerInitCommand(program2) {
33524
33547
  opencodeConfig.plugin.push("omocs");
33525
33548
  }
33526
33549
  const configDir = dirname6(opencodeConfigPath);
33527
- if (!existsSync8(configDir)) {
33550
+ if (!existsSync9(configDir)) {
33528
33551
  mkdirSync5(configDir, { recursive: true });
33529
33552
  }
33530
33553
  writeFileSync5(opencodeConfigPath, JSON.stringify(opencodeConfig, null, 2));
@@ -33556,7 +33579,7 @@ function registerInitCommand(program2) {
33556
33579
  lbSpinner.fail("Failed to install backend deps");
33557
33580
  }
33558
33581
  const frontendDir = resolve6(lbDir, "frontend");
33559
- if (existsSync8(frontendDir)) {
33582
+ if (existsSync9(frontendDir)) {
33560
33583
  const feSpinner = ora("Installing frontend dependencies...").start();
33561
33584
  try {
33562
33585
  execSync4("bun install", { cwd: frontendDir, stdio: "pipe" });
@@ -33566,7 +33589,7 @@ function registerInitCommand(program2) {
33566
33589
  }
33567
33590
  }
33568
33591
  const dbPath = resolve6(lbDir, "launchboard.db");
33569
- if (!existsSync8(dbPath)) {
33592
+ if (!existsSync9(dbPath)) {
33570
33593
  const dbSpinner = ora("Creating database...").start();
33571
33594
  try {
33572
33595
  execSync4("bunx drizzle-kit push", { cwd: lbDir, stdio: "pipe" });
@@ -33660,7 +33683,7 @@ function registerInitCommand(program2) {
33660
33683
  try {
33661
33684
  const opencodeConfigPath = findOpencodeConfig();
33662
33685
  let opencodeConfig = {};
33663
- if (existsSync8(opencodeConfigPath)) {
33686
+ if (existsSync9(opencodeConfigPath)) {
33664
33687
  opencodeConfig = JSON.parse(readFileSync10(opencodeConfigPath, "utf-8"));
33665
33688
  }
33666
33689
  if (!opencodeConfig.plugin)
@@ -33669,7 +33692,7 @@ function registerInitCommand(program2) {
33669
33692
  opencodeConfig.plugin.push("opencode-antigravity-auth@latest");
33670
33693
  }
33671
33694
  const configDir = dirname6(opencodeConfigPath);
33672
- if (!existsSync8(configDir)) {
33695
+ if (!existsSync9(configDir)) {
33673
33696
  mkdirSync5(configDir, { recursive: true });
33674
33697
  }
33675
33698
  writeFileSync5(opencodeConfigPath, JSON.stringify(opencodeConfig, null, 2));
@@ -34307,19 +34330,19 @@ var init_account = __esm(() => {
34307
34330
  });
34308
34331
 
34309
34332
  // src/core/store.ts
34310
- import { existsSync as existsSync10, readFileSync as readFileSync11, writeFileSync as writeFileSync6 } from "fs";
34311
- import { join as join6 } from "path";
34333
+ import { existsSync as existsSync11, readFileSync as readFileSync11, writeFileSync as writeFileSync6 } from "fs";
34334
+ import { join as join7 } from "path";
34312
34335
 
34313
34336
  class Store {
34314
34337
  filePath;
34315
34338
  defaults;
34316
34339
  constructor(filename, defaults) {
34317
34340
  ensureConfigDir();
34318
- this.filePath = join6(getConfigDir(), filename);
34341
+ this.filePath = join7(getConfigDir(), filename);
34319
34342
  this.defaults = defaults;
34320
34343
  }
34321
34344
  async read() {
34322
- if (!existsSync10(this.filePath)) {
34345
+ if (!existsSync11(this.filePath)) {
34323
34346
  return { ...this.defaults };
34324
34347
  }
34325
34348
  try {
@@ -34348,10 +34371,10 @@ class Store {
34348
34371
  });
34349
34372
  }
34350
34373
  async exists() {
34351
- return existsSync10(this.filePath);
34374
+ return existsSync11(this.filePath);
34352
34375
  }
34353
34376
  async delete() {
34354
- if (existsSync10(this.filePath)) {
34377
+ if (existsSync11(this.filePath)) {
34355
34378
  const { unlinkSync: unlinkSync2 } = await import("fs");
34356
34379
  unlinkSync2(this.filePath);
34357
34380
  }
@@ -35124,7 +35147,7 @@ var require_bindings = __commonJS((exports, module) => {
35124
35147
  var fs = __require("fs");
35125
35148
  var path2 = __require("path");
35126
35149
  var fileURLToPath4 = require_file_uri_to_path();
35127
- var join7 = path2.join;
35150
+ var join8 = path2.join;
35128
35151
  var dirname7 = path2.dirname;
35129
35152
  var exists = fs.accessSync && function(path3) {
35130
35153
  try {
@@ -35177,7 +35200,7 @@ var require_bindings = __commonJS((exports, module) => {
35177
35200
  var requireFunc = typeof __webpack_require__ === "function" ? __non_webpack_require__ : __require;
35178
35201
  var tries = [], i = 0, l = opts.try.length, n, b, err;
35179
35202
  for (;i < l; i++) {
35180
- n = join7.apply(null, opts.try[i].map(function(p) {
35203
+ n = join8.apply(null, opts.try[i].map(function(p) {
35181
35204
  return opts[p] || p;
35182
35205
  }));
35183
35206
  tries.push(n);
@@ -35235,14 +35258,14 @@ var require_bindings = __commonJS((exports, module) => {
35235
35258
  if (dir === ".") {
35236
35259
  dir = process.cwd();
35237
35260
  }
35238
- if (exists(join7(dir, "package.json")) || exists(join7(dir, "node_modules"))) {
35261
+ if (exists(join8(dir, "package.json")) || exists(join8(dir, "node_modules"))) {
35239
35262
  return dir;
35240
35263
  }
35241
35264
  if (prev === dir) {
35242
35265
  throw new Error('Could not find module root given file: "' + file + '". Do you have a `package.json` file? ');
35243
35266
  }
35244
35267
  prev = dir;
35245
- dir = join7(dir, "..");
35268
+ dir = join8(dir, "..");
35246
35269
  }
35247
35270
  };
35248
35271
  });
@@ -35821,17 +35844,17 @@ var require_lib4 = __commonJS((exports, module) => {
35821
35844
  });
35822
35845
 
35823
35846
  // src/commands/stats.ts
35824
- import { existsSync as existsSync11, writeFileSync as writeFileSync7 } from "fs";
35825
- import { join as join7 } from "path";
35847
+ import { existsSync as existsSync12, writeFileSync as writeFileSync7 } from "fs";
35848
+ import { join as join8 } from "path";
35826
35849
  import { homedir as homedir7 } from "os";
35827
35850
  function findDatabase() {
35828
35851
  const locations = [
35829
- join7(process.cwd(), ".opencode", "data.db"),
35830
- join7(homedir7(), ".opencode", "data.db"),
35831
- join7(homedir7(), ".config", "opencode", "data.db")
35852
+ join8(process.cwd(), ".opencode", "data.db"),
35853
+ join8(homedir7(), ".opencode", "data.db"),
35854
+ join8(homedir7(), ".config", "opencode", "data.db")
35832
35855
  ];
35833
35856
  for (const loc of locations) {
35834
- if (existsSync11(loc))
35857
+ if (existsSync12(loc))
35835
35858
  return loc;
35836
35859
  }
35837
35860
  return null;
@@ -35996,7 +36019,7 @@ var init_stats2 = __esm(() => {
35996
36019
 
35997
36020
  // src/commands/launchboard.ts
35998
36021
  import { execSync as execSync5 } from "child_process";
35999
- import { existsSync as existsSync12 } from "fs";
36022
+ import { existsSync as existsSync13 } from "fs";
36000
36023
  import { resolve as resolve7 } from "path";
36001
36024
  function getLaunchboardDir() {
36002
36025
  const result = resolveLaunchboardDir();
@@ -36024,7 +36047,7 @@ function registerLaunchboardCommand(program2) {
36024
36047
  return;
36025
36048
  }
36026
36049
  const frontendDir = resolve7(LAUNCHBOARD_DIR, "frontend");
36027
- if (existsSync12(frontendDir)) {
36050
+ if (existsSync13(frontendDir)) {
36028
36051
  spinner.start("Installing frontend dependencies...");
36029
36052
  try {
36030
36053
  execSync5("bun install", { cwd: frontendDir, stdio: "pipe" });
@@ -36034,7 +36057,7 @@ function registerLaunchboardCommand(program2) {
36034
36057
  }
36035
36058
  }
36036
36059
  const dbPath = resolve7(LAUNCHBOARD_DIR, "launchboard.db");
36037
- if (!existsSync12(dbPath)) {
36060
+ if (!existsSync13(dbPath)) {
36038
36061
  spinner.start("Creating database...");
36039
36062
  try {
36040
36063
  execSync5("bunx drizzle-kit push", { cwd: LAUNCHBOARD_DIR, stdio: "pipe" });
@@ -36067,7 +36090,7 @@ function registerLaunchboardCommand(program2) {
36067
36090
  const LAUNCHBOARD_DIR = getLaunchboardDir();
36068
36091
  if (!LAUNCHBOARD_DIR)
36069
36092
  return;
36070
- if (!existsSync12(resolve7(LAUNCHBOARD_DIR, "node_modules"))) {
36093
+ if (!existsSync13(resolve7(LAUNCHBOARD_DIR, "node_modules"))) {
36071
36094
  console.log(source_default.yellow("⚠️ Dependencies not installed. Run: omocs launchboard setup"));
36072
36095
  return;
36073
36096
  }
@@ -36083,7 +36106,44 @@ function registerLaunchboardCommand(program2) {
36083
36106
  console.log(source_default.dim(" Frontend:"), source_default.white("http://localhost:3040"));
36084
36107
  console.log(source_default.dim(` Press Ctrl+C to stop
36085
36108
  `));
36086
- execSync5("bash setup.sh", { cwd: LAUNCHBOARD_DIR, stdio: "inherit" });
36109
+ const lbDir = LAUNCHBOARD_DIR;
36110
+ const frontendDir = resolve7(lbDir, "frontend");
36111
+ const isWin = process.platform === "win32";
36112
+ const runCmd = (cmd, cwd) => execSync5(cmd, { cwd, stdio: "inherit", shell: isWin ? "cmd.exe" : "/bin/sh" });
36113
+ if (!existsSync13(resolve7(lbDir, "node_modules"))) {
36114
+ console.log(source_default.dim(" Installing backend dependencies..."));
36115
+ runCmd("bun install", lbDir);
36116
+ }
36117
+ if (!existsSync13(resolve7(frontendDir, "node_modules"))) {
36118
+ console.log(source_default.dim(" Installing frontend dependencies..."));
36119
+ runCmd("bun install", frontendDir);
36120
+ }
36121
+ if (!existsSync13(resolve7(lbDir, "launchboard.db"))) {
36122
+ console.log(source_default.dim(" Creating database..."));
36123
+ runCmd("bunx drizzle-kit push", lbDir);
36124
+ console.log(source_default.dim(" Seeding sample data..."));
36125
+ runCmd("bun run seed", lbDir);
36126
+ }
36127
+ const { spawn: spawnProc } = await import("child_process");
36128
+ const backendProc = spawnProc("bun", ["run", "start"], { cwd: lbDir, stdio: "inherit", shell: isWin });
36129
+ const frontendProc = spawnProc("bun", ["run", "dev"], { cwd: frontendDir, stdio: "inherit", shell: isWin });
36130
+ const cleanup2 = () => {
36131
+ backendProc.kill();
36132
+ frontendProc.kill();
36133
+ process.exit(0);
36134
+ };
36135
+ process.on("SIGINT", cleanup2);
36136
+ process.on("SIGTERM", cleanup2);
36137
+ await new Promise((res) => {
36138
+ backendProc.on("exit", () => {
36139
+ frontendProc.kill();
36140
+ res();
36141
+ });
36142
+ frontendProc.on("exit", () => {
36143
+ backendProc.kill();
36144
+ res();
36145
+ });
36146
+ });
36087
36147
  }
36088
36148
  });
36089
36149
  lb.command("status").description("Check if Launchboard is running").action(async () => {
@@ -36117,14 +36177,14 @@ var exports_src = {};
36117
36177
  __export(exports_src, {
36118
36178
  program: () => program2
36119
36179
  });
36120
- import { readFileSync as readFileSync13, existsSync as existsSync13 } from "fs";
36180
+ import { readFileSync as readFileSync13, existsSync as existsSync14 } from "fs";
36121
36181
  import { dirname as dirname7, resolve as resolve8 } from "path";
36122
36182
  import { fileURLToPath as fileURLToPath4 } from "url";
36123
36183
  function findPackageJson() {
36124
36184
  let dir = dirname7(fileURLToPath4(import.meta.url));
36125
36185
  for (let i = 0;i < 5; i++) {
36126
36186
  const candidate = resolve8(dir, "package.json");
36127
- if (existsSync13(candidate))
36187
+ if (existsSync14(candidate))
36128
36188
  return candidate;
36129
36189
  dir = dirname7(dir);
36130
36190
  }
@@ -36269,14 +36329,14 @@ async function checkAndUpdate(currentVersion) {
36269
36329
  }
36270
36330
 
36271
36331
  // bin/omocs.ts
36272
- import { readFileSync as readFileSync14, existsSync as existsSync14 } from "fs";
36332
+ import { readFileSync as readFileSync14, existsSync as existsSync15 } from "fs";
36273
36333
  import { dirname as dirname8, resolve as resolve9 } from "path";
36274
36334
  import { fileURLToPath as fileURLToPath5 } from "url";
36275
36335
  function findPackageJson2() {
36276
36336
  let dir = dirname8(fileURLToPath5(import.meta.url));
36277
36337
  for (let i = 0;i < 5; i++) {
36278
36338
  const candidate = resolve9(dir, "package.json");
36279
- if (existsSync14(candidate))
36339
+ if (existsSync15(candidate))
36280
36340
  return candidate;
36281
36341
  dir = dirname8(dir);
36282
36342
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo-suites",
3
- "version": "1.7.5",
3
+ "version": "1.7.7",
4
4
  "description": "OMO Suites — OpenCode plugin + CLI toolkit. Multi-model orchestration, profiles, agent routing, MCP/LSP management.",
5
5
  "type": "module",
6
6
  "main": "dist/plugin.js",