sickbay 1.16.0 → 1.16.2

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 (63) hide show
  1. package/README.md +1 -1
  2. package/dist/DiffApp-DeNEtlY7.js +181 -0
  3. package/dist/DiffApp-DeNEtlY7.js.map +1 -0
  4. package/dist/DoctorApp-CaiqnhHH.js +415 -0
  5. package/dist/DoctorApp-CaiqnhHH.js.map +1 -0
  6. package/dist/FixApp-MWXohP60.js +337 -0
  7. package/dist/FixApp-MWXohP60.js.map +1 -0
  8. package/dist/StatsApp-BC4P4hII.js +372 -0
  9. package/dist/StatsApp-BC4P4hII.js.map +1 -0
  10. package/dist/TrendApp-DOBt7ITA.js +127 -0
  11. package/dist/TrendApp-DOBt7ITA.js.map +1 -0
  12. package/dist/TuiApp-D4Wn81Qv.js +1042 -0
  13. package/dist/TuiApp-D4Wn81Qv.js.map +1 -0
  14. package/dist/ai-DxA5r3hA.js +69 -0
  15. package/dist/ai-DxA5r3hA.js.map +1 -0
  16. package/dist/badge-DB3y0fWt.js +37 -0
  17. package/dist/badge-DB3y0fWt.js.map +1 -0
  18. package/dist/{claude-SN6IVGBI.js → claude-C5dUtWBJ.js} +13 -12
  19. package/dist/claude-C5dUtWBJ.js.map +1 -0
  20. package/dist/config.d.ts +27 -1
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +2 -6
  23. package/dist/dist-Bjhxbcak.js +5431 -0
  24. package/dist/dist-Bjhxbcak.js.map +1 -0
  25. package/dist/history-DVegAwFp.js +83 -0
  26. package/dist/history-DVegAwFp.js.map +1 -0
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.js +692 -564
  29. package/dist/index.js.map +1 -0
  30. package/dist/init-Dn7eDMEp.js +199 -0
  31. package/dist/init-Dn7eDMEp.js.map +1 -0
  32. package/dist/resolve-package-DS27JBhN.js +60 -0
  33. package/dist/resolve-package-DS27JBhN.js.map +1 -0
  34. package/dist/rolldown-runtime-CiIaOW0V.js +13 -0
  35. package/dist/trend-D-Hufthb.js +45 -0
  36. package/dist/trend-D-Hufthb.js.map +1 -0
  37. package/dist/update-check-C7bNNfvf.js +58 -0
  38. package/dist/update-check-C7bNNfvf.js.map +1 -0
  39. package/dist/web-D5etye5Q.js +259 -0
  40. package/dist/web-D5etye5Q.js.map +1 -0
  41. package/package.json +6 -5
  42. package/dist/DiffApp-ASQWWDLS.js +0 -172
  43. package/dist/DoctorApp-SMIZDD64.js +0 -440
  44. package/dist/FixApp-63PU5VF7.js +0 -351
  45. package/dist/StatsApp-CFZBEITZ.js +0 -356
  46. package/dist/TrendApp-BKGRSP6Q.js +0 -106
  47. package/dist/TuiApp-K7KP35RC.js +0 -980
  48. package/dist/ai-7DGOLNJX.js +0 -64
  49. package/dist/badge-KQ73KEIN.js +0 -41
  50. package/dist/chunk-352RAVRZ.js +0 -19
  51. package/dist/chunk-3OR2GFVE.js +0 -90
  52. package/dist/chunk-DJA6K3MN.js +0 -5564
  53. package/dist/chunk-LZOEMCE7.js +0 -62
  54. package/dist/chunk-MBVA75EM.js +0 -19
  55. package/dist/chunk-SHO3ZXTH.js +0 -23
  56. package/dist/chunk-TWCTPAXQ.js +0 -73
  57. package/dist/chunk-VBM6NZAY.js +0 -60
  58. package/dist/dist-LQY3FYCP.js +0 -64
  59. package/dist/history-XLNVZEDI.js +0 -14
  60. package/dist/init-DD2HOQE2.js +0 -217
  61. package/dist/resolve-package-774YTW5Q.js +0 -9
  62. package/dist/update-check-M7IFOMLJ.js +0 -12
  63. package/dist/web-2KWCYTW4.js +0 -269
