sickbay 1.15.7 → 1.15.8

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-PJI22Z5Y.js";
3
+ } from "./chunk-Q6CVOYTA.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-YK4FYTB4.js");
122
+ const { runSickbay } = await import("./dist-LK2SSQPX.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-L7KHKFWR.js";
3
+ } from "./chunk-O3BKUV2D.js";
4
4
  import {
5
5
  Header
6
- } from "./chunk-PJI22Z5Y.js";
6
+ } from "./chunk-Q6CVOYTA.js";
7
7
  import {
8
8
  detectPackageManager,
9
9
  detectProject
10
- } from "./chunk-XSQZTZWJ.js";
10
+ } from "./chunk-7Z6JB75D.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-L7KHKFWR.js";
3
+ } from "./chunk-O3BKUV2D.js";
4
4
  import {
5
5
  ProgressList
6
6
  } from "./chunk-MBVA75EM.js";
7
7
  import {
8
8
  Header
9
- } from "./chunk-PJI22Z5Y.js";
9
+ } from "./chunk-Q6CVOYTA.js";
10
10
  import {
11
11
  runSickbay
12
- } from "./chunk-XSQZTZWJ.js";
12
+ } from "./chunk-7Z6JB75D.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-L7KHKFWR.js";
3
+ } from "./chunk-O3BKUV2D.js";
4
4
  import {
5
5
  Header
6
- } from "./chunk-PJI22Z5Y.js";
6
+ } from "./chunk-Q6CVOYTA.js";
7
7
  import {
8
8
  detectProject
9
- } from "./chunk-XSQZTZWJ.js";
9
+ } from "./chunk-7Z6JB75D.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-L7KHKFWR.js";
7
+ } from "./chunk-O3BKUV2D.js";
8
8
  import {
9
9
  Header
10
- } from "./chunk-PJI22Z5Y.js";
11
- import "./chunk-XSQZTZWJ.js";
10
+ } from "./chunk-Q6CVOYTA.js";
11
+ import "./chunk-7Z6JB75D.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-XSQZTZWJ.js";
17
+ } from "./chunk-7Z6JB75D.js";
18
18
  import {
19
19
  loadHistory
20
20
  } from "./chunk-3OR2GFVE.js";
