@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,264 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { execSync } from "child_process"
4
+ import { platform } from "os"
5
+
6
+ interface CommitOptions {
7
+ context: string
8
+ workType: string
9
+ affectedComponents: string[]
10
+ scope?: string
11
+ breakingChange?: boolean
12
+ performanceImpact?: string
13
+ }
14
+
15
+ class CommitUI {
16
+ private platform = platform()
17
+
18
+ async collectCommitInfo(): Promise<CommitOptions> {
19
+ console.log("🚀 Interactive Commit Generator")
20
+ console.log("================================")
21
+
22
+ try {
23
+ if (this.platform === "darwin") {
24
+ return await this.macOSDialog()
25
+ } else if (this.platform === "linux") {
26
+ return await this.linuxDialog()
27
+ } else {
28
+ return await this.fallbackDialog()
29
+ }
30
+ } catch (error) {
31
+ console.log("⚠️ GUI not available, falling back to text input")
32
+ return await this.fallbackDialog()
33
+ }
34
+ }
35
+
36
+ private async macOSDialog(): Promise<CommitOptions> {
37
+ // Create a unified form using AppleScript
38
+ const formScript = `
39
+ const app = Application.currentApplication()
40
+ app.includeStandardAdditions = true
41
+
42
+ // First get the context text
43
+ const contextResult = app.displayDialog("📝 Commit Generator\\n\\nDescribe what you implemented/fixed:", {
44
+ defaultAnswer: "",
45
+ withTitle: "🚀 Interactive Commit",
46
+ buttons: ["Cancel", "Next →"],
47
+ defaultButton: "Next →"
48
+ })
49
+
50
+ const context = contextResult.textReturned
51
+
52
+ // Then get work type
53
+ const workTypes = ["feature", "fix", "refactor", "docs", "test"]
54
+ const workTypeResult = app.chooseFromList(workTypes, {
55
+ withTitle: "🚀 Interactive Commit - Work Type",
56
+ withPrompt: "Context: " + context + "\\n\\nSelect work type:",
57
+ defaultItems: ["feature"]
58
+ })
59
+
60
+ if (workTypeResult === false) {
61
+ throw new Error("Cancelled")
62
+ }
63
+
64
+ const workType = workTypeResult[0]
65
+
66
+ // Then get components
67
+ const components = ["core", "styling", "exports", "cli", "docs", "tests", "examples"]
68
+ const componentsResult = app.chooseFromList(components, {
69
+ withTitle: "🚀 Interactive Commit - Components",
70
+ withPrompt: "Context: " + context + "\\nType: " + workType + "\\n\\nSelect affected components:",
71
+ multipleSelectionsAllowed: true,
72
+ defaultItems: ["core"]
73
+ })
74
+
75
+ if (componentsResult === false) {
76
+ throw new Error("Cancelled")
77
+ }
78
+
79
+ const affectedComponents = componentsResult.join(",")
80
+
81
+ // Finally get performance impact
82
+ const impacts = ["none", "minor", "major"]
83
+ const performanceResult = app.chooseFromList(impacts, {
84
+ withTitle: "🚀 Interactive Commit - Performance",
85
+ withPrompt: "Context: " + context + "\\nType: " + workType + "\\nComponents: " + affectedComponents + "\\n\\nPerformance impact:",
86
+ defaultItems: ["none"]
87
+ })
88
+
89
+ const performanceImpact = performanceResult === false ? "none" : performanceResult[0]
90
+
91
+ // Return all values as JSON
92
+ JSON.stringify({
93
+ context: context,
94
+ workType: workType,
95
+ affectedComponents: affectedComponents,
96
+ performanceImpact: performanceImpact
97
+ })
98
+ `
99
+
100
+ const result = execSync(`osascript -l JavaScript -e '${formScript}'`, { encoding: 'utf-8' }).trim()
101
+ const parsed = JSON.parse(result)
102
+
103
+ return {
104
+ context: parsed.context,
105
+ workType: parsed.workType,
106
+ affectedComponents: parsed.affectedComponents.split(","),
107
+ performanceImpact: parsed.performanceImpact
108
+ }
109
+ }
110
+
111
+ private async linuxDialog(): Promise<CommitOptions> {
112
+ // Check if zenity is available
113
+ try {
114
+ execSync("which zenity", { stdio: 'ignore' })
115
+ } catch {
116
+ throw new Error("zenity not available")
117
+ }
118
+
119
+ // Context Input first
120
+ const context = execSync(`zenity --entry --title="🚀 Interactive Commit" --text="📝 Describe what you implemented/fixed:" --width=400`, { encoding: 'utf-8' }).trim()
121
+
122
+ // Work Type Selection with context shown
123
+ const workType = execSync(`zenity --list --title="🚀 Interactive Commit - Work Type" --text="Context: ${context}\\n\\nSelect work type:" --radiolist --column="Select" --column="Type" --column="Description" --width=450 --height=300 \\
124
+ TRUE "feature" "New functionality" \\
125
+ FALSE "fix" "Bug fixes" \\
126
+ FALSE "refactor" "Code refactoring" \\
127
+ FALSE "docs" "Documentation" \\
128
+ FALSE "test" "Tests"`, { encoding: 'utf-8' }).trim()
129
+
130
+ // Components Selection with previous values shown
131
+ const componentsResult = execSync(`zenity --list --title="🚀 Interactive Commit - Components" --text="Context: ${context}\\nType: ${workType}\\n\\nSelect affected components:" --checklist --column="Select" --column="Component" --width=450 --height=300 \\
132
+ TRUE "core" \\
133
+ FALSE "styling" \\
134
+ FALSE "exports" \\
135
+ FALSE "cli" \\
136
+ FALSE "docs" \\
137
+ FALSE "tests" \\
138
+ FALSE "examples"`, { encoding: 'utf-8' }).trim()
139
+
140
+ const affectedComponents = componentsResult.split("|").filter(Boolean)
141
+
142
+ // Performance Impact with summary
143
+ const performanceImpact = execSync(`zenity --list --title="🚀 Interactive Commit - Performance" --text="Context: ${context}\\nType: ${workType}\\nComponents: ${affectedComponents.join(', ')}\\n\\nSelect performance impact:" --radiolist --column="Select" --column="Impact" --width=450 --height=250 \\
144
+ TRUE "none" \\
145
+ FALSE "minor" \\
146
+ FALSE "major"`, { encoding: 'utf-8' }).trim()
147
+
148
+ return {
149
+ context,
150
+ workType,
151
+ affectedComponents,
152
+ performanceImpact
153
+ }
154
+ }
155
+
156
+ private async fallbackDialog(): Promise<CommitOptions> {
157
+ const readline = require('readline').createInterface({
158
+ input: process.stdin,
159
+ output: process.stdout
160
+ })
161
+
162
+ const question = (prompt: string): Promise<string> => {
163
+ return new Promise((resolve) => {
164
+ readline.question(prompt, resolve)
165
+ })
166
+ }
167
+
168
+ console.log("\n📝 Text-based commit input")
169
+
170
+ const workType = await question("Work type (feature/fix/refactor/docs/test): ") || "feature"
171
+ const context = await question("Describe what you implemented/fixed: ")
172
+ const componentsInput = await question("Components changed (core,styling,exports,cli,docs,tests,examples): ") || "core"
173
+ const affectedComponents = componentsInput.split(",").map(c => c.trim())
174
+ const performanceImpact = await question("Performance impact (none/minor/major): ") || "none"
175
+
176
+ readline.close()
177
+
178
+ return {
179
+ context,
180
+ workType,
181
+ affectedComponents,
182
+ performanceImpact
183
+ }
184
+ }
185
+
186
+ async generateCommit(options: CommitOptions): Promise<void> {
187
+ const args = [
188
+ "--context", `"${options.context}"`,
189
+ "--work-type", options.workType,
190
+ "--affected-components", options.affectedComponents.join(",")
191
+ ]
192
+
193
+ if (options.performanceImpact && options.performanceImpact !== "none") {
194
+ args.push("--performance-impact", options.performanceImpact)
195
+ }
196
+
197
+ console.log("\n🔄 Generating commit...")
198
+ console.log(`📋 Context: ${options.context}`)
199
+ console.log(`🏷️ Type: ${options.workType}`)
200
+ console.log(`📦 Components: ${options.affectedComponents.join(", ")}`)
201
+ console.log(`⚡ Performance: ${options.performanceImpact}`)
202
+
203
+ const command = `bun project-utils/commit-generator.ts ${args.join(" ")} --auto-approve`
204
+ console.log(`\n🚀 Running: ${command}`)
205
+
206
+ try {
207
+ execSync(command, { stdio: 'inherit' })
208
+ console.log("✅ Commits executed successfully!")
209
+ } catch (error) {
210
+ console.error("❌ Error executing commits:", error)
211
+ process.exit(1)
212
+ }
213
+ }
214
+ }
215
+
216
+ async function runTypeCheck(): Promise<void> {
217
+ console.log('🔍 Ejecutando typecheck...')
218
+
219
+ try {
220
+ execSync('npm run type-check', {
221
+ stdio: ['pipe', 'pipe', 'pipe'],
222
+ encoding: 'utf-8'
223
+ })
224
+ console.log('✅ Typecheck completado correctamente')
225
+ } catch (error) {
226
+ console.log('❌ Typecheck falló:', error)
227
+ process.exit(1)
228
+ }
229
+ }
230
+
231
+ async function main() {
232
+ // Ejecutar typecheck antes de continuar
233
+ await runTypeCheck()
234
+
235
+ const ui = new CommitUI()
236
+
237
+ // Check for quick mode
238
+ if (process.argv.includes("--quick")) {
239
+ const quickOptions: CommitOptions = {
240
+ context: "Quick commit via UI",
241
+ workType: "feature",
242
+ affectedComponents: ["core"],
243
+ performanceImpact: "none"
244
+ }
245
+ await ui.generateCommit(quickOptions)
246
+ return
247
+ }
248
+
249
+ try {
250
+ const options = await ui.collectCommitInfo()
251
+ await ui.generateCommit(options)
252
+ } catch (error) {
253
+ if (error instanceof Error && error.message === "Cancelled") {
254
+ console.log("❌ Commit cancelled by user")
255
+ process.exit(0)
256
+ }
257
+ console.error("❌ Error:", error)
258
+ process.exit(1)
259
+ }
260
+ }
261
+
262
+ if (import.meta.main) {
263
+ main()
264
+ }
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Utilidades para manejo de Git
3
+ * Funciones auxiliares para el generador de commits
4
+ */
5
+
6
+ export interface GitFileStatus {
7
+ path: string;
8
+ staged: boolean;
9
+ unstaged: boolean;
10
+ untracked: boolean;
11
+ deleted: boolean;
12
+ renamed?: string;
13
+ }
14
+
15
+ export interface CommitInfo {
16
+ hash: string;
17
+ message: string;
18
+ author: string;
19
+ date: string;
20
+ }
21
+
22
+ /**
23
+ * Parsea la salida de git status --porcelain
24
+ */
25
+ export function parseGitStatus(statusOutput: string): GitFileStatus[] {
26
+ const files: GitFileStatus[] = [];
27
+
28
+ for (const line of statusOutput.split('\n').filter(l => l.trim())) {
29
+ const staged = line[0];
30
+ const unstaged = line[1];
31
+ const filePath = line.substring(3);
32
+
33
+ files.push({
34
+ path: filePath,
35
+ staged: staged !== ' ' && staged !== '?',
36
+ unstaged: unstaged !== ' ',
37
+ untracked: staged === '?' && unstaged === '?',
38
+ deleted: staged === 'D' || unstaged === 'D',
39
+ renamed: staged === 'R' ? filePath.split(' -> ')[1] : undefined,
40
+ });
41
+ }
42
+
43
+ return files;
44
+ }
45
+
46
+ /**
47
+ * Determina el área funcional de un archivo basado en su ruta
48
+ */
49
+ export function getFileArea(filePath: string): string {
50
+ const areas = [
51
+ { pattern: /^src\/components\/|^src\/layouts\//, area: 'ui' },
52
+ { pattern: /^src-tauri\//, area: 'backend' },
53
+ { pattern: /^src\/models\/|types|interfaces/, area: 'types' },
54
+ { pattern: /^src\/stores\/|state/, area: 'state' },
55
+ { pattern: /^src\/pages\/|routing|navigation/, area: 'navigation' },
56
+ { pattern: /^src\/styles\/|\.css$|theme/, area: 'theme' },
57
+ { pattern: /config|\.json$|\.toml$|package\.json/, area: 'config' },
58
+ { pattern: /^project-utils\/|tools|scripts/, area: 'tools' },
59
+ { pattern: /database|migration|sql/, area: 'database' },
60
+ { pattern: /test|spec|\.test\.|\.spec\./, area: 'testing' },
61
+ { pattern: /doc|readme|\.md$/, area: 'docs' },
62
+ ];
63
+
64
+ for (const { pattern, area } of areas) {
65
+ if (pattern.test(filePath.toLowerCase())) {
66
+ return area;
67
+ }
68
+ }
69
+
70
+ return 'misc';
71
+ }
72
+
73
+ /**
74
+ * Determina si los archivos están relacionados funcionalmente
75
+ */
76
+ export function areFilesRelated(files: string[]): boolean {
77
+ if (files.length <= 1) return true;
78
+
79
+ const areas = files.map(getFileArea);
80
+ const uniqueAreas = [...new Set(areas)];
81
+
82
+ // Si todos están en la misma área, están relacionados
83
+ if (uniqueAreas.length === 1) return true;
84
+
85
+ // Áreas que suelen ir juntas
86
+ const relatedAreas = [
87
+ ['ui', 'theme', 'navigation'],
88
+ ['backend', 'database', 'types'],
89
+ ['config', 'tools', 'docs'],
90
+ ['types', 'state'],
91
+ ];
92
+
93
+ for (const group of relatedAreas) {
94
+ if (uniqueAreas.every(area => group.includes(area))) {
95
+ return true;
96
+ }
97
+ }
98
+
99
+ return false;
100
+ }
101
+
102
+ /**
103
+ * Sugiere el tipo de commit basado en los cambios
104
+ */
105
+ export function suggestCommitType(files: GitFileStatus[]): 'feat' | 'fix' | 'refactor' | 'feat-phase' {
106
+ const hasNewFiles = files.some(f => f.untracked);
107
+ const hasDeletedFiles = files.some(f => f.deleted);
108
+ const modifiedFiles = files.filter(f => f.staged || f.unstaged);
109
+
110
+ // Si hay muchos archivos nuevos, probablemente es una feature
111
+ if (hasNewFiles && files.length > 3) {
112
+ return 'feat-phase';
113
+ }
114
+
115
+ // Si hay archivos nuevos pero pocos, es feature completa
116
+ if (hasNewFiles) {
117
+ return 'feat';
118
+ }
119
+
120
+ // Si solo se modificaron archivos existentes, probablemente es fix o refactor
121
+ if (modifiedFiles.length > 0 && !hasNewFiles) {
122
+ // Si los cambios son grandes, es refactor
123
+ if (modifiedFiles.length > 5) {
124
+ return 'refactor';
125
+ }
126
+ // Si son pocos cambios, probablemente es fix
127
+ return 'fix';
128
+ }
129
+
130
+ return 'feat';
131
+ }
132
+
133
+ /**
134
+ * Extrae información relevante del diff de un archivo
135
+ */
136
+ export function analyzeDiff(diff: string): {
137
+ addedLines: number;
138
+ removedLines: number;
139
+ hasNewFunctions: boolean;
140
+ hasNewTypes: boolean;
141
+ hasNewImports: boolean;
142
+ hasFixes: boolean;
143
+ } {
144
+ const lines = diff.split('\n');
145
+ const addedLines = lines.filter(l => l.startsWith('+')).length;
146
+ const removedLines = lines.filter(l => l.startsWith('-')).length;
147
+
148
+ const addedCode = lines.filter(l => l.startsWith('+')).join('\n');
149
+ const removedCode = lines.filter(l => l.startsWith('-')).join('\n');
150
+
151
+ return {
152
+ addedLines,
153
+ removedLines,
154
+ hasNewFunctions: /function\s+\w+|const\s+\w+\s*=|async\s+function/.test(addedCode),
155
+ hasNewTypes: /interface\s+\w+|type\s+\w+|enum\s+\w+/.test(addedCode),
156
+ hasNewImports: /import\s+.*from/.test(addedCode),
157
+ hasFixes: /fix|error|bug|issue|problem/i.test(addedCode) || removedCode.includes('TODO') || removedCode.includes('FIXME'),
158
+ };
159
+ }
160
+
161
+ /**
162
+ * Genera un resumen técnico basado en los archivos modificados
163
+ */
164
+ export function generateTechnicalSummary(files: GitFileStatus[], diffs: Record<string, string>): string {
165
+ const summary: string[] = [];
166
+
167
+ for (const file of files) {
168
+ const area = getFileArea(file.path);
169
+ const diff = diffs[file.path];
170
+
171
+ if (!diff) continue;
172
+
173
+ const analysis = analyzeDiff(diff);
174
+ const changes: string[] = [];
175
+
176
+ if (file.untracked) {
177
+ changes.push(`Creado ${file.path}`);
178
+ } else if (file.deleted) {
179
+ changes.push(`Eliminado ${file.path}`);
180
+ } else {
181
+ if (analysis.hasNewFunctions) changes.push('nuevas funciones');
182
+ if (analysis.hasNewTypes) changes.push('nuevos tipos');
183
+ if (analysis.hasNewImports) changes.push('nuevas dependencias');
184
+ if (analysis.hasFixes) changes.push('correcciones');
185
+
186
+ if (changes.length > 0) {
187
+ changes.unshift(`Modificado ${file.path} con`);
188
+ } else {
189
+ changes.push(`Actualizado ${file.path}`);
190
+ }
191
+ }
192
+
193
+ if (changes.length > 0) {
194
+ summary.push(`- ${changes.join(' ')}`);
195
+ }
196
+ }
197
+
198
+ return summary.join('\n');
199
+ }