sickbay 1.15.4 → 1.15.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.
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Header
3
- } from "./chunk-PD5OA3SZ.js";
3
+ } from "./chunk-UFTUJIJ2.js";
4
4
 
5
5
  // src/components/DiffApp.tsx
6
6
  import React, { useState, useEffect } from "react";
@@ -119,7 +119,7 @@ function DiffApp({ projectPath, branch, jsonOutput, checks, verbose }) {
119
119
  useEffect(() => {
120
120
  (async () => {
121
121
  try {
122
- const { runSickbay } = await import("./dist-G7GDVJT5.js");
122
+ const { runSickbay } = await import("./dist-YK4FYTB4.js");
123
123
  const currentReport = await runSickbay({
124
124
  projectPath,
125
125
  checks,
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  shortName
3
- } from "./chunk-MCHTDD7R.js";
3
+ } from "./chunk-L7KHKFWR.js";
4
4
  import {
5
5
  Header
6
- } from "./chunk-PD5OA3SZ.js";
6
+ } from "./chunk-UFTUJIJ2.js";
7
7
  import {
8
8
  detectPackageManager,
9
9
  detectProject
10
- } from "./chunk-WEGMDILT.js";
10
+ } from "./chunk-XSQZTZWJ.js";
11
11
 
12
12
  // src/components/DoctorApp.tsx
13
13
  import React, { useState, useEffect } from "react";
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  shortName
3
- } from "./chunk-MCHTDD7R.js";
3
+ } from "./chunk-L7KHKFWR.js";
4
4
  import {
5
5
  ProgressList
6
6
  } from "./chunk-MBVA75EM.js";
7
7
  import {
8
8
  Header
9
- } from "./chunk-PD5OA3SZ.js";
9
+ } from "./chunk-UFTUJIJ2.js";
10
10
  import {
11
11
  runSickbay
12
- } from "./chunk-WEGMDILT.js";
12
+ } from "./chunk-XSQZTZWJ.js";
13
13
 
14
14
  // src/components/FixApp.tsx
15
15
  import React, { useState, useEffect, useCallback } from "react";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  shortName
3
- } from "./chunk-MCHTDD7R.js";
3
+ } from "./chunk-L7KHKFWR.js";
4
4
  import {
5
5
  Header
6
- } from "./chunk-PD5OA3SZ.js";
6
+ } from "./chunk-UFTUJIJ2.js";
7
7
  import {
8
8
  detectProject
9
- } from "./chunk-WEGMDILT.js";
9
+ } from "./chunk-XSQZTZWJ.js";
10
10
 
11
11
  // src/components/StatsApp.tsx
12
12
  import React, { useState, useEffect } from "react";
@@ -4,11 +4,11 @@ import {
4
4
  } from "./chunk-SHO3ZXTH.js";
5
5
  import {
6
6
  shortName
7
- } from "./chunk-MCHTDD7R.js";
7
+ } from "./chunk-L7KHKFWR.js";
8
8
  import {
9
9
  Header
10
- } from "./chunk-PD5OA3SZ.js";
11
- import "./chunk-WEGMDILT.js";
10
+ } from "./chunk-UFTUJIJ2.js";
11
+ import "./chunk-XSQZTZWJ.js";
12
12
  import {
13
13
  detectRegressions,
14
14
  loadHistory
@@ -14,7 +14,7 @@ import {
14
14
  detectMonorepo,
15
15
  runSickbay,
16
16
  runSickbayMonorepo
17
- } from "./chunk-WEGMDILT.js";
17
+ } from "./chunk-XSQZTZWJ.js";
18
18
  import {
19
19
  loadHistory
20
20
  } from "./chunk-3OR2GFVE.js";
@@ -689,7 +689,7 @@ function TuiApp({
689
689
  return () => timers.forEach(clearTimeout);
690
690
  }, []);