@@ -99,11 +99,17 @@ function useGitStatus(projectPath, pollInterval = 1e4) {
99
99
  const [status, setStatus] = useState(null);
100
100
  const intervalRef = useRef(void 0);
101
101
  useEffect(() => {
102
- fetchGitStatus(projectPath).then(setStatus);
102
+ let mounted = true;
103
+ fetchGitStatus(projectPath).then((s) => {
104
+ if (mounted) setStatus(s);
105
+ });
103
106
  intervalRef.current = setInterval(() => {
104
- fetchGitStatus(projectPath).then(setStatus);
107
+ fetchGitStatus(projectPath).then((s) => {
108
+ if (mounted) setStatus(s);
109
+ });
105
110
  }, pollInterval);
106
111
  return () => {
112
+ mounted = false;
107
113
  if (intervalRef.current) clearInterval(intervalRef.current);
108
114
  };
109
115
  }, [projectPath, pollInterval]);
@@ -237,6 +243,8 @@ function useFileWatcher({
237
243
  const debounceRef = useRef2(void 0);
238
244
  const pendingRef = useRef2([]);
239
245
  const watcherRef = useRef2(null);
246
+ const onFilesChangedRef = useRef2(onFilesChanged);
247
+ onFilesChangedRef.current = onFilesChanged;
240
248
  useEffect3(() => {
241
249
  if (!enabled) return;
242
250
  let mounted = true;
@@ -266,7 +274,7 @@ function useFileWatcher({
266
274
  debounceRef.current = setTimeout(() => {
267
275
  const files = [...pendingRef.current];
268
276
  pendingRef.current = [];
269
- onFilesChanged?.(files);
277
+ onFilesChangedRef.current?.(files);
270
278
  }, debounceMs);
271
279
  });
272
280
  } catch {
@@ -332,7 +340,15 @@ function useSickbayRunner({ projectPath, checks, quotes }) {
332
340
  const result2 = await runSickbayMonorepo({
333
341
  projectPath,
334
342
  checks,
335
- quotes
343
+ quotes,
344
+ onPackageStart: (name) => {
345
+ setProgress((prev) => [...prev, { name, status: "running" }]);
346
+ },
347
+ onPackageComplete: (pkg) => {
348
+ setProgress(
349
+ (prev) => prev.map((p) => p.name === pkg.name ? { ...p, status: "done" } : p)
350
+ );
351
+ }
336
352
  });
337
353
  setMonorepoReport(result2);
338
354
  const rolledUp = rollUpMonorepoReport(result2);
@@ -689,7 +705,7 @@ function TuiApp({
689
705
  return () => timers.forEach(clearTimeout);
690
706
  }, []);
691
707
  useEffect7(() => {
692
- checkForUpdate("1.15.6").then((info) => {
708
+ checkForUpdate("1.15.7").then((info) => {
693
709
  if (info) setUpdateInfo(info);
694
710
  });
695
711
  }, []);
@@ -715,7 +731,7 @@ function TuiApp({
715
731
  } catch {
716
732
  }
717
733
  try {
718
- const { getDependencyTree } = await import("./dist-YK4FYTB4.js");
734
+ const { getDependencyTree } = await import("./dist-LK2SSQPX.js");
719
735
  const { saveDepTree } = await import("./history-XLNVZEDI.js");
720
736
  const tree = await getDependencyTree(projectPath, result.projectInfo.packageManager);
721
737
  saveDepTree(projectPath, tree);
@@ -819,7 +835,7 @@ function TuiApp({
819
835
  const webReport = monorepoReportRef.current ?? reportRef.current;
820
836
  if (!webReport) return;
821
837
  try {
822
- const { serveWeb } = await import("./web-4P4CCEHQ.js");
838
+ const { serveWeb } = await import("./web-H2AR7HV5.js");
823
839
  const { default: openBrowser } = await import("open");
824
840
  let aiService;
825
841
  if (withAI && process.env.ANTHROPIC_API_KEY && !monorepoReportRef.current) {
@@ -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 relative3 } from "path";
3
+ import { basename as basename3, join as join38 } 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";
@@ -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 as relative2 } from "path";
78
+ import { dirname as dirname4, join as join31 } 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";
@@ -2362,7 +2362,7 @@ var CoverageRunner = class extends BaseRunner {
2362
2362
  category: this.category,
2363
2363
  name: "Tests & Coverage",
2364
2364
  score: Math.round(avg),
2365
- status: avg >= 80 ? "pass" : avg >= 50 ? "warning" : "fail",
2365
+ status: avg >= lineTarget ? "pass" : avg >= 50 ? "warning" : "fail",
2366
2366
  issues,
2367
2367
  toolsUsed: ["coverage"],
2368
2368
  duration: elapsed(),
@@ -4116,7 +4116,7 @@ function filterPnpmAdvisories(advisories, projectPath) {
4116
4116
  if (!workspaceRoot || workspaceRoot === projectPath) {
4117
4117
  return advisories;
4118
4118
  }
4119
- const importerPrefix = relative2(workspaceRoot, projectPath).replace(/\//g, "__");
4119
+ const importerPrefix = relativeFromRoot(workspaceRoot, projectPath).replace(/\//g, "__");
4120
4120
  const filtered = {};
4121
4121
  for (const [id, advisory] of Object.entries(advisories)) {
4122
4122
  const isRelevant = advisory.findings.some(
@@ -5428,7 +5428,7 @@ async function runSickbayMonorepo(options = {}) {
5428
5428
  }
5429
5429
  const rootConfig = await loadConfig(rootPath);
5430
5430
  const configMeta = resolveConfigMeta(rootConfig);
5431
- const packageReports = await Promise.all(
5431
+ const packageResults = await Promise.allSettled(
5432
5432
  monorepoInfo.packagePaths.map(async (pkgPath) => {
5433
5433
  const pkgConfig = await loadConfig(pkgPath);
5434
5434
  const mergedConfig = mergeConfigs(rootConfig, pkgConfig);
@@ -5438,7 +5438,7 @@ async function runSickbayMonorepo(options = {}) {
5438
5438
  const packageReport = {
5439
5439
  name: report.projectInfo.name,
5440
5440
  path: pkgPath,
5441
- relativePath: relative3(rootPath, pkgPath),
5441
+ relativePath: relativeFromRoot(rootPath, pkgPath),
5442
5442
  framework: report.projectInfo.framework,
5443
5443
  runtime: context.runtime,
5444
5444
  checks: report.checks,
@@ -5452,6 +5452,7 @@ async function runSickbayMonorepo(options = {}) {
5452
5452
  return packageReport;
5453
5453
  })
5454
5454
  );
5455
+ const packageReports = packageResults.filter((r) => r.status === "fulfilled").map((r) => r.value);
5455
5456
  const overallScore = packageReports.length > 0 ? Math.round(packageReports.reduce((sum, p) => sum + p.score, 0) / packageReports.length) : 0;
5456
5457
  const summary = packageReports.reduce(
5457
5458
  (acc, p) => ({
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  detectMonorepo
3
- } from "./chunk-XSQZTZWJ.js";
3
+ } from "./chunk-7Z6JB75D.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.6")), 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.7")), 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 {
package/dist/config.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  defineConfig
3
- } from "./chunk-XSQZTZWJ.js";
3
+ } from "./chunk-7Z6JB75D.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-XSQZTZWJ.js";
32
+ } from "./chunk-7Z6JB75D.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-PJI22Z5Y.js";
11
+ } from "./chunk-Q6CVOYTA.js";
12
12
  import {
13
13
  getScoreEmoji,
14
14
  runSickbay,
15
15
  runSickbayMonorepo
16
- } from "./chunk-XSQZTZWJ.js";
16
+ } from "./chunk-7Z6JB75D.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-YK4FYTB4.js");
193
+ const { getDependencyTree } = await import("./dist-LK2SSQPX.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-4P4CCEHQ.js");
205
+ const { serveWeb } = await import("./web-H2AR7HV5.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-YK4FYTB4.js");
262
+ const { getDependencyTree } = await import("./dist-LK2SSQPX.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-4P4CCEHQ.js");
271
+ const { serveWeb } = await import("./web-H2AR7HV5.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,12 @@ 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.6", "-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.7", "-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
+ if (!existsSync(options.path)) {
322
+ process.stderr.write(`Error: path does not exist: ${options.path}
323
+ `);
324
+ process.exit(1);
325
+ }
321
326
  if (options.path && options.path !== process.cwd()) {
322
327
  const projectEnvPath = join(options.path, ".env");
323
328
  if (existsSync(projectEnvPath)) {
@@ -327,13 +332,21 @@ program.name("sickbay").description("React project health check CLI").version("1
327
332
  const updatePromise = (async () => {
328
333
  try {
329
334
  const { checkForUpdate } = await import("./update-check-M7IFOMLJ.js");
330
- return await checkForUpdate("1.15.6");
335
+ return await checkForUpdate("1.15.7");
331
336
  } catch {
332
337
  return null;
333
338
  }
334
339
  })();
335
340
  const checks = options.checks ? options.checks.split(",").map((s) => s.trim()) : void 0;
336
- const { detectMonorepo, runSickbay: runSickbay2, runSickbayMonorepo: runSickbayMonorepo2 } = await import("./dist-YK4FYTB4.js");
341
+ const { detectMonorepo, runSickbay: runSickbay2, runSickbayMonorepo: runSickbayMonorepo2, getAvailableChecks } = await import("./dist-LK2SSQPX.js");
342
+ if (checks && checks.length > 0) {
343
+ const knownNames = new Set(getAvailableChecks().map((c) => c.name));
344
+ const unknown = checks.filter((c) => !knownNames.has(c));
345
+ if (unknown.length > 0) {
346
+ process.stderr.write(`Warning: unknown check ID(s): ${unknown.join(", ")}
347
+ `);
348
+ }
349
+ }
337
350
  const monorepoInfo = await detectMonorepo(options.path);
338
351
  if (options.package && monorepoInfo.isMonorepo) {
339
352
  const { readFileSync } = await import("fs");
@@ -397,7 +410,7 @@ program.name("sickbay").description("React project health check CLI").version("1
397
410
  } catch {
398
411
  }
399
412
  try {
400
- const { getDependencyTree } = await import("./dist-YK4FYTB4.js");
413
+ const { getDependencyTree } = await import("./dist-LK2SSQPX.js");
401
414
  const { saveDepTree } = await import("./history-XLNVZEDI.js");
402
415
  const tree = await getDependencyTree(options.path, report.projectInfo.packageManager);
403
416
  saveDepTree(options.path, tree);
@@ -424,16 +437,16 @@ program.command("init").description("Initialize .sickbay/ folder and run an init
424
437
  "add newly available checks to existing config without touching existing entries"
425
438
  ).option("--reset-config", "regenerate config from scratch (overwrites existing)").action(async (options) => {
426
439
  if (options.resetConfig) {
427
- const { generateConfigFile } = await import("./init-FA6F4WTV.js");
440
+ const { generateConfigFile } = await import("./init-5A3DUVIL.js");
428
441
  await generateConfigFile(options.path, { force: true });
429
442
  return;
430
443
  }
431
444
  if (options.sync) {
432
- const { syncConfigFile } = await import("./init-FA6F4WTV.js");
445
+ const { syncConfigFile } = await import("./init-5A3DUVIL.js");
433
446
  await syncConfigFile(options.path);
434
447
  return;
435
448
  }
436
- const { initSickbay } = await import("./init-FA6F4WTV.js");
449
+ const { initSickbay } = await import("./init-5A3DUVIL.js");
437
450
  await initSickbay(options.path);
438
451
  });
439
452
  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 +456,9 @@ program.command("fix").description("Interactively fix issues found by sickbay sc
443
456
  config({ path: projectEnvPath, override: true });
444
457
  }
445
458
  }
446
- const { resolveProject } = await import("./resolve-package-4UT4RYHY.js");
459
+ const { resolveProject } = await import("./resolve-package-MCBFGKN5.js");
447
460
  const resolution = await resolveProject(options.path, options.package);
448
- const { FixApp } = await import("./FixApp-GTFLJHMI.js");
461
+ const { FixApp } = await import("./FixApp-TMRUKUJD.js");
449
462
  const checks = options.checks ? options.checks.split(",").map((s) => s.trim()) : void 0;
450
463
  const projectPath = resolution.isMonorepo ? resolution.targetPath ?? options.path : resolution.targetPath;
451
464
  render(
@@ -468,10 +481,10 @@ program.command("trend").description("Show score history and trends over time").
468
481
  config({ path: projectEnvPath, override: true });
469
482
  }
470
483
  }
471
- const { resolveProject } = await import("./resolve-package-4UT4RYHY.js");
484
+ const { resolveProject } = await import("./resolve-package-MCBFGKN5.js");
472
485
  const resolution = await resolveProject(options.path, options.package);
473
486
  const projectPath = resolution.isMonorepo ? resolution.targetPath ?? options.path : resolution.targetPath;
474
- const { TrendApp } = await import("./TrendApp-BB3KOCYK.js");
487
+ const { TrendApp } = await import("./TrendApp-B7UGRJGC.js");
475
488
  render(
476
489
  React7.createElement(TrendApp, {
477
490
  projectPath,
@@ -490,10 +503,10 @@ program.command("stats").description("Show a quick codebase overview and project
490
503
  config({ path: projectEnvPath, override: true });
491
504
  }
492
505
  }
493
- const { resolveProject } = await import("./resolve-package-4UT4RYHY.js");
506
+ const { resolveProject } = await import("./resolve-package-MCBFGKN5.js");
494
507
  const resolution = await resolveProject(options.path, options.package);
495
508
  const projectPath = resolution.isMonorepo ? resolution.targetPath ?? options.path : resolution.targetPath;
496
- const { StatsApp } = await import("./StatsApp-GZITWMQU.js");
509
+ const { StatsApp } = await import("./StatsApp-LXJWX24A.js");
497
510
  render(
498
511
  React7.createElement(StatsApp, {
499
512
  projectPath,
@@ -505,7 +518,7 @@ program.command("stats").description("Show a quick codebase overview and project
505
518
  );
506
519
  });
507
520
  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-CZY5TGWC.js");
521
+ const { TuiApp } = await import("./TuiApp-P5ESVGCB.js");
509
522
  const checks = options.checks ? options.checks.split(",").map((s) => s.trim()) : void 0;
510
523
  render(
511
524
  React7.createElement(TuiApp, {
@@ -525,10 +538,10 @@ program.command("doctor").description("Diagnose project setup and configuration
525
538
  config({ path: projectEnvPath, override: true });
526
539
  }
527
540
  }
528
- const { resolveProject } = await import("./resolve-package-4UT4RYHY.js");
541
+ const { resolveProject } = await import("./resolve-package-MCBFGKN5.js");
529
542
  const resolution = await resolveProject(options.path, options.package);
530
543
  const projectPath = resolution.isMonorepo ? resolution.targetPath ?? options.path : resolution.targetPath;
531
- const { DoctorApp } = await import("./DoctorApp-RMHCSF6H.js");
544
+ const { DoctorApp } = await import("./DoctorApp-OPZBSIE6.js");
532
545
  render(
533
546
  React7.createElement(DoctorApp, {
534
547
  projectPath,
@@ -541,13 +554,13 @@ program.command("doctor").description("Diagnose project setup and configuration
541
554
  );
542
555
  });
543
556
  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-4UT4RYHY.js");
557
+ const { resolveProject } = await import("./resolve-package-MCBFGKN5.js");
545
558
  const resolution = await resolveProject(options.path, options.package);
546
559
  const projectPath = resolution.isMonorepo ? resolution.targetPath ?? options.path : resolution.targetPath;
547
560
  const { loadScoreFromLastReport, badgeUrl, badgeMarkdown, badgeHtml } = await import("./badge-KQ73KEIN.js");
548
561
  let score = options.scan ? null : loadScoreFromLastReport(projectPath);
549
562
  if (score === null) {
550
- const { runSickbay: runSickbay2 } = await import("./dist-YK4FYTB4.js");
563
+ const { runSickbay: runSickbay2 } = await import("./dist-LK2SSQPX.js");
551
564
  const report = await runSickbay2({ projectPath, quotes: false });
552
565
  try {
553
566
  const { saveEntry, saveLastReport } = await import("./history-XLNVZEDI.js");
@@ -580,7 +593,7 @@ program.command("diff <branch>").description("Compare health score against anoth
580
593
  }
581
594
  }
582
595
  const checks = options.checks ? options.checks.split(",").map((s) => s.trim()) : void 0;
583
- const { DiffApp } = await import("./DiffApp-OVPXXDEK.js");
596
+ const { DiffApp } = await import("./DiffApp-ECF2VINH.js");
584
597
  render(
585
598
  React7.createElement(DiffApp, {
586
599
  projectPath: options.path,
@@ -4,7 +4,7 @@ import {
4
4
  getAvailableChecks,
5
5
  runSickbay,
6
6
  runSickbayMonorepo
7
- } from "./chunk-XSQZTZWJ.js";
7
+ } from "./chunk-7Z6JB75D.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-L7KHKFWR.js";
5
- import "./chunk-XSQZTZWJ.js";
4
+ } from "./chunk-O3BKUV2D.js";
5
+ import "./chunk-7Z6JB75D.js";
6
6
  export {
7
7
  resolveProject,
8
8
  shortName
@@ -1 +1 @@
1
- {"version":3,"file":"constants-DYzuOu1F.js","names":["WARN_LINES","CRITICAL_LINES","SCORE_GOOD","SCORE_FAIR","DEFAULT_WEIGHTS","Record","security","dependencies","performance","git"],"sources":["../../src/lib/constants.ts"],"sourcesContent":["// Duplicated from sickbay-core/constants to avoid pulling Node.js\n// dependencies into the browser bundle. Keep in sync with core.\n\n// File complexity thresholds\nexport const WARN_LINES = 400;\nexport const CRITICAL_LINES = 600;\n\n// Score thresholds\nexport const SCORE_GOOD = 80;\nexport const SCORE_FAIR = 60;\n\n// Default category weights — duplicated from core to avoid Node.js imports\nexport const DEFAULT_WEIGHTS: Record<string, number> = {\n security: 0.3,\n dependencies: 0.25,\n 'code-quality': 0.25,\n performance: 0.15,\n git: 0.05,\n};\n"],"mappings":"AAYA,IAAaI,EAA0C,CACrDE,SAAU,GACVC,aAAc,IACd,eAAgB,IAChBC,YAAa,IACbC,IAAK,IACN"}
1
+ {"version":3,"file":"constants-DYzuOu1F.js","names":["WARN_LINES","CRITICAL_LINES","SCORE_EXCELLENT","SCORE_GOOD","SCORE_FAIR","DEFAULT_WEIGHTS","Record","security","dependencies","performance","git"],"sources":["../../src/lib/constants.ts"],"sourcesContent":["// Duplicated from sickbay-core/constants to avoid pulling Node.js\n// dependencies into the browser bundle. Keep in sync with core.\n\n// File complexity thresholds\nexport const WARN_LINES = 400;\nexport const CRITICAL_LINES = 600;\n\n// Score thresholds\nexport const SCORE_EXCELLENT = 90;\nexport const SCORE_GOOD = 80;\nexport const SCORE_FAIR = 60;\n\n// Default category weights — duplicated from core to avoid Node.js imports\nexport const DEFAULT_WEIGHTS: Record<string, number> = {\n security: 0.3,\n dependencies: 0.25,\n 'code-quality': 0.25,\n performance: 0.15,\n git: 0.05,\n};\n"],"mappings":"AAaA,IAAaK,EAA0C,CACrDE,SAAU,GACVC,aAAc,IACd,eAAgB,IAChBC,YAAa,IACbC,IAAK,IACN"}