@mks2508/better-logger 0.0.2-alpha.2 → 0.3.0

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 (326) hide show
  1. package/.claude/settings.local.json +18 -2
  2. package/.github/workflows/ci-quality.yml +357 -0
  3. package/.github/workflows/docs-demo.yml +119 -0
  4. package/.github/workflows/releases-core.yml +512 -0
  5. package/.github/workflows/releases-full.yml +582 -0
  6. package/.github/{workflows → workflows-backup}/ci.yml +12 -110
  7. package/.github/workflows-backup/nightly.yml +196 -0
  8. package/.github/workflows-backup/release-optimized.yml +373 -0
  9. package/.release-notes-0.2.0.md +129 -0
  10. package/.yamllint +28 -0
  11. package/CHANGELOG.json +783 -0
  12. package/CLAUDE.md +92 -1
  13. package/README.md +198 -490
  14. package/bun.lock +323 -0
  15. package/demo.html +9 -2
  16. package/dist/.tsbuildinfo +1 -0
  17. package/dist/Logger.d.ts +272 -0
  18. package/dist/Logger.d.ts.map +1 -0
  19. package/dist/Logger.js +680 -0
  20. package/dist/ScopedLogger.d.ts +126 -0
  21. package/dist/ScopedLogger.d.ts.map +1 -0
  22. package/dist/ScopedLogger.js +234 -0
  23. package/dist/chunks/Logger-BpeuYIxR.js +2 -0
  24. package/dist/chunks/Logger-BpeuYIxR.js.map +1 -0
  25. package/dist/chunks/Logger-Didxtr23.js +3275 -0
  26. package/dist/chunks/Logger-Didxtr23.js.map +1 -0
  27. package/dist/chunks/RemoteLogHandler-CjWpWZGl.js +33 -0
  28. package/dist/chunks/RemoteLogHandler-CjWpWZGl.js.map +1 -0
  29. package/dist/chunks/RemoteLogHandler-ymkQ97xl.js +2 -0
  30. package/dist/chunks/RemoteLogHandler-ymkQ97xl.js.map +1 -0
  31. package/dist/chunks/environment-Bxbnw4pd.js +544 -0
  32. package/dist/chunks/environment-Bxbnw4pd.js.map +1 -0
  33. package/dist/chunks/environment-Dm66zOML.js +4 -0
  34. package/dist/chunks/environment-Dm66zOML.js.map +1 -0
  35. package/dist/chunks/formatting-C0riPC5_.js +95 -0
  36. package/dist/chunks/formatting-C0riPC5_.js.map +1 -0
  37. package/dist/chunks/formatting-DNCAV66-.js +2 -0
  38. package/dist/chunks/formatting-DNCAV66-.js.map +1 -0
  39. package/dist/cli/CommandProcessor.d.ts +103 -0
  40. package/dist/cli/CommandProcessor.d.ts.map +1 -0
  41. package/dist/cli/CommandProcessor.js +184 -0
  42. package/dist/cli/commands/ConfigCommand.d.ts +17 -0
  43. package/dist/cli/commands/ConfigCommand.d.ts.map +1 -0
  44. package/dist/cli/commands/ConfigCommand.js +88 -0
  45. package/dist/cli/commands/ExportCommand.d.ts +51 -0
  46. package/dist/cli/commands/ExportCommand.d.ts.map +1 -0
  47. package/dist/cli/commands/ExportCommand.js +243 -0
  48. package/dist/cli/commands/HistoryCommand.d.ts +50 -0
  49. package/dist/cli/commands/HistoryCommand.d.ts.map +1 -0
  50. package/dist/cli/commands/HistoryCommand.js +96 -0
  51. package/dist/cli/commands/StatusCommand.d.ts +33 -0
  52. package/dist/cli/commands/StatusCommand.d.ts.map +1 -0
  53. package/dist/cli/commands/StatusCommand.js +93 -0
  54. package/dist/cli/commands/ThemeCommand.d.ts +33 -0
  55. package/dist/cli/commands/ThemeCommand.d.ts.map +1 -0
  56. package/dist/cli/commands/ThemeCommand.js +79 -0
  57. package/dist/cli/help.d.ts +15 -0
  58. package/dist/cli/help.d.ts.map +1 -0
  59. package/dist/cli/help.js +118 -0
  60. package/dist/cli/index.d.ts +15 -0
  61. package/dist/cli/index.d.ts.map +1 -0
  62. package/dist/cli/index.js +46 -0
  63. package/dist/constants.d.ts +122 -0
  64. package/dist/constants.d.ts.map +1 -0
  65. package/dist/constants.js +159 -0
  66. package/dist/core.cjs +1 -1
  67. package/dist/core.cjs.map +1 -1
  68. package/dist/core.d.ts +134 -0
  69. package/dist/core.d.ts.map +1 -0
  70. package/dist/core.js +315 -242
  71. package/dist/core.js.map +1 -1
  72. package/dist/example.d.ts +18 -0
  73. package/dist/example.d.ts.map +1 -0
  74. package/dist/example.js +154 -0
  75. package/dist/exports-module.d.ts +203 -0
  76. package/dist/exports-module.d.ts.map +1 -0
  77. package/dist/exports-module.js +260 -0
  78. package/dist/exports.cjs +1 -1
  79. package/dist/exports.cjs.map +1 -1
  80. package/dist/exports.js +5 -4
  81. package/dist/exports.js.map +1 -1
  82. package/dist/handlers/AnalyticsLogHandler.d.ts +11 -0
  83. package/dist/handlers/AnalyticsLogHandler.d.ts.map +1 -0
  84. package/dist/handlers/AnalyticsLogHandler.js +19 -0
  85. package/dist/handlers/ExportLogHandler.d.ts +103 -0
  86. package/dist/handlers/ExportLogHandler.d.ts.map +1 -0
  87. package/dist/handlers/ExportLogHandler.js +516 -0
  88. package/dist/handlers/FileLogHandler.d.ts +36 -0
  89. package/dist/handlers/FileLogHandler.d.ts.map +1 -0
  90. package/dist/handlers/FileLogHandler.js +156 -0
  91. package/dist/handlers/RemoteLogHandler.d.ts +14 -0
  92. package/dist/handlers/RemoteLogHandler.d.ts.map +1 -0
  93. package/dist/handlers/RemoteLogHandler.js +37 -0
  94. package/dist/handlers/index.d.ts +8 -0
  95. package/dist/handlers/index.d.ts.map +1 -0
  96. package/dist/handlers/index.js +7 -0
  97. package/dist/index.cjs +1 -1
  98. package/dist/index.cjs.map +1 -1
  99. package/dist/index.d.ts +86 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +89 -103
  102. package/dist/index.js.map +1 -1
  103. package/dist/main.d.ts +2 -0
  104. package/dist/main.d.ts.map +1 -0
  105. package/dist/main.js +139 -0
  106. package/dist/styling/LogStyleBuilder.d.ts +149 -0
  107. package/dist/styling/LogStyleBuilder.d.ts.map +1 -0
  108. package/dist/styling/LogStyleBuilder.js +289 -0
  109. package/dist/styling/SemanticStyles.d.ts +181 -0
  110. package/dist/styling/SemanticStyles.d.ts.map +1 -0
  111. package/dist/styling/SemanticStyles.js +339 -0
  112. package/dist/styling/SmartPresets.d.ts +25 -0
  113. package/dist/styling/SmartPresets.d.ts.map +1 -0
  114. package/dist/styling/SmartPresets.js +276 -0
  115. package/dist/styling/StyleBuilder.d.ts +140 -0
  116. package/dist/styling/StyleBuilder.d.ts.map +1 -0
  117. package/dist/styling/StyleBuilder.js +280 -0
  118. package/dist/styling/banners.d.ts +45 -0
  119. package/dist/styling/banners.d.ts.map +1 -0
  120. package/dist/styling/banners.js +155 -0
  121. package/dist/styling/index.d.ts +10 -0
  122. package/dist/styling/index.d.ts.map +1 -0
  123. package/dist/styling/index.js +9 -0
  124. package/dist/styling/themes.d.ts +10 -0
  125. package/dist/styling/themes.d.ts.map +1 -0
  126. package/dist/styling/themes.js +231 -0
  127. package/dist/styling-module.d.ts +185 -0
  128. package/dist/styling-module.d.ts.map +1 -0
  129. package/dist/styling-module.js +199 -0
  130. package/dist/styling.cjs +1 -1
  131. package/dist/styling.cjs.map +1 -1
  132. package/dist/styling.js +6 -6
  133. package/dist/styling.js.map +1 -1
  134. package/dist/types/Logger.d.ts +268 -0
  135. package/dist/types/Logger.d.ts.map +1 -0
  136. package/dist/types/ScopedLogger.d.ts +123 -0
  137. package/dist/types/ScopedLogger.d.ts.map +1 -0
  138. package/dist/types/cli/CommandProcessor.d.ts +100 -0
  139. package/dist/types/cli/CommandProcessor.d.ts.map +1 -0
  140. package/dist/types/cli/commands/ConfigCommand.d.ts +14 -0
  141. package/dist/types/cli/commands/ConfigCommand.d.ts.map +1 -0
  142. package/dist/types/cli/commands/ExportCommand.d.ts +48 -0
  143. package/dist/types/cli/commands/ExportCommand.d.ts.map +1 -0
  144. package/dist/types/cli/commands/HistoryCommand.d.ts +47 -0
  145. package/dist/types/cli/commands/HistoryCommand.d.ts.map +1 -0
  146. package/dist/types/cli/commands/StatusCommand.d.ts +30 -0
  147. package/dist/types/cli/commands/StatusCommand.d.ts.map +1 -0
  148. package/dist/types/cli/commands/ThemeCommand.d.ts +30 -0
  149. package/dist/types/cli/commands/ThemeCommand.d.ts.map +1 -0
  150. package/dist/types/cli/help.d.ts +12 -0
  151. package/dist/types/cli/help.d.ts.map +1 -0
  152. package/dist/types/cli/index.d.ts +15 -0
  153. package/dist/types/cli/index.d.ts.map +1 -0
  154. package/dist/types/constants.d.ts +119 -0
  155. package/dist/types/constants.d.ts.map +1 -0
  156. package/dist/types/core.d.ts +125 -211
  157. package/dist/types/core.d.ts.map +1 -0
  158. package/dist/types/core.js +13 -0
  159. package/dist/types/example.d.ts +18 -0
  160. package/dist/types/example.d.ts.map +1 -0
  161. package/dist/types/exports-module.d.ts +196 -0
  162. package/dist/types/exports-module.d.ts.map +1 -0
  163. package/dist/types/handlers/AnalyticsLogHandler.d.ts +8 -0
  164. package/dist/types/handlers/AnalyticsLogHandler.d.ts.map +1 -0
  165. package/dist/types/handlers/ExportLogHandler.d.ts +100 -0
  166. package/dist/types/handlers/ExportLogHandler.d.ts.map +1 -0
  167. package/dist/types/handlers/FileLogHandler.d.ts +33 -0
  168. package/dist/types/handlers/FileLogHandler.d.ts.map +1 -0
  169. package/dist/types/handlers/RemoteLogHandler.d.ts +11 -0
  170. package/dist/types/handlers/RemoteLogHandler.d.ts.map +1 -0
  171. package/dist/types/handlers/index.d.ts +8 -0
  172. package/dist/types/handlers/index.d.ts.map +1 -0
  173. package/dist/types/handlers.d.ts +88 -0
  174. package/dist/types/handlers.d.ts.map +1 -0
  175. package/dist/types/handlers.js +4 -0
  176. package/dist/types/index.d.ts +7 -675
  177. package/dist/types/index.d.ts.map +1 -0
  178. package/dist/types/index.js +4 -0
  179. package/dist/types/main.d.ts +2 -0
  180. package/dist/types/main.d.ts.map +1 -0
  181. package/dist/types/styling/LogStyleBuilder.d.ts +146 -0
  182. package/dist/types/styling/LogStyleBuilder.d.ts.map +1 -0
  183. package/dist/types/styling/SemanticStyles.d.ts +178 -0
  184. package/dist/types/styling/SemanticStyles.d.ts.map +1 -0
  185. package/dist/types/styling/SmartPresets.d.ts +22 -0
  186. package/dist/types/styling/SmartPresets.d.ts.map +1 -0
  187. package/dist/types/styling/StyleBuilder.d.ts +140 -0
  188. package/dist/types/styling/StyleBuilder.d.ts.map +1 -0
  189. package/dist/types/styling/banners.d.ts +42 -0
  190. package/dist/types/styling/banners.d.ts.map +1 -0
  191. package/dist/types/styling/index.d.ts +10 -0
  192. package/dist/types/styling/index.d.ts.map +1 -0
  193. package/dist/types/styling/themes.d.ts +7 -0
  194. package/dist/types/styling/themes.d.ts.map +1 -0
  195. package/dist/types/styling-module.d.ts +178 -0
  196. package/dist/types/styling-module.d.ts.map +1 -0
  197. package/dist/types/types/core.d.ts +125 -0
  198. package/dist/types/types/core.d.ts.map +1 -0
  199. package/dist/types/types/handlers.d.ts +85 -0
  200. package/dist/types/types/handlers.d.ts.map +1 -0
  201. package/dist/types/types/index.d.ts +7 -0
  202. package/dist/types/types/index.d.ts.map +1 -0
  203. package/dist/types/utils/environment.d.ts +47 -0
  204. package/dist/types/utils/environment.d.ts.map +1 -0
  205. package/dist/types/utils/formatting.d.ts +37 -0
  206. package/dist/types/utils/formatting.d.ts.map +1 -0
  207. package/dist/types/utils/index.d.ts +7 -0
  208. package/dist/types/utils/index.d.ts.map +1 -0
  209. package/dist/types/utils/opentui-detection.d.ts +34 -0
  210. package/dist/types/utils/opentui-detection.d.ts.map +1 -0
  211. package/dist/types/utils/output.d.ts +41 -0
  212. package/dist/types/utils/output.d.ts.map +1 -0
  213. package/dist/types/utils/stackTrace.d.ts +6 -0
  214. package/dist/types/utils/stackTrace.d.ts.map +1 -0
  215. package/dist/types/utils/timestamps.d.ts +20 -0
  216. package/dist/types/utils/timestamps.d.ts.map +1 -0
  217. package/dist/utils/environment.d.ts +47 -0
  218. package/dist/utils/environment.d.ts.map +1 -0
  219. package/dist/utils/environment.js +85 -0
  220. package/dist/utils/formatting.d.ts +40 -0
  221. package/dist/utils/formatting.d.ts.map +1 -0
  222. package/dist/utils/formatting.js +117 -0
  223. package/dist/utils/index.d.ts +7 -0
  224. package/dist/utils/index.d.ts.map +1 -0
  225. package/dist/utils/index.js +6 -0
  226. package/dist/utils/opentui-detection.d.ts +34 -0
  227. package/dist/utils/opentui-detection.d.ts.map +1 -0
  228. package/dist/utils/opentui-detection.js +116 -0
  229. package/dist/utils/output.d.ts +44 -0
  230. package/dist/utils/output.d.ts.map +1 -0
  231. package/dist/utils/output.js +150 -0
  232. package/dist/utils/stackTrace.d.ts +9 -0
  233. package/dist/utils/stackTrace.d.ts.map +1 -0
  234. package/dist/utils/stackTrace.js +81 -0
  235. package/dist/utils/timestamps.d.ts +20 -0
  236. package/dist/utils/timestamps.d.ts.map +1 -0
  237. package/dist/utils/timestamps.js +71 -0
  238. package/docs/API.md +691 -0
  239. package/docs/CORE.md +10 -10
  240. package/docs/DEVELOPMENT.md +731 -0
  241. package/docs/PACKAGES.md +244 -0
  242. package/docs/_config.yml +36 -0
  243. package/docs/index.md +179 -0
  244. package/examples/README.md +208 -0
  245. package/examples/basic-logging.js +75 -0
  246. package/examples/data-export.js +234 -0
  247. package/examples/package.json +16 -0
  248. package/examples/performance-timing.js +170 -0
  249. package/examples/simplified-api.js +124 -0
  250. package/examples/styling-themes.js +207 -0
  251. package/package.json +37 -21
  252. package/packages/core/package.json +57 -0
  253. package/packages/exports/package.json +41 -0
  254. package/packages/nodejs-opentui/README.md +232 -0
  255. package/packages/nodejs-opentui/package.json +72 -0
  256. package/packages/nodejs-opentui/src/LogRenderer.ts +171 -0
  257. package/packages/nodejs-opentui/src/OpenTUILogHandler.ts +178 -0
  258. package/packages/nodejs-opentui/src/components/LogBadge.tsx +131 -0
  259. package/packages/nodejs-opentui/src/index.ts +133 -0
  260. package/packages/nodejs-opentui/src/types.ts +158 -0
  261. package/packages/nodejs-opentui/tsconfig.json +20 -0
  262. package/packages/styling/package.json +41 -0
  263. package/project-utils/README.md +172 -0
  264. package/project-utils/auto-release-gemini.ts +1193 -0
  265. package/project-utils/auto-release-ui.ts +1329 -0
  266. package/project-utils/commit-generator.ts +1385 -0
  267. package/project-utils/commit-ui.ts +264 -0
  268. package/project-utils/git-utils.ts +199 -0
  269. package/project-utils/github-release-manager.ts +466 -0
  270. package/project-utils/project-config.ts +260 -0
  271. package/project-utils/prompt-templates.js +345 -0
  272. package/project-utils/prompt-templates.ts +422 -0
  273. package/project-utils/version-manager.ts +1078 -0
  274. package/src/Logger.ts +251 -16
  275. package/src/ScopedLogger.ts +262 -0
  276. package/src/cli/CommandProcessor.ts +173 -2
  277. package/src/cli/commands/HistoryCommand.ts +117 -0
  278. package/src/cli/index.ts +12 -0
  279. package/src/constants.ts +84 -2
  280. package/src/core.ts +119 -46
  281. package/src/example.ts +4 -4
  282. package/src/exports-module.ts +1 -1
  283. package/src/handlers/ExportLogHandler.ts +141 -0
  284. package/src/handlers/FileLogHandler.ts +144 -5
  285. package/src/index.ts +1 -1
  286. package/src/main.ts +3 -3
  287. package/src/styling/LogStyleBuilder.ts +355 -0
  288. package/src/styling/SemanticStyles.ts +380 -0
  289. package/src/styling/SmartPresets.ts +288 -0
  290. package/src/styling/StyleBuilder.ts +14 -0
  291. package/src/styling/index.ts +16 -1
  292. package/src/styling-module.ts +1 -1
  293. package/src/types/core.ts +60 -0
  294. package/src/types/index.ts +6 -0
  295. package/src/utils/environment.ts +94 -0
  296. package/src/utils/formatting.ts +142 -0
  297. package/src/utils/index.ts +3 -0
  298. package/src/utils/opentui-detection.ts +138 -0
  299. package/src/utils/output.ts +66 -8
  300. package/test-core-browser.html +237 -0
  301. package/test-core-node.js +63 -0
  302. package/tests/test-conflict-resolution.ts +391 -0
  303. package/tests/validate-workflows.sh +131 -0
  304. package/tests/yaml-autofix.sh +146 -0
  305. package/vite.config.ts +189 -50
  306. package/.npmrc.bak +0 -1
  307. package/dist/chunks/Logger-BQhMKy_T.js +0 -2
  308. package/dist/chunks/Logger-BQhMKy_T.js.map +0 -1
  309. package/dist/chunks/Logger-BrFKFZcD.js +0 -978
  310. package/dist/chunks/Logger-BrFKFZcD.js.map +0 -1
  311. package/dist/chunks/core-2opW4Pi3.js +0 -194
  312. package/dist/chunks/core-2opW4Pi3.js.map +0 -1
  313. package/dist/chunks/core-DyugwSYZ.js +0 -4
  314. package/dist/chunks/core-DyugwSYZ.js.map +0 -1
  315. package/dist/chunks/exports-BNP3R7dp.js +0 -421
  316. package/dist/chunks/exports-BNP3R7dp.js.map +0 -1
  317. package/dist/chunks/exports-U1xLBXrY.js +0 -2
  318. package/dist/chunks/exports-U1xLBXrY.js.map +0 -1
  319. package/dist/chunks/styling-DhUDzwlE.js +0 -654
  320. package/dist/chunks/styling-DhUDzwlE.js.map +0 -1
  321. package/dist/chunks/styling-tmRDI28D.js +0 -2
  322. package/dist/chunks/styling-tmRDI28D.js.map +0 -1
  323. package/dist/types/exports.d.ts +0 -600
  324. package/dist/types/styling.d.ts +0 -751
  325. package/src/Logger.ts.backup +0 -1684
  326. /package/.github/{workflows → workflows-backup}/release.yml +0 -0