691
691
  useEffect7(() => {
692
- checkForUpdate("1.15.3").then((info) => {
692
+ checkForUpdate("1.15.5").then((info) => {
693
693
  if (info) setUpdateInfo(info);
694
694
  });
695
695
  }, []);
@@ -715,7 +715,7 @@ function TuiApp({
715
715
  } catch {
716
716
  }
717
717
  try {
718
- const { getDependencyTree } = await import("./dist-G7GDVJT5.js");
718
+ const { getDependencyTree } = await import("./dist-YK4FYTB4.js");
719
719
  const { saveDepTree } = await import("./history-XLNVZEDI.js");
720
720
  const tree = await getDependencyTree(projectPath, result.projectInfo.packageManager);
721
721
  saveDepTree(projectPath, tree);
@@ -819,7 +819,7 @@ function TuiApp({
819
819
  const webReport = monorepoReportRef.current ?? reportRef.current;
820
820
  if (!webReport) return;
821
821
  try {
822
- const { serveWeb } = await import("./web-EUG7IJKA.js");
822
+ const { serveWeb } = await import("./web-TCEOS752.js");
823
823
  const { default: openBrowser } = await import("open");
824
824
  let aiService;
825
825
  if (withAI && process.env.ANTHROPIC_API_KEY && !monorepoReportRef.current) {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  detectMonorepo
3
- } from "./chunk-WEGMDILT.js";
3
+ } from "./chunk-XSQZTZWJ.js";
4
4
 
5
5
  // src/lib/resolve-package.ts
6
6
  import { readFileSync } from "fs";
@@ -11,7 +11,7 @@ var ASCII_ART = `
11
11
  A vitals health check for your app
12
12
  `.trim();
13
13
  function Header({ projectName }) {
14
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: "green" }, ASCII_ART), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " v", "1.15.3")), projectName && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " Analyzing "), /* @__PURE__ */ React.createElement(Text, { bold: true, color: "white" }, projectName)));
14
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: "green" }, ASCII_ART), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " v", "1.15.5")), projectName && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, " Analyzing "), /* @__PURE__ */ React.createElement(Text, { bold: true, color: "white" }, projectName)));
15
15
  }
16
16
 