@@ -0,0 +1,83 @@
1
+ import { t as __exportAll } from "./rolldown-runtime-CiIaOW0V.js";
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
3
+ import { join } from "path";
4
+ //#region src/lib/history.ts
5
+ var history_exports = /* @__PURE__ */ __exportAll({
6
+ detectRegressions: () => detectRegressions,
7
+ loadHistory: () => loadHistory,
8
+ saveDepTree: () => saveDepTree,
9
+ saveEntry: () => saveEntry,
10
+ saveLastReport: () => saveLastReport
11
+ });
12
+ function historyFilePath(projectPath) {
13
+ return join(projectPath, ".sickbay", "history.json");
14
+ }
15
+ function loadHistory(projectPath) {
16
+ const filePath = historyFilePath(projectPath);
17
+ if (!existsSync(filePath)) return null;
18
+ try {
19
+ return JSON.parse(readFileSync(filePath, "utf-8"));
20
+ } catch {
21
+ return null;
22
+ }
23
+ }
24
+ function saveEntry(report) {
25
+ mkdirSync(join(report.projectPath, ".sickbay"), { recursive: true });
26
+ const filePath = historyFilePath(report.projectPath);
27
+ const existing = loadHistory(report.projectPath) ?? {
28
+ projectPath: report.projectPath,
29
+ projectName: report.projectInfo.name,
30
+ entries: []
31
+ };
32
+ const categoryScores = {};
33
+ const categoryChecks = {};
34
+ for (const check of report.checks) {
35
+ if (check.status === "skipped") continue;
36
+ if (!categoryChecks[check.category]) categoryChecks[check.category] = [];
37
+ categoryChecks[check.category].push(check.score);
38
+ }
39
+ for (const [cat, scores] of Object.entries(categoryChecks)) categoryScores[cat] = Math.round(scores.reduce((a, b) => a + b, 0) / scores.length);
40
+ existing.entries.push({
41
+ timestamp: report.timestamp,
42
+ overallScore: report.overallScore,
43
+ categoryScores,
44
+ summary: { ...report.summary },
45
+ checksRun: report.checks.filter((c) => c.status !== "skipped").length
46
+ });
47
+ if (existing.entries.length > 100) existing.entries = existing.entries.slice(-100);
48
+ writeFileSync(filePath, JSON.stringify(existing, null, 2));
49
+ }
50
+ function saveLastReport(report) {
51
+ mkdirSync(join(report.projectPath, ".sickbay"), { recursive: true });
52
+ writeFileSync(join(report.projectPath, ".sickbay", "last-report.json"), JSON.stringify(report, null, 2));
53
+ }
54
+ function saveDepTree(projectPath, tree) {
55
+ mkdirSync(join(projectPath, ".sickbay"), { recursive: true });
56
+ writeFileSync(join(projectPath, ".sickbay", "dep-tree.json"), JSON.stringify(tree, null, 2));
57
+ }
58
+ function detectRegressions(entries) {
59
+ if (entries.length < 2) return [];
60
+ const latest = entries[entries.length - 1];
61
+ const previous = entries[entries.length - 2];
62
+ const regressions = [];
63
+ if (latest.overallScore < previous.overallScore - 5) regressions.push({
64
+ category: "overall",
65
+ drop: previous.overallScore - latest.overallScore,
66
+ from: previous.overallScore,
67
+ to: latest.overallScore
68
+ });
69
+ for (const [cat, score] of Object.entries(latest.categoryScores)) {
70
+ const prevScore = previous.categoryScores[cat];
71
+ if (prevScore !== void 0 && score < prevScore - 5) regressions.push({
72
+ category: cat,
73
+ drop: prevScore - score,
74
+ from: prevScore,
75
+ to: score
76
+ });
77
+ }
78
+ return regressions;
79
+ }
80
+ //#endregion
81
+ export { saveEntry as i, history_exports as n, loadHistory as r, detectRegressions as t };
82
+
83
+ //# sourceMappingURL=history-DVegAwFp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-DVegAwFp.js","names":[],"sources":["../src/lib/history.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\n\nimport type { SickbayReport } from 'sickbay-core';\n\nexport interface TrendEntry {\n timestamp: string;\n overallScore: number;\n categoryScores: Record<string, number>;\n summary: { critical: number; warnings: number; info: number };\n checksRun: number;\n}\n\nexport interface TrendHistory {\n projectPath: string;\n projectName: string;\n entries: TrendEntry[];\n}\n\nfunction historyFilePath(projectPath: string): string {\n return join(projectPath, '.sickbay', 'history.json');\n}\n\nexport function loadHistory(projectPath: string): TrendHistory | null {\n const filePath = historyFilePath(projectPath);\n if (!existsSync(filePath)) return null;\n try {\n return JSON.parse(readFileSync(filePath, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function saveEntry(report: SickbayReport): void {\n mkdirSync(join(report.projectPath, '.sickbay'), { recursive: true });\n\n const filePath = historyFilePath(report.projectPath);\n const existing = loadHistory(report.projectPath) ?? {\n projectPath: report.projectPath,\n projectName: report.projectInfo.name,\n entries: [],\n };\n\n const categoryScores: Record<string, number> = {};\n const categoryChecks: Record<string, number[]> = {};\n for (const check of report.checks) {\n if (check.status === 'skipped') continue;\n if (!categoryChecks[check.category]) categoryChecks[check.category] = [];\n categoryChecks[check.category].push(check.score);\n }\n for (const [cat, scores] of Object.entries(categoryChecks)) {\n categoryScores[cat] = Math.round(scores.reduce((a, b) => a + b, 0) / scores.length);\n }\n\n existing.entries.push({\n timestamp: report.timestamp,\n overallScore: report.overallScore,\n categoryScores,\n summary: { ...report.summary },\n checksRun: report.checks.filter((c) => c.status !== 'skipped').length,\n });\n\n if (existing.entries.length > 100) {\n existing.entries = existing.entries.slice(-100);\n }\n\n writeFileSync(filePath, JSON.stringify(existing, null, 2));\n}\n\nexport function saveLastReport(report: SickbayReport): void {\n mkdirSync(join(report.projectPath, '.sickbay'), { recursive: true });\n writeFileSync(\n join(report.projectPath, '.sickbay', 'last-report.json'),\n JSON.stringify(report, null, 2),\n );\n}\n\nexport function saveDepTree(projectPath: string, tree: unknown): void {\n mkdirSync(join(projectPath, '.sickbay'), { recursive: true });\n writeFileSync(join(projectPath, '.sickbay', 'dep-tree.json'), JSON.stringify(tree, null, 2));\n}\n\nexport function detectRegressions(\n entries: TrendEntry[],\n): Array<{ category: string; drop: number; from: number; to: number }> {\n if (entries.length < 2) return [];\n const latest = entries[entries.length - 1];\n const previous = entries[entries.length - 2];\n\n const regressions: Array<{\n category: string;\n drop: number;\n from: number;\n to: number;\n }> = [];\n\n if (latest.overallScore < previous.overallScore - 5) {\n regressions.push({\n category: 'overall',\n drop: previous.overallScore - latest.overallScore,\n from: previous.overallScore,\n to: latest.overallScore,\n });\n }\n\n for (const [cat, score] of Object.entries(latest.categoryScores)) {\n const prevScore = previous.categoryScores[cat];\n if (prevScore !== undefined && score < prevScore - 5) {\n regressions.push({\n category: cat,\n drop: prevScore - score,\n from: prevScore,\n to: score,\n });\n }\n }\n\n return regressions;\n}\n"],"mappings":";;;;;;;;;;;AAmBA,SAAS,gBAAgB,aAA6B;AACpD,QAAO,KAAK,aAAa,YAAY,eAAe;;AAGtD,SAAgB,YAAY,aAA0C;CACpE,MAAM,WAAW,gBAAgB,YAAY;AAC7C,KAAI,CAAC,WAAW,SAAS,CAAE,QAAO;AAClC,KAAI;AACF,SAAO,KAAK,MAAM,aAAa,UAAU,QAAQ,CAAC;SAC5C;AACN,SAAO;;;AAIX,SAAgB,UAAU,QAA6B;AACrD,WAAU,KAAK,OAAO,aAAa,WAAW,EAAE,EAAE,WAAW,MAAM,CAAC;CAEpE,MAAM,WAAW,gBAAgB,OAAO,YAAY;CACpD,MAAM,WAAW,YAAY,OAAO,YAAY,IAAI;EAClD,aAAa,OAAO;EACpB,aAAa,OAAO,YAAY;EAChC,SAAS,EAAE;EACZ;CAED,MAAM,iBAAyC,EAAE;CACjD,MAAM,iBAA2C,EAAE;AACnD,MAAK,MAAM,SAAS,OAAO,QAAQ;AACjC,MAAI,MAAM,WAAW,UAAW;AAChC,MAAI,CAAC,eAAe,MAAM,UAAW,gBAAe,MAAM,YAAY,EAAE;AACxE,iBAAe,MAAM,UAAU,KAAK,MAAM,MAAM;;AAElD,MAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,eAAe,CACxD,gBAAe,OAAO,KAAK,MAAM,OAAO,QAAQ,GAAG,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,OAAO;AAGrF,UAAS,QAAQ,KAAK;EACpB,WAAW,OAAO;EAClB,cAAc,OAAO;EACrB;EACA,SAAS,EAAE,GAAG,OAAO,SAAS;EAC9B,WAAW,OAAO,OAAO,QAAQ,MAAM,EAAE,WAAW,UAAU,CAAC;EAChE,CAAC;AAEF,KAAI,SAAS,QAAQ,SAAS,IAC5B,UAAS,UAAU,SAAS,QAAQ,MAAM,KAAK;AAGjD,eAAc,UAAU,KAAK,UAAU,UAAU,MAAM,EAAE,CAAC;;AAG5D,SAAgB,eAAe,QAA6B;AAC1D,WAAU,KAAK,OAAO,aAAa,WAAW,EAAE,EAAE,WAAW,MAAM,CAAC;AACpE,eACE,KAAK,OAAO,aAAa,YAAY,mBAAmB,EACxD,KAAK,UAAU,QAAQ,MAAM,EAAE,CAChC;;AAGH,SAAgB,YAAY,aAAqB,MAAqB;AACpE,WAAU,KAAK,aAAa,WAAW,EAAE,EAAE,WAAW,MAAM,CAAC;AAC7D,eAAc,KAAK,aAAa,YAAY,gBAAgB,EAAE,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC;;AAG9F,SAAgB,kBACd,SACqE;AACrE,KAAI,QAAQ,SAAS,EAAG,QAAO,EAAE;CACjC,MAAM,SAAS,QAAQ,QAAQ,SAAS;CACxC,MAAM,WAAW,QAAQ,QAAQ,SAAS;CAE1C,MAAM,cAKD,EAAE;AAEP,KAAI,OAAO,eAAe,SAAS,eAAe,EAChD,aAAY,KAAK;EACf,UAAU;EACV,MAAM,SAAS,eAAe,OAAO;EACrC,MAAM,SAAS;EACf,IAAI,OAAO;EACZ,CAAC;AAGJ,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,eAAe,EAAE;EAChE,MAAM,YAAY,SAAS,eAAe;AAC1C,MAAI,cAAc,KAAA,KAAa,QAAQ,YAAY,EACjD,aAAY,KAAK;GACf,UAAU;GACV,MAAM,YAAY;GAClB,MAAM;GACN,IAAI;GACL,CAAC;;AAIN,QAAO"}
package/dist/index.d.ts CHANGED
@@ -1 +1 @@
1
- #!/usr/bin/env node
1
+ export { };