@@ -0,0 +1,171 @@
1
+ /**
2
+ * @fileoverview Basic OpenTUI log renderer for enhanced terminal logging
3
+ */
4
+
5
+ import { createCliRenderer, TextRenderable, type Renderable } from '@opentui/core';
6
+ import type { LogLevel } from '@mks2508/better-logger-core';
7
+ import type { OpenTUILogEntry, OpenTUIRendererOptions } from './types.js';
8
+
9
+ /**
10
+ * Simple OpenTUI log renderer - Tier 2 Enhanced
11
+ */
12
+ export class OpenTUILogRenderer {
13
+ private renderer: any;
14
+ private initialized = false;
15
+ private logHistory: OpenTUILogEntry[] = [];
16
+ private options: Required<OpenTUIRendererOptions>;
17
+
18
+ constructor(options: OpenTUIRendererOptions = {}) {
19
+ this.options = {
20
+ interactive: false, // Tier 2: Basic for now
21
+ animated: true,
22
+ theme: 'auto',
23
+ dashboard: false, // Save for Tier 3
24
+ maxHistory: 100,
25
+ components: {
26
+ badges: true,
27
+ progressBars: false, // Tier 2: Keep simple
28
+ tables: false,
29
+ charts: false
30
+ }
31
+ };
32
+
33
+ Object.assign(this.options, options);
34
+ }
35
+
36
+ /**
37
+ * Initialize the OpenTUI renderer
38
+ */
39
+ async initialize(): Promise<void> {
40
+ if (this.initialized) return;
41
+
42
+ try {
43
+ this.renderer = await createCliRenderer();
44
+ this.initialized = true;
45
+ } catch (error) {
46
+ console.warn('OpenTUI not available, falling back to standard logging');
47
+ this.initialized = false;
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Check if OpenTUI is available and initialized
53
+ */
54
+ isAvailable(): boolean {
55
+ return this.initialized;
56
+ }
57
+
58
+ /**
59
+ * Render a log entry using OpenTUI
60
+ */
61
+ async renderLog(entry: OpenTUILogEntry): Promise<void> {
62
+ if (!this.initialized) {
63
+ await this.initialize();
64
+ }
65
+
66
+ if (!this.isAvailable()) {
67
+ // Fallback to simple console output
68
+ this.renderFallback(entry);
69
+ return;
70
+ }
71
+
72
+ // Add to history
73
+ this.logHistory.push(entry);
74
+ if (this.logHistory.length > this.options.maxHistory) {
75
+ this.logHistory.shift();
76
+ }
77
+
78
+ // Create basic styled output
79
+ const logRenderable = this.createLogRenderable(entry);
80
+ this.renderer.root.add(logRenderable);
81
+ }
82
+
83
+ /**
84
+ * Create OpenTUI renderable for log entry
85
+ */
86
+ private createLogRenderable(entry: OpenTUILogEntry): Renderable {
87
+ const levelColor = this.getLevelColor(entry.level);
88
+ const levelIcon = this.getLevelIcon(entry.level);
89
+
90
+ // Simple badge + message format for Tier 2
91
+ const badgeText = `${levelIcon} ${entry.level.toUpperCase()}`;
92
+ const fullMessage = entry.prefix
93
+ ? `[${badgeText}] [${entry.prefix}] ${entry.message}`
94
+ : `[${badgeText}] ${entry.message}`;
95
+
96
+ return new TextRenderable(`log-${entry.id}`, {
97
+ content: fullMessage,
98
+ style: {
99
+ color: levelColor,
100
+ ...(entry.level === 'critical' && {
101
+ fontWeight: 'bold',
102
+ textShadow: `0 0 5px ${levelColor}`
103
+ })
104
+ }
105
+ });
106
+ }
107
+
108
+ /**
109
+ * Get color for log level
110
+ */
111
+ private getLevelColor(level: LogLevel): string {
112
+ const colors: Record<LogLevel, string> = {
113
+ debug: '#6c757d',
114
+ info: '#007bff',
115
+ warn: '#ffc107',
116
+ error: '#dc3545',
117
+ critical: '#8B0000'
118
+ };
119
+ return colors[level];
120
+ }
121
+
122
+ /**
123
+ * Get icon for log level
124
+ */
125
+ private getLevelIcon(level: LogLevel): string {
126
+ const icons: Record<LogLevel, string> = {
127
+ debug: '🔍',
128
+ info: 'ℹ️',
129
+ warn: '⚠️',
130
+ error: '❌',
131
+ critical: '🚨'
132
+ };
133
+ return icons[level];
134
+ }
135
+
136
+ /**
137
+ * Fallback rendering when OpenTUI is not available
138
+ */
139
+ private renderFallback(entry: OpenTUILogEntry): void {
140
+ const icon = this.getLevelIcon(entry.level);
141
+ const timestamp = entry.timestamp.slice(11, 23);
142
+ const prefix = entry.prefix ? ` [${entry.prefix}]` : '';
143
+
144
+ console.log(`[${timestamp}] ${icon} [${entry.level.toUpperCase()}]${prefix} ${entry.message}`);
145
+ }
146
+
147
+ /**
148
+ * Get log history
149
+ */
150
+ getHistory(): OpenTUILogEntry[] {
151
+ return [...this.logHistory];
152
+ }
153
+
154
+ /**
155
+ * Clear log history
156
+ */
157
+ clearHistory(): void {
158
+ this.logHistory = [];
159
+ }
160
+
161
+ /**
162
+ * Cleanup resources
163
+ */
164
+ destroy(): void {
165
+ if (this.renderer) {
166
+ // Cleanup renderer if needed
167
+ this.renderer = null;
168
+ }
169
+ this.initialized = false;
170
+ }
171
+ }
@@ -0,0 +1,178 @@
1
+ /**
2
+ * @fileoverview OpenTUI Log Handler for integration with core logger
3
+ */
4
+
5
+ import type { ILogHandler, LogLevel, LogMetadata } from '@mks2508/better-logger-core';
6
+ import { OpenTUILogRenderer } from './LogRenderer.js';
7
+ import type { OpenTUILogEntry, OpenTUILogHandlerConfig } from './types.js';
8
+
9
+ /**
10
+ * Log handler that uses OpenTUI for rich terminal output
11
+ */
12
+ export class OpenTUILogHandler implements ILogHandler {
13
+ private renderer: OpenTUILogRenderer;
14
+ private config: OpenTUILogHandlerConfig;
15
+ private logCounter = 0;
16
+
17
+ constructor(config: OpenTUILogHandlerConfig = {}) {
18
+ this.config = {
19
+ renderer: {
20
+ interactive: false,
21
+ animated: true,
22
+ theme: 'auto',
23
+ dashboard: false,
24
+ maxHistory: 100,
25
+ components: {
26
+ badges: true,
27
+ progressBars: false,
28
+ tables: false,
29
+ charts: false
30
+ }
31
+ },
32
+ ...config
33
+ };
34
+
35
+ this.renderer = new OpenTUILogRenderer(this.config.renderer);
36
+ }
37
+
38
+ /**
39
+ * Handle log entry from core logger
40
+ */
41
+ async handle(level: LogLevel, message: string, args: any[], metadata: LogMetadata): Promise<void> {
42
+ // Create OpenTUI log entry
43
+ const entry: OpenTUILogEntry = {
44
+ id: this.generateLogId(),
45
+ timestamp: metadata.timestamp,
46
+ level,
47
+ message,
48
+ args: args.slice(1), // Exclude first message argument
49
+ prefix: metadata.prefix,
50
+ stackInfo: metadata.stackInfo,
51
+ metadata: {
52
+ originalArgs: args,
53
+ handlerType: 'opentui'
54
+ }
55
+ };
56
+
57
+ try {
58
+ await this.renderer.renderLog(entry);
59
+ } catch (error) {
60
+ // Fallback to console if OpenTUI fails
61
+ console.error('OpenTUI rendering failed:', error);
62
+ this.fallbackRender(entry);
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Initialize the handler (call this early in application lifecycle)
68
+ */
69
+ async initialize(): Promise<boolean> {
70
+ try {
71
+ await this.renderer.initialize();
72
+ return this.renderer.isAvailable();
73
+ } catch (error) {
74
+ console.warn('Failed to initialize OpenTUI:', error);
75
+ return false;
76
+ }
77
+ }
78
+
79
+ /**
80
+ * Check if OpenTUI is available
81
+ */
82
+ isAvailable(): boolean {
83
+ return this.renderer.isAvailable();
84
+ }
85
+
86
+ /**
87
+ * Get rendering statistics
88
+ */
89
+ getStats() {
90
+ return {
91
+ available: this.isAvailable(),
92
+ logsRendered: this.logCounter,
93
+ historySize: this.renderer.getHistory().length,
94
+ config: this.config
95
+ };
96
+ }
97
+
98
+ /**
99
+ * Update configuration
100
+ */
101
+ updateConfig(newConfig: Partial<OpenTUILogHandlerConfig>): void {
102
+ Object.assign(this.config, newConfig);
103
+ }
104
+
105
+ /**
106
+ * Get log history
107
+ */
108
+ getHistory(): OpenTUILogEntry[] {
109
+ return this.renderer.getHistory();
110
+ }
111
+
112
+ /**
113
+ * Clear log history
114
+ */
115
+ clearHistory(): void {
116
+ this.renderer.clearHistory();
117
+ }
118
+
119
+ /**
120
+ * Cleanup resources
121
+ */
122
+ destroy(): void {
123
+ this.renderer.destroy();
124
+ }
125
+
126
+ /**
127
+ * Generate unique log ID
128
+ */
129
+ private generateLogId(): string {
130
+ return `opentui-log-${Date.now()}-${++this.logCounter}`;
131
+ }
132
+
133
+ /**
134
+ * Fallback rendering when OpenTUI fails
135
+ */
136
+ private fallbackRender(entry: OpenTUILogEntry): void {
137
+ const prefix = entry.prefix ? `[${entry.prefix}] ` : '';
138
+ const timestamp = entry.timestamp.slice(11, 23);
139
+
140
+ console.log(`[${timestamp}] [${entry.level.toUpperCase()}] ${prefix}${entry.message}`);
141
+
142
+ // Log additional args if present
143
+ if (entry.args && entry.args.length > 0) {
144
+ entry.args.forEach(arg => {
145
+ if (typeof arg === 'object') {
146
+ console.log(JSON.stringify(arg, null, 2));
147
+ } else {
148
+ console.log(String(arg));
149
+ }
150
+ });
151
+ }
152
+
153
+ // Log stack trace if present and it's an error
154
+ if (entry.stackInfo && (entry.level === 'error' || entry.level === 'critical')) {
155
+ console.log(` at ${entry.stackInfo.file}:${entry.stackInfo.line}:${entry.stackInfo.column}`);
156
+ }
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Factory function to create OpenTUI log handler
162
+ */
163
+ export function createOpenTUILogHandler(config?: OpenTUILogHandlerConfig): OpenTUILogHandler {
164
+ return new OpenTUILogHandler(config);
165
+ }
166
+
167
+ /**
168
+ * Utility function to check if OpenTUI is available in the environment
169
+ */
170
+ export async function isOpenTUIAvailable(): Promise<boolean> {
171
+ try {
172
+ // Try to import OpenTUI core
173
+ await import('@opentui/core');
174
+ return true;
175
+ } catch (error) {
176
+ return false;
177
+ }
178
+ }
@@ -0,0 +1,131 @@
1
+ /**
2
+ * @fileoverview Log Badge component with animations and styling
3
+ */
4
+
5
+ import React from 'react';
6
+ import type { LogLevel } from '@mks2508/better-logger-core';
7
+ import type { LogComponentStyle } from '../types.js';
8
+
9
+ interface LogBadgeProps {
10
+ level: LogLevel;
11
+ animated?: boolean;
12
+ style?: LogComponentStyle;
13
+ }
14
+
15
+ /**
16
+ * Get default styling for log level
17
+ */
18
+ function getDefaultLevelStyle(level: LogLevel): LogComponentStyle {
19
+ const styles: Record<LogLevel, LogComponentStyle> = {
20
+ debug: {
21
+ backgroundColor: '#6c757d',
22
+ color: '#ffffff',
23
+ animation: 'none'
24
+ },
25
+ info: {
26
+ backgroundColor: '#007bff',
27
+ color: '#ffffff',
28
+ animation: 'none'
29
+ },
30
+ warn: {
31
+ backgroundColor: '#ffc107',
32
+ color: '#000000',
33
+ animation: 'pulse'
34
+ },
35
+ error: {
36
+ backgroundColor: '#dc3545',
37
+ color: '#ffffff',
38
+ animation: 'shake'
39
+ },
40
+ critical: {
41
+ backgroundColor: '#8B0000',
42
+ color: '#ffffff',
43
+ animation: 'pulse',
44
+ duration: 1000
45
+ }
46
+ };
47
+
48
+ return styles[level];
49
+ }
50
+
51
+ /**
52
+ * Get emoji icon for log level
53
+ */
54
+ function getLevelIcon(level: LogLevel): string {
55
+ const icons: Record<LogLevel, string> = {
56
+ debug: '🔍',
57
+ info: 'ℹ️',
58
+ warn: '⚠️',
59
+ error: '❌',
60
+ critical: '🚨'
61
+ };
62
+
63
+ return icons[level];
64
+ }
65
+
66
+ /**
67
+ * Log badge component with styling and animations
68
+ */
69
+ export function LogBadge({ level, animated = true, style = {} }: LogBadgeProps) {
70
+ const defaultStyle = getDefaultLevelStyle(level);
71
+ const finalStyle = { ...defaultStyle, ...style };
72
+ const icon = getLevelIcon(level);
73
+
74
+ // Convert our style to OpenTUI box style
75
+ const boxStyle = {
76
+ backgroundColor: finalStyle.backgroundColor,
77
+ color: finalStyle.color,
78
+ padding: finalStyle.padding || 1,
79
+ margin: finalStyle.margin || 0,
80
+ border: finalStyle.border || 'none',
81
+ ...(animated && finalStyle.animation !== 'none' && {
82
+ animation: `${finalStyle.animation} ${finalStyle.duration || 500}ms ease-in-out`
83
+ })
84
+ };
85
+
86
+ return (
87
+ <box style={boxStyle}>
88
+ <text bold fg={finalStyle.color}>
89
+ {icon} {level.toUpperCase()}
90
+ </text>
91
+ </box>
92
+ );
93
+ }
94
+
95
+ /**
96
+ * Compact log badge (icon only)
97
+ */
98
+ export function CompactLogBadge({ level, animated = true }: Omit<LogBadgeProps, 'style'>) {
99
+ const style = getDefaultLevelStyle(level);
100
+ const icon = getLevelIcon(level);
101
+
102
+ return (
103
+ <text
104
+ fg={style.color}
105
+ style={{
106
+ ...(animated && style.animation !== 'none' && {
107
+ animation: `${style.animation} ${style.duration || 500}ms ease-in-out`
108
+ })
109
+ }}
110
+ >
111
+ {icon}
112
+ </text>
113
+ );
114
+ }
115
+
116
+ /**
117
+ * Inline log badge (for embedded use)
118
+ */
119
+ export function InlineLogBadge({ level }: Pick<LogBadgeProps, 'level'>) {
120
+ const style = getDefaultLevelStyle(level);
121
+ const icon = getLevelIcon(level);
122
+
123
+ return (
124
+ <text
125
+ fg={style.color}
126
+ bold
127
+ >
128
+ [{icon} {level.toUpperCase()}]
129
+ </text>
130
+ );
131
+ }
@@ -0,0 +1,133 @@
1
+ /**
2
+ * @fileoverview OpenTUI Logger - Tier 2 Enhanced Terminal Logging
3
+ */
4
+
5
+ // Core exports
6
+ export { OpenTUILogHandler, createOpenTUILogHandler, isOpenTUIAvailable } from './OpenTUILogHandler.js';
7
+ export { OpenTUILogRenderer } from './LogRenderer.js';
8
+
9
+ // Types
10
+ export type {
11
+ OpenTUILogEntry,
12
+ LogAnimation,
13
+ LogComponentStyle,
14
+ InteractiveLogConfig,
15
+ LogDashboardConfig,
16
+ ProgressLogEntry,
17
+ TableLogEntry,
18
+ LogStatistics,
19
+ LogFilter,
20
+ OpenTUIRendererOptions,
21
+ LogLevelStyling,
22
+ OpenTUILogHandlerConfig
23
+ } from './types.js';
24
+
25
+ // Convenience function to create and initialize OpenTUI logger
26
+ import { OpenTUILogHandler } from './OpenTUILogHandler.js';
27
+ import type { OpenTUILogHandlerConfig } from './types.js';
28
+
29
+ /**
30
+ * Create and initialize OpenTUI log handler
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * import { createOpenTUILogger } from '@mks2508/better-logger-nodejs-opentui';
35
+ * import logger from '@mks2508/better-logger-core';
36
+ *
37
+ * const openTUIHandler = await createOpenTUILogger({
38
+ * animated: true,
39
+ * components: { badges: true }
40
+ * });
41
+ *
42
+ * if (openTUIHandler) {
43
+ * logger.addHandler(openTUIHandler);
44
+ * logger.info('Rich terminal logging enabled!');
45
+ * }
46
+ * ```
47
+ */
48
+ export async function createOpenTUILogger(
49
+ config?: OpenTUILogHandlerConfig
50
+ ): Promise<OpenTUILogHandler | null> {
51
+ try {
52
+ const handler = new OpenTUILogHandler(config);
53
+ const initialized = await handler.initialize();
54
+
55
+ if (initialized) {
56
+ return handler;
57
+ } else {
58
+ console.warn('OpenTUI not available, using fallback logging');
59
+ return null;
60
+ }
61
+ } catch (error) {
62
+ console.error('Failed to create OpenTUI logger:', error);
63
+ return null;
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Utility to enhance existing logger with OpenTUI capabilities
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * import logger from '@mks2508/better-logger-core';
73
+ * import { enhanceLoggerWithOpenTUI } from '@mks2508/better-logger-nodejs-opentui';
74
+ *
75
+ * await enhanceLoggerWithOpenTUI(logger, {
76
+ * animated: true,
77
+ * theme: 'dark'
78
+ * });
79
+ *
80
+ * logger.info('Now with OpenTUI superpowers!');
81
+ * ```
82
+ */
83
+ export async function enhanceLoggerWithOpenTUI(
84
+ logger: any, // Accept any logger with addHandler method
85
+ config?: OpenTUILogHandlerConfig
86
+ ): Promise<boolean> {
87
+ const handler = await createOpenTUILogger(config);
88
+
89
+ if (handler && logger.addHandler) {
90
+ logger.addHandler(handler);
91
+ return true;
92
+ }
93
+
94
+ return false;
95
+ }
96
+
97
+ /**
98
+ * Quick setup function for common use cases
99
+ */
100
+ export async function quickSetup() {
101
+ try {
102
+ // Try to import and enhance the default core logger
103
+ const { default: logger } = await import('@mks2508/better-logger-core');
104
+
105
+ const enhanced = await enhanceLoggerWithOpenTUI(logger, {
106
+ renderer: {
107
+ animated: true,
108
+ theme: 'auto',
109
+ components: {
110
+ badges: true,
111
+ progressBars: false,
112
+ tables: false,
113
+ charts: false
114
+ }
115
+ }
116
+ });
117
+
118
+ if (enhanced) {
119
+ console.log('🚀 OpenTUI enhanced logging activated!');
120
+ return logger;
121
+ } else {
122
+ console.warn('⚠️ OpenTUI not available, using standard logging');
123
+ return logger;
124
+ }
125
+ } catch (error) {
126
+ console.error('❌ Failed to setup OpenTUI logging:', error);
127
+ return null;
128
+ }
129
+ }
130
+
131
+ // Package info
132
+ export const version = '0.1.0';
133
+ export const name = '@mks2508/better-logger-nodejs-opentui';