17
17
  export {
@@ -1,6 +1,6 @@
1
1
  // ../../packages/core/dist/index.js
2
2
  import { existsSync as existsSync27, readFileSync as readFileSync31 } from "fs";
3
- import { basename as basename3, join as join38, relative as relative2 } from "path";
3
+ import { basename as basename3, join as join38, relative as relative3 } from "path";
4
4
  import { readFileSync, readdirSync, statSync, existsSync } from "fs";
5
5
  import { join, extname } from "path";
6
6
  import { readFileSync as readFileSync2, readdirSync as readdirSync2, existsSync as existsSync2 } from "fs";
@@ -14,7 +14,7 @@ import { join as join5, resolve } from "path";
14
14
  import { readFileSync as readFileSync6, existsSync as existsSync7 } from "fs";
15
15
  import { join as join7 } from "path";
16
16
  import { existsSync as existsSync6, readFileSync as readFileSync5 } from "fs";
17
- import { join as join6, dirname } from "path";
17
+ import { dirname, join as join6, relative, sep } from "path";
18
18
  import { fileURLToPath } from "url";
19
19
  import { execa } from "execa";
20
20
  import { readdirSync as readdirSync4, statSync as statSync3, readFileSync as readFileSync7 } from "fs";
@@ -75,7 +75,7 @@ import { join as join29 } from "path";
75
75
  import { readFileSync as readFileSync25, existsSync as existsSync20 } from "fs";
76
76
  import { join as join30 } from "path";
77
77
  import { existsSync as existsSync21 } from "fs";
78
- import { dirname as dirname4, join as join31, relative } from "path";
78
+ import { dirname as dirname4, join as join31, relative as relative2 } from "path";
79
79
  import { execa as execa10 } from "execa";
80
80
  import { execa as execa11 } from "execa";
81
81
  import { existsSync as existsSync22, readFileSync as readFileSync26, readdirSync as readdirSync16, statSync as statSync15 } from "fs";
@@ -832,9 +832,12 @@ function readPackageJson(projectPath) {
832
832
  return JSON.parse(readFileSync5(pkgPath, "utf-8"));
833
833
  }
834
834
  async function isCommandAvailable(cmd) {
835
- if (existsSync6(join6(coreLocalDir, "node_modules", ".bin", cmd))) return true;
835
+ const binDir = join6(coreLocalDir, "node_modules", ".bin");
836
+ const localCandidates = process.platform === "win32" ? [cmd, `${cmd}.cmd`, `${cmd}.exe`, `${cmd}.ps1`] : [cmd];
837
+ if (localCandidates.some((c) => existsSync6(join6(binDir, c)))) return true;
838
+ const lookupCmd = process.platform === "win32" ? "where" : "which";
836
839
  try {
837
- await execa("which", [cmd]);
840
+ await execa(lookupCmd, [cmd]);
838
841
  return true;
839
842
  } catch {
840
843
  return false;
@@ -843,6 +846,9 @@ async function isCommandAvailable(cmd) {
843
846
  function fileExists(projectPath, ...parts) {
844
847
  return existsSync6(join6(projectPath, ...parts));
845
848
  }
849
+ function relativeFromRoot(projectRoot, fullPath) {
850
+ return relative(projectRoot, fullPath).split(sep).join("/");
851
+ }
846
852
  function timer() {
847
853
  const start = Date.now();
848
854
  return () => Date.now() - start;
@@ -1095,7 +1101,7 @@ function findComponentFiles(dir, projectRoot, isRoot = true) {
1095
1101
  if (stat.isDirectory()) {
1096
1102
  files.push(...findComponentFiles(fullPath, projectRoot, false));
1097
1103
  } else if (entry.endsWith(".component.ts")) {
1098
- files.push({ relPath: fullPath.replace(projectRoot + "/", ""), fullPath });
1104
+ files.push({ relPath: relativeFromRoot(projectRoot, fullPath), fullPath });
1099
1105
  }
1100
1106
  }
1101
1107
  } catch (err) {
@@ -1217,7 +1223,7 @@ function findRouteFiles(dir, projectRoot, topLevel = true) {
1217
1223
  if (stat.isDirectory()) {
1218
1224
  files.push(...findRouteFiles(fullPath, projectRoot, false));
1219
1225
  } else if (entry.endsWith(".routes.ts") || entry === "app.config.ts") {
1220
- files.push({ relPath: fullPath.replace(projectRoot + "/", ""), fullPath });
1226
+ files.push({ relPath: relativeFromRoot(projectRoot, fullPath), fullPath });
1221
1227
  }
1222
1228
  }
1223
1229
  return files;
@@ -1313,7 +1319,7 @@ function findSourceFiles(dir, projectRoot, isRoot = true) {
1313
1319
  if (stat.isDirectory()) {
1314
1320
  files.push(...findSourceFiles(fullPath, projectRoot, false));
1315
1321
  } else if (entry.endsWith(".ts") || entry.endsWith(".html")) {
1316
- files.push({ relPath: fullPath.replace(projectRoot + "/", ""), fullPath });
1322
+ files.push({ relPath: relativeFromRoot(projectRoot, fullPath), fullPath });
1317
1323
  }
1318
1324
  }
1319
1325
  } catch (err) {
@@ -1497,7 +1503,7 @@ function findComponentFiles2(dir, projectRoot, isRoot = true) {
1497
1503
  if (stat.isDirectory()) {
1498
1504
  files.push(...findComponentFiles2(fullPath, projectRoot, false));
1499
1505
  } else if (entry.endsWith(".component.ts")) {
1500
- files.push({ relPath: fullPath.replace(projectRoot + "/", ""), fullPath });
1506
+ files.push({ relPath: relativeFromRoot(projectRoot, fullPath), fullPath });
1501
1507
  }
1502
1508
  }
1503
1509
  } catch (err) {
@@ -1638,7 +1644,7 @@ function findComponentFiles3(dir, projectRoot, isRoot = true) {
1638
1644
  if (stat.isDirectory()) {
1639
1645
  files.push(...findComponentFiles3(fullPath, projectRoot, false));
1640
1646
  } else if (entry.endsWith(".component.ts")) {
1641
- files.push({ relPath: fullPath.replace(projectRoot + "/", ""), fullPath });
1647
+ files.push({ relPath: relativeFromRoot(projectRoot, fullPath), fullPath });
1642
1648
  }
1643
1649
  }
1644
1650
  } catch (err) {
@@ -1804,7 +1810,7 @@ function scanAssets(dir, projectRoot, assets, isExcluded) {
1804
1810
  for (const entry of readdirSync9(dir)) {
1805
1811
  if (entry.startsWith(".") || entry === "node_modules") continue;
1806
1812
  const fullPath = join14(dir, entry);
1807
- const relPath = fullPath.replace(projectRoot + "/", "");
1813
+ const relPath = relativeFromRoot(projectRoot, fullPath);
1808
1814
  if (isExcluded(relPath)) continue;
1809
1815
  const stat = statSync8(fullPath);
1810
1816
  if (stat.isDirectory()) {
@@ -1818,7 +1824,7 @@ function scanAssets(dir, projectRoot, assets, isExcluded) {
1818
1824
  else if (FONT_EXTENSIONS.has(ext)) type = "font";
1819
1825
  else continue;
1820
1826
  assets.push({
1821
- path: fullPath.replace(projectRoot + "/", ""),
1827
+ path: relativeFromRoot(projectRoot, fullPath),
1822
1828
  size: stat.size,
1823
1829
  type
1824
1830
  });
@@ -1998,7 +2004,7 @@ function scanDirectory(dir, projectRoot, isExcluded) {
1998
2004
  if (stat.isDirectory()) {
1999
2005
  files.push(...scanDirectory(fullPath, projectRoot, isExcluded));
2000
2006
  } else if (SOURCE_EXTENSIONS.has(extname5(entry)) && !isTestFile(entry)) {
2001
- const relPath = fullPath.replace(projectRoot + "/", "");
2007
+ const relPath = relativeFromRoot(projectRoot, fullPath);
2002
2008
  if (isExcluded(relPath)) continue;
2003
2009
  try {
2004
2010
  const lines = readFileSync13(fullPath, "utf-8").split("\n").filter((l) => l.trim()).length;
@@ -2478,7 +2484,7 @@ var ESLintRunner = class extends BaseRunner {
2478
2484
  totalErrors += file.errorCount;
2479
2485
  totalWarnings += file.warningCount;
2480
2486
  if (file.errorCount > 0 || file.warningCount > 0) {
2481
- const relPath = file.filePath.replace(projectPath + "/", "");
2487
+ const relPath = relativeFromRoot(projectPath, file.filePath);
2482
2488
  const parts = [];
2483
2489
  if (file.errorCount > 0)
2484
2490
  parts.push(`${file.errorCount} error${file.errorCount > 1 ? "s" : ""}`);
@@ -3211,7 +3217,7 @@ function findJsxFiles(dir, projectRoot, isRoot = true) {
3211
3217
  if (stat.isDirectory()) {
3212
3218
  files.push(...findJsxFiles(fullPath, projectRoot, false));
3213
3219
  } else if (entry.endsWith(".tsx") || entry.endsWith(".jsx")) {
3214
- files.push({ relPath: fullPath.replace(projectRoot + "/", ""), fullPath });
3220
+ files.push({ relPath: relativeFromRoot(projectRoot, fullPath), fullPath });
3215
3221
  }
3216
3222
  }
3217
3223
  } catch (err) {
@@ -3368,7 +3374,7 @@ function findJsxFiles2(dir, projectRoot, isRoot = true) {
3368
3374
  if (stat.isDirectory()) {
3369
3375
  files.push(...findJsxFiles2(fullPath, projectRoot, false));
3370
3376
  } else if (entry.endsWith(".tsx") || entry.endsWith(".jsx")) {
3371
- files.push({ relPath: fullPath.replace(projectRoot + "/", ""), fullPath });
3377
+ files.push({ relPath: relativeFromRoot(projectRoot, fullPath), fullPath });
3372
3378
  }
3373
3379
  }
3374
3380
  } catch (err) {
@@ -3455,7 +3461,7 @@ function findJsxFiles3(dir, projectRoot, isRoot = true) {
3455
3461
  if (stat.isDirectory()) {
3456
3462
  files.push(...findJsxFiles3(fullPath, projectRoot, false));
3457
3463
  } else if (entry.endsWith(".tsx") || entry.endsWith(".jsx")) {
3458
- files.push({ relPath: fullPath.replace(projectRoot + "/", ""), fullPath });
3464
+ files.push({ relPath: relativeFromRoot(projectRoot, fullPath), fullPath });
3459
3465
  }
3460
3466
  }
3461
3467
  } catch (err) {
@@ -3484,7 +3490,7 @@ var NextMissingBoundariesRunner = class extends BaseRunner {
3484
3490
  let missingError = 0;
3485
3491
  for (const pageDir of pageDirs) {
3486
3492
  segmentsChecked++;
3487
- const relDir = pageDir.replace(projectPath + "/", "");
3493
+ const relDir = relativeFromRoot(projectPath, pageDir);
3488
3494
  if (!existsSync16(join26(pageDir, "loading.tsx")) && !existsSync16(join26(pageDir, "loading.jsx"))) {
3489
3495
  missingLoading++;
3490
3496
  issues.push({
@@ -4110,7 +4116,7 @@ function filterPnpmAdvisories(advisories, projectPath) {
4110
4116
  if (!workspaceRoot || workspaceRoot === projectPath) {
4111
4117
  return advisories;
4112
4118
  }
4113
- const importerPrefix = relative(workspaceRoot, projectPath).replace(/\//g, "__");
4119
+ const importerPrefix = relative2(workspaceRoot, projectPath).replace(/\//g, "__");
4114
4120
  const filtered = {};
4115
4121
  for (const [id, advisory] of Object.entries(advisories)) {
4116
4122
  const isRelevant = advisory.findings.some(
@@ -4321,7 +4327,7 @@ function scanDirectory2(dir, projectRoot, isExcluded) {
4321
4327
  if (entry.startsWith(".") || entry === "node_modules" || entry === "__tests__" || entry === "__mocks__" || entry.includes(".test.") || entry.includes(".spec."))
4322
4328
  continue;
4323
4329
  const fullPath = join32(dir, entry);
4324
- const relPath = fullPath.replace(projectRoot + "/", "");
4330
+ const relPath = relativeFromRoot(projectRoot, fullPath);
4325
4331
  if (isExcluded(relPath)) continue;
4326
4332
  const stat = statSync15(fullPath);
4327
4333
  if (stat.isDirectory()) {
@@ -4331,7 +4337,7 @@ function scanDirectory2(dir, projectRoot, isExcluded) {
4331
4337
  const content = readFileSync26(fullPath, "utf-8");
4332
4338
  const lineCount = content.split("\n").length;
4333
4339
  files.push({
4334
- path: fullPath.replace(projectRoot + "/", ""),
4340
+ path: relativeFromRoot(projectRoot, fullPath),
4335
4341
  fullPath,
4336
4342
  lines: lineCount
4337
4343
  });
@@ -4547,7 +4553,7 @@ function scanDirectory3(dir, projectRoot, isExcluded) {
4547
4553
  if (entry.startsWith(".") || entry === "node_modules" || entry === "__tests__" || entry === "test" || entry === "tests")
4548
4554
  continue;
4549
4555
  const fullPath = join33(dir, entry);
4550
- const relPath = fullPath.replace(projectRoot + "/", "");
4556
+ const relPath = relativeFromRoot(projectRoot, fullPath);
4551
4557
  if (isExcluded(relPath)) continue;
4552
4558
  const stat = statSync16(fullPath);
4553
4559
  if (stat.isDirectory()) {
@@ -4591,7 +4597,7 @@ function scanFile(filePath, projectRoot) {
4591
4597
  try {
4592
4598
  const content = readFileSync27(filePath, "utf-8");
4593
4599
  const lines = content.split("\n");
4594
- const relPath = filePath.replace(projectRoot + "/", "");
4600
+ const relPath = relativeFromRoot(projectRoot, filePath);
4595
4601
  for (let i = 0; i < lines.length; i++) {
4596
4602
  const line = lines[i];
4597
4603
  if (line.includes("process.env") || line.includes("import.meta.env")) continue;
@@ -4867,7 +4873,7 @@ function scanDirectory4(dir, projectRoot, pattern, isExcluded) {
4867
4873
  if (entry.startsWith(".") || entry === "node_modules") continue;
4868
4874
  if (SELF_REFERENCING_FILES.has(entry)) continue;
4869
4875
  const fullPath = join35(dir, entry);
4870
- const relPath = fullPath.replace(projectRoot + "/", "");
4876
+ const relPath = relativeFromRoot(projectRoot, fullPath);
4871
4877
  if (isExcluded(relPath)) continue;
4872
4878
  const stat = statSync18(fullPath);
4873
4879
  if (stat.isDirectory()) {
@@ -4884,7 +4890,7 @@ function scanFile2(filePath, projectRoot, pattern) {
4884
4890
  const todos = [];
4885
4891
  try {
4886
4892
  const lines = readFileSync29(filePath, "utf-8").split("\n");
4887
- const relPath = filePath.replace(projectRoot + "/", "");
4893
+ const relPath = relativeFromRoot(projectRoot, filePath);
4888
4894
  for (let i = 0; i < lines.length; i++) {
4889
4895
  const match = stripStringLiterals(lines[i]).match(pattern);
4890
4896
  if (match) {
@@ -5432,7 +5438,7 @@ async function runSickbayMonorepo(options = {}) {
5432
5438
  const packageReport = {
5433
5439
  name: report.projectInfo.name,
5434
5440
  path: pkgPath,
5435
- relativePath: relative2(rootPath, pkgPath),
5441
+ relativePath: relative3(rootPath, pkgPath),
5436
5442
  framework: report.projectInfo.framework,
5437
5443
  runtime: context.runtime,
5438
5444
  checks: report.checks,
package/dist/config.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  defineConfig
3
- } from "./chunk-WEGMDILT.js";
3
+ } from "./chunk-XSQZTZWJ.js";
4
4
  export {
5
5
  defineConfig
6
6
  };
@@ -29,7 +29,7 @@ import {
29
29
  runSickbay,
30
30
  runSickbayMonorepo,
31
31
  validateConfig
32
- } from "./chunk-WEGMDILT.js";
32
+ } from "./chunk-XSQZTZWJ.js";
33
33
  export {
34
34
  BaseAdvisor,
35
35
  CATEGORY_WEIGHTS,
package/dist/index.js CHANGED
@@ -8,12 +8,12 @@ import {
8
8
  } from "./chunk-TYG7ZQBP.js";
9
9
  import {
10
10
  Header
11
- } from "./chunk-PD5OA3SZ.js";
11
+ } from "./chunk-UFTUJIJ2.js";
12
12
  import {
13
13
  getScoreEmoji,
14
14
  runSickbay,
15
15
  runSickbayMonorepo
16
- } from "./chunk-WEGMDILT.js";
16
+ } from "./chunk-XSQZTZWJ.js";
17
17
 
18
18
  // src/index.ts
19
19
  import { existsSync } from "fs";
@@ -190,7 +190,7 @@ function App({
190
190
  setMonorepoReport(r);
191
191
  setProjectName(`monorepo (${r.packages.length} packages)`);
192
192
  try {
193
- const { getDependencyTree } = await import("./dist-G7GDVJT5.js");
193
+ const { getDependencyTree } = await import("./dist-YK4FYTB4.js");
194
194
  const { saveDepTree } = await import("./history-XLNVZEDI.js");
195
195
  const packages = {};
196
196
  for (const pkg of r.packages) {
@@ -202,7 +202,7 @@ function App({
202
202
  if (openWeb) {
203
203
  setPhase("opening-web");
204
204
  try {
205
- const { serveWeb } = await import("./web-EUG7IJKA.js");
205
+ const { serveWeb } = await import("./web-TCEOS752.js");
206
206
  const { default: openBrowser } = await import("open");
207
207
  let aiService;
208
208
  if (enableAI && process.env.ANTHROPIC_API_KEY) {
@@ -259,7 +259,7 @@ function App({
259
259
  } catch {
260
260
  }
261
261
  try {
262
- const { getDependencyTree } = await import("./dist-G7GDVJT5.js");
262
+ const { getDependencyTree } = await import("./dist-YK4FYTB4.js");
263
263
  const { saveDepTree } = await import("./history-XLNVZEDI.js");
264
264
  const tree = await getDependencyTree(projectPath, r.projectInfo.packageManager);
265
265
  saveDepTree(projectPath, tree);
@@ -268,7 +268,7 @@ function App({
268
268
  if (openWeb) {
269
269
  setPhase("opening-web");
270
270
  try {
271
- const { serveWeb } = await import("./web-EUG7IJKA.js");
271
+ const { serveWeb } = await import("./web-TCEOS752.js");
272
272
  const { default: openBrowser } = await import("open");
273
273
  let aiService;
274
274
  if (enableAI && process.env.ANTHROPIC_API_KEY) {
@@ -317,7 +317,7 @@ if (existsSync(globalConfigPath)) {
317
317
  }
318
318
  config({ debug: false, quiet: true });
319
319
  var program = new Command();
320
- program.name("sickbay").description("React project health check CLI").version("1.15.3", "-v, --version").enablePositionalOptions().passThroughOptions().option("-p, --path <path>", "project path to analyze", process.cwd()).option("-c, --checks <checks>", "comma-separated list of checks to run").option("--package <name>", "scope to a single named package (monorepo only)").option("--json", "output raw JSON report").option("--web", "open web dashboard after scan").option("--no-ai", "disable AI features").option("--no-quotes", "suppress personality quotes in output").option("--verbose", "show verbose output").action(async (options) => {
320
+ program.name("sickbay").description("React project health check CLI").version("1.15.5", "-v, --version").enablePositionalOptions().passThroughOptions().option("-p, --path <path>", "project path to analyze", process.cwd()).option("-c, --checks <checks>", "comma-separated list of checks to run").option("--package <name>", "scope to a single named package (monorepo only)").option("--json", "output raw JSON report").option("--web", "open web dashboard after scan").option("--no-ai", "disable AI features").option("--no-quotes", "suppress personality quotes in output").option("--verbose", "show verbose output").action(async (options) => {
321
321
  if (options.path && options.path !== process.cwd()) {
322
322
  const projectEnvPath = join(options.path, ".env");
323
323
  if (existsSync(projectEnvPath)) {
@@ -327,13 +327,13 @@ program.name("sickbay").description("React project health check CLI").version("1
327
327
  const updatePromise = (async () => {
328
328
  try {
329
329
  const { checkForUpdate } = await import("./update-check-M7IFOMLJ.js");
330
- return await checkForUpdate("1.15.3");
330
+ return await checkForUpdate("1.15.5");
331
331
  } catch {
332
332
  return null;
333
333
  }
334
334
  })();
335
335
  const checks = options.checks ? options.checks.split(",").map((s) => s.trim()) : void 0;
336
- const { detectMonorepo, runSickbay: runSickbay2, runSickbayMonorepo: runSickbayMonorepo2 } = await import("./dist-G7GDVJT5.js");
336
+ const { detectMonorepo, runSickbay: runSickbay2, runSickbayMonorepo: runSickbayMonorepo2 } = await import("./dist-YK4FYTB4.js");
337
337
  const monorepoInfo = await detectMonorepo(options.path);
338
338
  if (options.package && monorepoInfo.isMonorepo) {
339
339
  const { readFileSync } = await import("fs");
@@ -397,7 +397,7 @@ program.name("sickbay").description("React project health check CLI").version("1
397
397
  } catch {
398
398
  }
399
399
  try {
400
- const { getDependencyTree } = await import("./dist-G7GDVJT5.js");
400
+ const { getDependencyTree } = await import("./dist-YK4FYTB4.js");
401
401
  const { saveDepTree } = await import("./history-XLNVZEDI.js");
402
402
  const tree = await getDependencyTree(options.path, report.projectInfo.packageManager);
403
403
  saveDepTree(options.path, tree);
@@ -424,16 +424,16 @@ program.command("init").description("Initialize .sickbay/ folder and run an init
424
424
  "add newly available checks to existing config without touching existing entries"
425
425
  ).option("--reset-config", "regenerate config from scratch (overwrites existing)").action(async (options) => {
426
426
  if (options.resetConfig) {
427
- const { generateConfigFile } = await import("./init-BBKWOHRV.js");
427
+ const { generateConfigFile } = await import("./init-FA6F4WTV.js");
428
428
  await generateConfigFile(options.path, { force: true });
429
429
  return;
430
430
  }
431
431
  if (options.sync) {
432
- const { syncConfigFile } = await import("./init-BBKWOHRV.js");
432
+ const { syncConfigFile } = await import("./init-FA6F4WTV.js");
433
433
  await syncConfigFile(options.path);
434
434
  return;
435
435
  }
436
- const { initSickbay } = await import("./init-BBKWOHRV.js");
436
+ const { initSickbay } = await import("./init-FA6F4WTV.js");
437
437
  await initSickbay(options.path);
438
438
  });
439
439
  program.command("fix").description("Interactively fix issues found by sickbay scan").option("-p, --path <path>", "project path to analyze", process.cwd()).option("-c, --checks <checks>", "comma-separated list of checks to run").option("--package <name>", "scope to a single package (monorepo only)").option("--all", "apply all available fixes without prompting").option("--dry-run", "show what would be fixed without executing").option("--verbose", "show verbose output").action(async (options) => {
@@ -443,9 +443,9 @@ program.command("fix").description("Interactively fix issues found by sickbay sc
443
443
  config({ path: projectEnvPath, override: true });
444
444
  }
445
445
  }
446
- const { resolveProject } = await import("./resolve-package-CB3KDANT.js");
446
+ const { resolveProject } = await import("./resolve-package-4UT4RYHY.js");
447
447
  const resolution = await resolveProject(options.path, options.package);
448
- const { FixApp } = await import("./FixApp-6JU4B3EJ.js");
448
+ const { FixApp } = await import("./FixApp-DUD426JB.js");
449
449
  const checks = options.checks ? options.checks.split(",").map((s) => s.trim()) : void 0;
450
450
  const projectPath = resolution.isMonorepo ? resolution.targetPath ?? options.path : resolution.targetPath;
451
451
  render(
@@ -468,10 +468,10 @@ program.command("trend").description("Show score history and trends over time").
468
468
  config({ path: projectEnvPath, override: true });
469
469
  }
470
470
  }
471
- const { resolveProject } = await import("./resolve-package-CB3KDANT.js");
471
+ const { resolveProject } = await import("./resolve-package-4UT4RYHY.js");
472
472
  const resolution = await resolveProject(options.path, options.package);
473
473
  const projectPath = resolution.isMonorepo ? resolution.targetPath ?? options.path : resolution.targetPath;
474
- const { TrendApp } = await import("./TrendApp-TB4E7ZUU.js");
474
+ const { TrendApp } = await import("./TrendApp-CYONZAVG.js");
475
475
  render(
476
476
  React7.createElement(TrendApp, {
477
477
  projectPath,
@@ -490,10 +490,10 @@ program.command("stats").description("Show a quick codebase overview and project
490
490
  config({ path: projectEnvPath, override: true });
491
491
  }
492
492
  }
493
- const { resolveProject } = await import("./resolve-package-CB3KDANT.js");
493
+ const { resolveProject } = await import("./resolve-package-4UT4RYHY.js");
494
494
  const resolution = await resolveProject(options.path, options.package);
495
495
  const projectPath = resolution.isMonorepo ? resolution.targetPath ?? options.path : resolution.targetPath;
496
- const { StatsApp } = await import("./StatsApp-EYYWVSGZ.js");
496
+ const { StatsApp } = await import("./StatsApp-X2Y7LMG5.js");
497
497
  render(
498
498
  React7.createElement(StatsApp, {
499
499
  projectPath,
@@ -505,7 +505,7 @@ program.command("stats").description("Show a quick codebase overview and project
505
505
  );
506
506
  });
507
507
  program.command("tui").description("Launch the persistent developer dashboard").option("-p, --path <path>", "project path to monitor", process.cwd()).option("--no-watch", "disable file-watching auto-refresh").option("--no-quotes", "suppress personality quotes in output").option("--refresh <seconds>", "auto-refresh interval in seconds", "300").option("-c, --checks <checks>", "comma-separated list of checks to run").action(async (options) => {
508
- const { TuiApp } = await import("./TuiApp-4JRQCD7M.js");
508
+ const { TuiApp } = await import("./TuiApp-NQGIS2T6.js");
509
509
  const checks = options.checks ? options.checks.split(",").map((s) => s.trim()) : void 0;
510
510
  render(
511
511
  React7.createElement(TuiApp, {
@@ -525,10 +525,10 @@ program.command("doctor").description("Diagnose project setup and configuration
525
525
  config({ path: projectEnvPath, override: true });
526
526
  }
527
527
  }
528
- const { resolveProject } = await import("./resolve-package-CB3KDANT.js");
528
+ const { resolveProject } = await import("./resolve-package-4UT4RYHY.js");
529
529
  const resolution = await resolveProject(options.path, options.package);
530
530
  const projectPath = resolution.isMonorepo ? resolution.targetPath ?? options.path : resolution.targetPath;
531
- const { DoctorApp } = await import("./DoctorApp-VKJCRS2I.js");
531
+ const { DoctorApp } = await import("./DoctorApp-SUPQ73LO.js");
532
532
  render(
533
533
  React7.createElement(DoctorApp, {
534
534
  projectPath,
@@ -541,13 +541,13 @@ program.command("doctor").description("Diagnose project setup and configuration
541
541
  );
542
542
  });
543
543
  program.command("badge").description("Generate a health score badge for your README").option("-p, --path <path>", "project path", process.cwd()).option("--package <name>", "scope to a single package (monorepo only)").option("--html", "output HTML <img> tag instead of markdown").option("--url", "output bare badge URL only").option("--label <text>", "custom badge label", "sickbay").option("--scan", "run a fresh scan instead of using last report").action(async (options) => {
544
- const { resolveProject } = await import("./resolve-package-CB3KDANT.js");
544
+ const { resolveProject } = await import("./resolve-package-4UT4RYHY.js");
545
545
  const resolution = await resolveProject(options.path, options.package);
546
546
  const projectPath = resolution.isMonorepo ? resolution.targetPath ?? options.path : resolution.targetPath;
547
547
  const { loadScoreFromLastReport, badgeUrl, badgeMarkdown, badgeHtml } = await import("./badge-KQ73KEIN.js");
548
548
  let score = options.scan ? null : loadScoreFromLastReport(projectPath);
549
549
  if (score === null) {
550
- const { runSickbay: runSickbay2 } = await import("./dist-G7GDVJT5.js");
550
+ const { runSickbay: runSickbay2 } = await import("./dist-YK4FYTB4.js");
551
551
  const report = await runSickbay2({ projectPath, quotes: false });
552
552
  try {
553
553
  const { saveEntry, saveLastReport } = await import("./history-XLNVZEDI.js");
@@ -580,7 +580,7 @@ program.command("diff <branch>").description("Compare health score against anoth
580
580
  }
581
581
  }
582
582
  const checks = options.checks ? options.checks.split(",").map((s) => s.trim()) : void 0;
583
- const { DiffApp } = await import("./DiffApp-KR745TCV.js");
583
+ const { DiffApp } = await import("./DiffApp-UCBWNYDV.js");
584
584
  render(
585
585
  React7.createElement(DiffApp, {
586
586
  projectPath: options.path,
@@ -4,7 +4,7 @@ import {
4
4
  getAvailableChecks,
5
5
  runSickbay,
6
6
  runSickbayMonorepo
7
- } from "./chunk-WEGMDILT.js";
7
+ } from "./chunk-XSQZTZWJ.js";
8
8
  import {
9
9
  saveEntry
10
10
  } from "./chunk-3OR2GFVE.js";
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  resolveProject,
3
3
  shortName
4
- } from "./chunk-MCHTDD7R.js";
5
- import "./chunk-WEGMDILT.js";
4
+ } from "./chunk-L7KHKFWR.js";
5
+ import "./chunk-XSQZTZWJ.js";
6
6
  export {
7
7
  resolveProject,
8
8
  shortName
@@ -106,7 +106,7 @@ async function serveWeb(report, preferredPort = 3030, aiService) {
106
106
  if (url === "/sickbay-config.json") {
107
107
  const basePath = "isMonorepo" in report ? report.rootPath : report.projectPath;
108
108
  try {
109
- const { loadConfig } = await import("./dist-G7GDVJT5.js");
109
+ const { loadConfig } = await import("./dist-YK4FYTB4.js");
110
110
  const config = await loadConfig(basePath);
111
111
  if (config) {
112
112
  res.writeHead(200, { "Content-Type": "application/json" });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sickbay",
3
- "version": "1.15.4",
3
+ "version": "1.15.6",
4
4
  "description": "Zero-config health check CLI for JavaScript and TypeScript projects",
5
5
  "license": "MIT",
6
6
  "repository": {