@next-vibe/checker 1.0.11 → 1.0.12

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 (394) hide show
  1. package/.dist/bin/vibe-runtime.js +10 -19
  2. package/.dist/bin/vibe-runtime.js.map +3 -3
  3. package/check.config.ts +4 -4
  4. package/package.json +2 -9
  5. package/src/app/api/[locale]/LICENSE +674 -0
  6. package/src/app/api/[locale]/i18n/de/index.ts +13 -0
  7. package/src/app/api/[locale]/i18n/en/index.ts +12 -0
  8. package/src/app/api/[locale]/i18n/pl/index.ts +11 -0
  9. package/src/app/api/[locale]/shared/i18n/de/index.ts +85 -0
  10. package/src/app/api/[locale]/shared/i18n/en/index.ts +83 -0
  11. package/src/app/api/[locale]/shared/i18n/pl/index.ts +85 -0
  12. package/src/app/api/[locale]/shared/stats-filtering.ts +202 -0
  13. package/src/app/api/[locale]/shared/types/common.schema.ts +55 -0
  14. package/src/app/api/[locale]/shared/types/response.schema.ts +372 -0
  15. package/src/app/api/[locale]/shared/types/stats-filtering.schema.ts +375 -0
  16. package/src/app/api/[locale]/shared/types/utils.ts +190 -0
  17. package/src/app/api/[locale]/shared/utils/base64.ts +49 -0
  18. package/src/app/api/[locale]/shared/utils/env-util.ts +40 -0
  19. package/src/app/api/[locale]/shared/utils/i18n/de/index.ts +21 -0
  20. package/src/app/api/[locale]/shared/utils/i18n/en/index.ts +19 -0
  21. package/src/app/api/[locale]/shared/utils/i18n/pl/index.ts +21 -0
  22. package/src/app/api/[locale]/shared/utils/index.ts +11 -0
  23. package/src/app/api/[locale]/shared/utils/object-path.ts +41 -0
  24. package/src/app/api/[locale]/shared/utils/object.test.ts +82 -0
  25. package/src/app/api/[locale]/shared/utils/object.ts +75 -0
  26. package/src/app/api/[locale]/shared/utils/parse-error.ts +134 -0
  27. package/src/app/api/[locale]/shared/utils/parse-json.ts +70 -0
  28. package/src/app/api/[locale]/shared/utils/time.ts +53 -0
  29. package/src/app/api/[locale]/shared/utils/validation.ts +127 -0
  30. package/src/app/api/[locale]/shared/utils/zod-required-fields.ts +116 -0
  31. package/src/app/api/[locale]/system/builder/definition.ts +1942 -0
  32. package/src/app/api/[locale]/system/builder/enum.ts +77 -0
  33. package/src/app/api/[locale]/system/builder/i18n/de/index.ts +677 -0
  34. package/src/app/api/[locale]/system/builder/i18n/en/index.ts +665 -0
  35. package/src/app/api/[locale]/system/builder/i18n/pl/index.ts +668 -0
  36. package/src/app/api/[locale]/system/builder/repository/build-executor.test.ts +182 -0
  37. package/src/app/api/[locale]/system/builder/repository/build-executor.ts +583 -0
  38. package/src/app/api/[locale]/system/builder/repository/bun-compiler.ts +261 -0
  39. package/src/app/api/[locale]/system/builder/repository/bundle-analyzer.ts +197 -0
  40. package/src/app/api/[locale]/system/builder/repository/config-loader.ts +159 -0
  41. package/src/app/api/[locale]/system/builder/repository/config-validator.ts +97 -0
  42. package/src/app/api/[locale]/system/builder/repository/constants.ts +125 -0
  43. package/src/app/api/[locale]/system/builder/repository/error-suggester.ts +75 -0
  44. package/src/app/api/[locale]/system/builder/repository/file-copier.ts +98 -0
  45. package/src/app/api/[locale]/system/builder/repository/folder-cleaner.ts +80 -0
  46. package/src/app/api/[locale]/system/builder/repository/index.ts +2 -0
  47. package/src/app/api/[locale]/system/builder/repository/npm-package-generator.ts +146 -0
  48. package/src/app/api/[locale]/system/builder/repository/output-formatter.ts +104 -0
  49. package/src/app/api/[locale]/system/builder/repository/profile-service.ts +79 -0
  50. package/src/app/api/[locale]/system/builder/repository/report-generator.ts +125 -0
  51. package/src/app/api/[locale]/system/builder/repository/vite-compiler.ts +291 -0
  52. package/src/app/api/[locale]/system/builder/route.ts +21 -0
  53. package/src/app/api/[locale]/system/builder/test-files/file1.ts +2 -0
  54. package/src/app/api/[locale]/system/builder/test-files/file2.tsx +10 -0
  55. package/src/app/api/[locale]/system/builder/test-files/file3.tsx +16 -0
  56. package/src/app/api/[locale]/system/builder/test-files/folderToCopy/fileInFolder.ts +2 -0
  57. package/src/app/api/[locale]/system/builder/test-files/test-config.ts +38 -0
  58. package/src/app/api/[locale]/system/builder/test-files/test-delete-config.ts +8 -0
  59. package/src/app/api/[locale]/system/builder/test-files/test-project/package.json +24 -0
  60. package/src/app/api/[locale]/system/builder/test-files/test-project/src/constants.ts +6 -0
  61. package/src/app/api/[locale]/system/builder/test-files/test-project/src/greet.ts +18 -0
  62. package/src/app/api/[locale]/system/builder/test-files/test-project/src/index.ts +7 -0
  63. package/src/app/api/[locale]/system/builder/test-files/test-project/src/utils/calculate.ts +27 -0
  64. package/src/app/api/[locale]/system/builder/test-files/test-project/tsconfig.json +19 -0
  65. package/src/app/api/[locale]/system/builder/test-files/test-project/tsconfig.tsbuildinfo +1 -0
  66. package/src/app/api/[locale]/system/builder/test-files/test3.css +1 -0
  67. package/src/app/api/[locale]/system/check/config/repository.ts +819 -0
  68. package/src/app/api/[locale]/system/check/config/shared.ts +396 -0
  69. package/src/app/api/[locale]/system/check/config/types.ts +616 -0
  70. package/src/app/api/[locale]/system/check/config/utils.ts +171 -0
  71. package/src/app/api/[locale]/system/check/i18n/de/index.ts +15 -0
  72. package/src/app/api/[locale]/system/check/i18n/en/index.ts +14 -0
  73. package/src/app/api/[locale]/system/check/i18n/pl/index.ts +15 -0
  74. package/src/app/api/[locale]/system/check/lint/definition.ts +414 -0
  75. package/src/app/api/[locale]/system/check/lint/enum.ts +37 -0
  76. package/src/app/api/[locale]/system/check/lint/i18n/de/index.ts +164 -0
  77. package/src/app/api/[locale]/system/check/lint/i18n/en/index.ts +162 -0
  78. package/src/app/api/[locale]/system/check/lint/i18n/pl/index.ts +164 -0
  79. package/src/app/api/[locale]/system/check/lint/repository.ts +753 -0
  80. package/src/app/api/[locale]/system/check/lint/route.ts +21 -0
  81. package/src/app/api/[locale]/system/check/oxlint/README.md +190 -0
  82. package/src/app/api/[locale]/system/check/oxlint/definition.ts +414 -0
  83. package/src/app/api/[locale]/system/check/oxlint/enum.ts +37 -0
  84. package/src/app/api/[locale]/system/check/oxlint/i18n/de/index.ts +171 -0
  85. package/src/app/api/[locale]/system/check/oxlint/i18n/en/index.ts +168 -0
  86. package/src/app/api/[locale]/system/check/oxlint/i18n/pl/index.ts +172 -0
  87. package/src/app/api/[locale]/system/check/oxlint/plugins/i18n/src/index.ts +372 -0
  88. package/src/app/api/[locale]/system/check/oxlint/plugins/jsx-capitalization/README.md +246 -0
  89. package/src/app/api/[locale]/system/check/oxlint/plugins/jsx-capitalization/src/index.ts +583 -0
  90. package/src/app/api/[locale]/system/check/oxlint/plugins/restricted-syntax/src/index.ts +500 -0
  91. package/src/app/api/[locale]/system/check/oxlint/plugins/restricted-syntax/test.tsx +74 -0
  92. package/src/app/api/[locale]/system/check/oxlint/plugins/shared/config-loader.ts +305 -0
  93. package/src/app/api/[locale]/system/check/oxlint/repository.ts +959 -0
  94. package/src/app/api/[locale]/system/check/oxlint/route.ts +21 -0
  95. package/src/app/api/[locale]/system/check/oxlint/types.ts +193 -0
  96. package/src/app/api/[locale]/system/check/test-project/bun.lock +449 -0
  97. package/src/app/api/[locale]/system/check/test-project/check.config.ts +989 -0
  98. package/src/app/api/[locale]/system/check/test-project/package.json +20 -0
  99. package/src/app/api/[locale]/system/check/test-project/src/constants.ts +6 -0
  100. package/src/app/api/[locale]/system/check/test-project/src/greet.ts +18 -0
  101. package/src/app/api/[locale]/system/check/test-project/src/test-issues/a11y-issues.tsx +107 -0
  102. package/src/app/api/[locale]/system/check/test-project/src/test-issues/eslint-issues.tsx +37 -0
  103. package/src/app/api/[locale]/system/check/test-project/src/test-issues/general-issues.ts +137 -0
  104. package/src/app/api/[locale]/system/check/test-project/src/test-issues/i18n-issues.tsx +129 -0
  105. package/src/app/api/[locale]/system/check/test-project/src/test-issues/jsx-capitalization-issues.tsx +131 -0
  106. package/src/app/api/[locale]/system/check/test-project/src/test-issues/nextjs-issues.tsx +95 -0
  107. package/src/app/api/[locale]/system/check/test-project/src/test-issues/promise-issues.ts +76 -0
  108. package/src/app/api/[locale]/system/check/test-project/src/test-issues/react-issues.tsx +95 -0
  109. package/src/app/api/[locale]/system/check/test-project/src/test-issues/restricted-syntax-issues.tsx +61 -0
  110. package/src/app/api/[locale]/system/check/test-project/src/test-issues/typescript-issues.ts +80 -0
  111. package/src/app/api/[locale]/system/check/test-project/src/utils/calculate.ts +27 -0
  112. package/src/app/api/[locale]/system/check/test-project/tsconfig.json +38 -0
  113. package/src/app/api/[locale]/system/check/test-project/tsconfig.tsbuildinfo +1 -0
  114. package/src/app/api/[locale]/system/check/typecheck/definition.ts +369 -0
  115. package/src/app/api/[locale]/system/check/typecheck/enum.ts +37 -0
  116. package/src/app/api/[locale]/system/check/typecheck/i18n/de/index.ts +159 -0
  117. package/src/app/api/[locale]/system/check/typecheck/i18n/en/index.ts +150 -0
  118. package/src/app/api/[locale]/system/check/typecheck/i18n/pl/index.ts +155 -0
  119. package/src/app/api/[locale]/system/check/typecheck/repository.ts +919 -0
  120. package/src/app/api/[locale]/system/check/typecheck/route.ts +22 -0
  121. package/src/app/api/[locale]/system/check/typecheck/utils.ts +168 -0
  122. package/src/app/api/[locale]/system/check/vibe-check/definition.ts +568 -0
  123. package/src/app/api/[locale]/system/check/vibe-check/enum.ts +69 -0
  124. package/src/app/api/[locale]/system/check/vibe-check/i18n/de/index.ts +192 -0
  125. package/src/app/api/[locale]/system/check/vibe-check/i18n/en/index.ts +189 -0
  126. package/src/app/api/[locale]/system/check/vibe-check/i18n/pl/index.ts +192 -0
  127. package/src/app/api/[locale]/system/check/vibe-check/repository.ts +545 -0
  128. package/src/app/api/[locale]/system/check/vibe-check/route.test.ts +1142 -0
  129. package/src/app/api/[locale]/system/check/vibe-check/route.ts +21 -0
  130. package/src/app/api/[locale]/system/generated/endpoint.ts +313 -0
  131. package/src/app/api/[locale]/system/generated/endpoints.ts +156 -0
  132. package/src/app/api/[locale]/system/generated/route-handlers.ts +224 -0
  133. package/src/app/api/[locale]/system/generators/endpoint/definition.ts +193 -0
  134. package/src/app/api/[locale]/system/generators/endpoint/i18n/de/index.ts +48 -0
  135. package/src/app/api/[locale]/system/generators/endpoint/i18n/en/index.ts +48 -0
  136. package/src/app/api/[locale]/system/generators/endpoint/i18n/pl/index.ts +50 -0
  137. package/src/app/api/[locale]/system/generators/endpoint/repository.ts +291 -0
  138. package/src/app/api/[locale]/system/generators/endpoint/route.ts +21 -0
  139. package/src/app/api/[locale]/system/generators/endpoints/definition.ts +246 -0
  140. package/src/app/api/[locale]/system/generators/endpoints/i18n/de/index.ts +54 -0
  141. package/src/app/api/[locale]/system/generators/endpoints/i18n/en/index.ts +52 -0
  142. package/src/app/api/[locale]/system/generators/endpoints/i18n/pl/index.ts +54 -0
  143. package/src/app/api/[locale]/system/generators/endpoints/options-repository.ts +463 -0
  144. package/src/app/api/[locale]/system/generators/endpoints/repository.ts +383 -0
  145. package/src/app/api/[locale]/system/generators/endpoints/route.ts +18 -0
  146. package/src/app/api/[locale]/system/generators/endpoints-index/definition.ts +194 -0
  147. package/src/app/api/[locale]/system/generators/endpoints-index/i18n/de/index.ts +71 -0
  148. package/src/app/api/[locale]/system/generators/endpoints-index/i18n/en/index.ts +69 -0
  149. package/src/app/api/[locale]/system/generators/endpoints-index/i18n/pl/index.ts +71 -0
  150. package/src/app/api/[locale]/system/generators/endpoints-index/repository.ts +294 -0
  151. package/src/app/api/[locale]/system/generators/endpoints-index/route.ts +18 -0
  152. package/src/app/api/[locale]/system/generators/generate-all/definition.ts +355 -0
  153. package/src/app/api/[locale]/system/generators/generate-all/i18n/de/index.ts +96 -0
  154. package/src/app/api/[locale]/system/generators/generate-all/i18n/en/index.ts +94 -0
  155. package/src/app/api/[locale]/system/generators/generate-all/i18n/pl/index.ts +96 -0
  156. package/src/app/api/[locale]/system/generators/generate-all/repository.ts +257 -0
  157. package/src/app/api/[locale]/system/generators/generate-all/route.ts +20 -0
  158. package/src/app/api/[locale]/system/generators/i18n/de/index.ts +15 -0
  159. package/src/app/api/[locale]/system/generators/i18n/en/index.ts +14 -0
  160. package/src/app/api/[locale]/system/generators/i18n/pl/index.ts +15 -0
  161. package/src/app/api/[locale]/system/generators/route-handlers/definition.ts +198 -0
  162. package/src/app/api/[locale]/system/generators/route-handlers/i18n/de/index.ts +48 -0
  163. package/src/app/api/[locale]/system/generators/route-handlers/i18n/en/index.ts +48 -0
  164. package/src/app/api/[locale]/system/generators/route-handlers/i18n/pl/index.ts +50 -0
  165. package/src/app/api/[locale]/system/generators/route-handlers/repository.ts +277 -0
  166. package/src/app/api/[locale]/system/generators/route-handlers/route.ts +17 -0
  167. package/src/app/api/[locale]/system/generators/shared/utils.ts +233 -0
  168. package/src/app/api/[locale]/system/help/definition.ts +445 -0
  169. package/src/app/api/[locale]/system/help/i18n/de/index.ts +267 -0
  170. package/src/app/api/[locale]/system/help/i18n/en/index.ts +262 -0
  171. package/src/app/api/[locale]/system/help/i18n/pl/index.ts +265 -0
  172. package/src/app/api/[locale]/system/help/interactive/definition.ts +125 -0
  173. package/src/app/api/[locale]/system/help/interactive/i18n/de/index.ts +22 -0
  174. package/src/app/api/[locale]/system/help/interactive/i18n/en/index.ts +19 -0
  175. package/src/app/api/[locale]/system/help/interactive/i18n/pl/index.ts +22 -0
  176. package/src/app/api/[locale]/system/help/interactive/repository.ts +1025 -0
  177. package/src/app/api/[locale]/system/help/interactive/route.ts +53 -0
  178. package/src/app/api/[locale]/system/help/list/definition.ts +372 -0
  179. package/src/app/api/[locale]/system/help/list/repository.ts +110 -0
  180. package/src/app/api/[locale]/system/help/list/route.ts +21 -0
  181. package/src/app/api/[locale]/system/help/repository.ts +212 -0
  182. package/src/app/api/[locale]/system/help/route.ts +16 -0
  183. package/src/app/api/[locale]/system/i18n/de/index.ts +68 -0
  184. package/src/app/api/[locale]/system/i18n/en/index.ts +65 -0
  185. package/src/app/api/[locale]/system/i18n/pl/index.ts +66 -0
  186. package/src/app/api/[locale]/system/release-tool/definition.ts +3104 -0
  187. package/src/app/api/[locale]/system/release-tool/i18n/de/index.ts +813 -0
  188. package/src/app/api/[locale]/system/release-tool/i18n/en/index.ts +797 -0
  189. package/src/app/api/[locale]/system/release-tool/i18n/pl/index.ts +810 -0
  190. package/src/app/api/[locale]/system/release-tool/repository/asset-zipper.ts +128 -0
  191. package/src/app/api/[locale]/system/release-tool/repository/changelog-generator.ts +212 -0
  192. package/src/app/api/[locale]/system/release-tool/repository/ci-detector.ts +566 -0
  193. package/src/app/api/[locale]/system/release-tool/repository/config.ts +113 -0
  194. package/src/app/api/[locale]/system/release-tool/repository/constants.ts +407 -0
  195. package/src/app/api/[locale]/system/release-tool/repository/dependency-manager.ts +527 -0
  196. package/src/app/api/[locale]/system/release-tool/repository/git-service.ts +403 -0
  197. package/src/app/api/[locale]/system/release-tool/repository/hook-runner.ts +100 -0
  198. package/src/app/api/[locale]/system/release-tool/repository/index.ts +1 -0
  199. package/src/app/api/[locale]/system/release-tool/repository/notification-service.ts +638 -0
  200. package/src/app/api/[locale]/system/release-tool/repository/package-service.ts +169 -0
  201. package/src/app/api/[locale]/system/release-tool/repository/publisher.ts +253 -0
  202. package/src/app/api/[locale]/system/release-tool/repository/quality-runner.ts +428 -0
  203. package/src/app/api/[locale]/system/release-tool/repository/release-creator.ts +293 -0
  204. package/src/app/api/[locale]/system/release-tool/repository/release-executor.ts +1198 -0
  205. package/src/app/api/[locale]/system/release-tool/repository/snyk-service.ts +136 -0
  206. package/src/app/api/[locale]/system/release-tool/repository/utils.ts +642 -0
  207. package/src/app/api/[locale]/system/release-tool/repository/validation.ts +288 -0
  208. package/src/app/api/[locale]/system/release-tool/repository/version-service.ts +297 -0
  209. package/src/app/api/[locale]/system/release-tool/route.ts +21 -0
  210. package/src/app/api/[locale]/system/unified-interface/README.md +328 -0
  211. package/src/app/api/[locale]/system/unified-interface/cli/README.md +349 -0
  212. package/src/app/api/[locale]/system/unified-interface/cli/auth/cli-handler.ts +95 -0
  213. package/src/app/api/[locale]/system/unified-interface/cli/auth/cli-user.ts +146 -0
  214. package/src/app/api/[locale]/system/unified-interface/cli/auth/session-file.ts +266 -0
  215. package/src/app/api/[locale]/system/unified-interface/cli/env.ts +26 -0
  216. package/src/app/api/[locale]/system/unified-interface/cli/i18n/de/index.ts +157 -0
  217. package/src/app/api/[locale]/system/unified-interface/cli/i18n/en/index.ts +155 -0
  218. package/src/app/api/[locale]/system/unified-interface/cli/i18n/pl/index.ts +158 -0
  219. package/src/app/api/[locale]/system/unified-interface/cli/runtime/debug.ts +595 -0
  220. package/src/app/api/[locale]/system/unified-interface/cli/runtime/entry-point.ts +129 -0
  221. package/src/app/api/[locale]/system/unified-interface/cli/runtime/environment.ts +155 -0
  222. package/src/app/api/[locale]/system/unified-interface/cli/runtime/execution-errors.ts +452 -0
  223. package/src/app/api/[locale]/system/unified-interface/cli/runtime/parsing.ts +297 -0
  224. package/src/app/api/[locale]/system/unified-interface/cli/runtime/route-executor.ts +859 -0
  225. package/src/app/api/[locale]/system/unified-interface/cli/setup/i18n/de/index.ts +12 -0
  226. package/src/app/api/[locale]/system/unified-interface/cli/setup/i18n/en/index.ts +11 -0
  227. package/src/app/api/[locale]/system/unified-interface/cli/setup/i18n/pl/index.ts +12 -0
  228. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/definition.ts +262 -0
  229. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/i18n/de/index.ts +54 -0
  230. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/i18n/en/index.ts +52 -0
  231. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/i18n/pl/index.ts +54 -0
  232. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/repository.ts +421 -0
  233. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/route.ts +25 -0
  234. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/definition.ts +181 -0
  235. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/i18n/de/index.ts +61 -0
  236. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/i18n/en/index.ts +59 -0
  237. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/i18n/pl/index.ts +61 -0
  238. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/repository.ts +195 -0
  239. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/route.ts +22 -0
  240. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/definition.ts +188 -0
  241. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/i18n/de/index.ts +54 -0
  242. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/i18n/en/index.ts +52 -0
  243. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/i18n/pl/index.ts +54 -0
  244. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/repository.ts +209 -0
  245. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/route.ts +24 -0
  246. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/definition.ts +200 -0
  247. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/i18n/de/index.ts +54 -0
  248. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/i18n/en/index.ts +52 -0
  249. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/i18n/pl/index.ts +54 -0
  250. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/repository.ts +113 -0
  251. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/route.ts +22 -0
  252. package/src/app/api/[locale]/system/unified-interface/cli/vibe-runtime.ts +304 -0
  253. package/src/app/api/[locale]/system/unified-interface/cli/widgets/core/base-renderer.ts +270 -0
  254. package/src/app/api/[locale]/system/unified-interface/cli/widgets/core/registry.ts +309 -0
  255. package/src/app/api/[locale]/system/unified-interface/cli/widgets/core/types.ts +126 -0
  256. package/src/app/api/[locale]/system/unified-interface/cli/widgets/i18n/de/index.ts +67 -0
  257. package/src/app/api/[locale]/system/unified-interface/cli/widgets/i18n/en/index.ts +65 -0
  258. package/src/app/api/[locale]/system/unified-interface/cli/widgets/i18n/pl/index.ts +67 -0
  259. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/accordion.ts +74 -0
  260. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/avatar.ts +39 -0
  261. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/badge.ts +54 -0
  262. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/code-output.ts +298 -0
  263. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/code-quality-files.ts +89 -0
  264. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/code-quality-list.ts +298 -0
  265. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/code-quality-summary.ts +96 -0
  266. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/container.ts +186 -0
  267. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/data-card.ts +65 -0
  268. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/data-cards.ts +570 -0
  269. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/data-list.ts +80 -0
  270. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/data-table.ts +385 -0
  271. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/editable-text.ts +99 -0
  272. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/empty-state.ts +55 -0
  273. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/errors.ts +67 -0
  274. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/grouped-list.ts +729 -0
  275. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/link-card.ts +87 -0
  276. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/link-list.ts +112 -0
  277. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/link.ts +59 -0
  278. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/loading.ts +50 -0
  279. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/markdown.ts +131 -0
  280. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/metric.ts +291 -0
  281. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/section.ts +120 -0
  282. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/stats-grid.ts +149 -0
  283. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/tabs.ts +61 -0
  284. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/text.ts +78 -0
  285. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/title.ts +42 -0
  286. package/src/app/api/[locale]/system/unified-interface/cli/widgets/renderers/response-renderer.ts +418 -0
  287. package/src/app/api/[locale]/system/unified-interface/cli/widgets/renderers/schema-handler.ts +534 -0
  288. package/src/app/api/[locale]/system/unified-interface/i18n/de/index.ts +42 -0
  289. package/src/app/api/[locale]/system/unified-interface/i18n/en/index.ts +40 -0
  290. package/src/app/api/[locale]/system/unified-interface/i18n/pl/index.ts +43 -0
  291. package/src/app/api/[locale]/system/unified-interface/mcp/README.md +114 -0
  292. package/src/app/api/[locale]/system/unified-interface/mcp/converter.ts +146 -0
  293. package/src/app/api/[locale]/system/unified-interface/mcp/i18n/de/index.ts +182 -0
  294. package/src/app/api/[locale]/system/unified-interface/mcp/i18n/en/index.ts +179 -0
  295. package/src/app/api/[locale]/system/unified-interface/mcp/i18n/pl/index.ts +181 -0
  296. package/src/app/api/[locale]/system/unified-interface/mcp/registry.ts +343 -0
  297. package/src/app/api/[locale]/system/unified-interface/mcp/serve/definition.ts +147 -0
  298. package/src/app/api/[locale]/system/unified-interface/mcp/serve/repository.ts +38 -0
  299. package/src/app/api/[locale]/system/unified-interface/mcp/serve/route.ts +14 -0
  300. package/src/app/api/[locale]/system/unified-interface/mcp/server/protocol-handler.ts +309 -0
  301. package/src/app/api/[locale]/system/unified-interface/mcp/server/server.ts +154 -0
  302. package/src/app/api/[locale]/system/unified-interface/mcp/server/stdio-transport.ts +193 -0
  303. package/src/app/api/[locale]/system/unified-interface/mcp/types.ts +246 -0
  304. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definition/create-form.ts +1510 -0
  305. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definition/create.ts +581 -0
  306. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definition/endpoint-to-metadata.ts +52 -0
  307. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definition/loader.ts +152 -0
  308. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definitions/registry.ts +265 -0
  309. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/permissions/registry.ts +680 -0
  310. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/executor.ts +220 -0
  311. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/handler.ts +325 -0
  312. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/multi.ts +184 -0
  313. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/request-validator.ts +201 -0
  314. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/single.ts +58 -0
  315. package/src/app/api/[locale]/system/unified-interface/shared/env/define-env-client.ts +49 -0
  316. package/src/app/api/[locale]/system/unified-interface/shared/env/define-env.ts +47 -0
  317. package/src/app/api/[locale]/system/unified-interface/shared/env/validation-logger.ts +58 -0
  318. package/src/app/api/[locale]/system/unified-interface/shared/field/enum.ts +110 -0
  319. package/src/app/api/[locale]/system/unified-interface/shared/field/specialized.ts +339 -0
  320. package/src/app/api/[locale]/system/unified-interface/shared/field/utils.test.ts +408 -0
  321. package/src/app/api/[locale]/system/unified-interface/shared/field/utils.ts +1349 -0
  322. package/src/app/api/[locale]/system/unified-interface/shared/field-config/endpoint-field-types.ts +107 -0
  323. package/src/app/api/[locale]/system/unified-interface/shared/field-config/field-config-types.ts +268 -0
  324. package/src/app/api/[locale]/system/unified-interface/shared/logger/colors.ts +114 -0
  325. package/src/app/api/[locale]/system/unified-interface/shared/logger/endpoint.ts +169 -0
  326. package/src/app/api/[locale]/system/unified-interface/shared/logger/file-logger.ts +88 -0
  327. package/src/app/api/[locale]/system/unified-interface/shared/logger/formatters.ts +177 -0
  328. package/src/app/api/[locale]/system/unified-interface/shared/server-only/auth/base-auth-handler.ts +82 -0
  329. package/src/app/api/[locale]/system/unified-interface/shared/server-only/auth/factory.ts +33 -0
  330. package/src/app/api/[locale]/system/unified-interface/shared/server-only/server-only.ts +4 -0
  331. package/src/app/api/[locale]/system/unified-interface/shared/types/actions.ts +289 -0
  332. package/src/app/api/[locale]/system/unified-interface/shared/types/endpoint.ts +1167 -0
  333. package/src/app/api/[locale]/system/unified-interface/shared/types/enums.ts +382 -0
  334. package/src/app/api/[locale]/system/unified-interface/shared/types/platform.ts +34 -0
  335. package/src/app/api/[locale]/system/unified-interface/shared/types/types.ts +80 -0
  336. package/src/app/api/[locale]/system/unified-interface/shared/types/ui-config.ts +76 -0
  337. package/src/app/api/[locale]/system/unified-interface/shared/utils/error-types.ts +27 -0
  338. package/src/app/api/[locale]/system/unified-interface/shared/utils/path.ts +63 -0
  339. package/src/app/api/[locale]/system/unified-interface/shared/utils/scanner.ts +241 -0
  340. package/src/app/api/[locale]/system/unified-interface/shared/widgets/actions.ts +256 -0
  341. package/src/app/api/[locale]/system/unified-interface/shared/widgets/configs.ts +1158 -0
  342. package/src/app/api/[locale]/system/unified-interface/shared/widgets/helpers.ts +80 -0
  343. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/accordion.ts +82 -0
  344. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/avatar.ts +75 -0
  345. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/badge.ts +89 -0
  346. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/code-output.ts +302 -0
  347. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/code-quality-list.ts +202 -0
  348. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/container.ts +129 -0
  349. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/data-card.ts +81 -0
  350. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/data-cards.ts +258 -0
  351. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/data-list.ts +123 -0
  352. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/data-table.ts +387 -0
  353. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/editable-text.ts +89 -0
  354. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/empty-state.ts +78 -0
  355. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/errors.ts +93 -0
  356. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/grouped-list.ts +448 -0
  357. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/index.ts +38 -0
  358. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/link-card.ts +130 -0
  359. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/link-list.ts +127 -0
  360. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/link.ts +68 -0
  361. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/loading.ts +81 -0
  362. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/markdown.ts +176 -0
  363. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/metric-card.ts +241 -0
  364. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/section.ts +90 -0
  365. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/stats-grid.ts +71 -0
  366. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/tabs.ts +80 -0
  367. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/text.ts +105 -0
  368. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/title.ts +72 -0
  369. package/src/app/api/[locale]/system/unified-interface/shared/widgets/types.ts +240 -0
  370. package/src/app/api/[locale]/system/unified-interface/shared/widgets/utils/field-helpers.ts +137 -0
  371. package/src/app/api/[locale]/system/unified-interface/shared/widgets/utils/formatting.ts +437 -0
  372. package/src/app/api/[locale]/system/unified-interface/shared/widgets/utils/url.ts +40 -0
  373. package/src/app/api/[locale]/system/unified-interface/shared/widgets/utils/widget-helpers.ts +465 -0
  374. package/src/app/api/[locale]/user/auth/enum.ts +16 -0
  375. package/src/app/api/[locale]/user/auth/i18n/de/index.ts +227 -0
  376. package/src/app/api/[locale]/user/auth/i18n/en/index.ts +205 -0
  377. package/src/app/api/[locale]/user/auth/i18n/pl/index.ts +219 -0
  378. package/src/app/api/[locale]/user/auth/types.ts +110 -0
  379. package/src/app/api/[locale]/user/enum.ts +64 -0
  380. package/src/app/api/[locale]/user/private/i18n/de/index.ts +3 -0
  381. package/src/app/api/[locale]/user/private/i18n/en/index.ts +1 -0
  382. package/src/app/api/[locale]/user/private/i18n/pl/index.ts +3 -0
  383. package/src/app/api/[locale]/user/types.ts +118 -0
  384. package/src/app/api/[locale]/user/user-roles/enum.ts +112 -0
  385. package/src/app/api/[locale]/user/user-roles/i18n/de/index.ts +85 -0
  386. package/src/app/api/[locale]/user/user-roles/i18n/en/index.ts +83 -0
  387. package/src/app/api/[locale]/user/user-roles/i18n/pl/index.ts +86 -0
  388. package/src/app/api/[locale]/user/user-roles/types.ts +34 -0
  389. package/src/app/api/i18n/de/index.ts +6 -0
  390. package/src/app/api/i18n/en/index.ts +5 -0
  391. package/src/app/api/i18n/pl/index.ts +5 -0
  392. package/src/app/i18n/de/index.ts +6 -0
  393. package/src/app/i18n/en/index.ts +5 -0
  394. package/src/app/i18n/pl/index.ts +5 -0
@@ -0,0 +1,642 @@
1
+ /**
2
+ * Release Tool Utilities
3
+ * Type guards, retry logic, and helper functions
4
+ */
5
+
6
+ import type { EndpointLogger } from "../../unified-interface/shared/logger/endpoint";
7
+ import type {
8
+ PackageJson,
9
+ ParsedVersion,
10
+ ReleaseConfig,
11
+ RetryConfig,
12
+ } from "../definition";
13
+ import { MESSAGES, RETRY_DEFAULTS } from "./constants";
14
+
15
+ // ============================================================================
16
+ // Type Definitions for Type Guards
17
+ // ============================================================================
18
+
19
+ /**
20
+ * Parsed JSON value type (result of JSON.parse)
21
+ */
22
+ type JsonValue = string | number | boolean | null | JsonObject | JsonArray;
23
+ interface JsonObject {
24
+ [key: string]: JsonValue;
25
+ }
26
+ type JsonArray = JsonValue[];
27
+
28
+ /**
29
+ * Error type from catch blocks - can be any value
30
+ */
31
+ type CatchError =
32
+ | Error
33
+ | {
34
+ stdout?: string | Buffer;
35
+ stderr?: string | Buffer;
36
+ status?: number;
37
+ message?: string;
38
+ };
39
+
40
+ /**
41
+ * Exec sync error type with stdout/stderr
42
+ */
43
+ interface ExecSyncError {
44
+ stdout?: string | Buffer;
45
+ stderr?: string | Buffer;
46
+ status?: number;
47
+ }
48
+
49
+ // ============================================================================
50
+ // Type Guards
51
+ // ============================================================================
52
+
53
+ /**
54
+ * Check if a parsed JSON value is a valid PackageJson
55
+ * Returns the value typed as PackageJson if valid, otherwise undefined
56
+ */
57
+ export function parsePackageJson(
58
+ value: JsonValue | undefined,
59
+ ): PackageJson | undefined {
60
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
61
+ return undefined;
62
+ }
63
+ const obj = value as JsonObject;
64
+ if (typeof obj.name === "string" && typeof obj.version === "string") {
65
+ // Build a properly typed PackageJson object
66
+ return {
67
+ name: obj.name,
68
+ version: obj.version,
69
+ scripts: obj.scripts as PackageJson["scripts"],
70
+ dependencies: obj.dependencies as PackageJson["dependencies"],
71
+ devDependencies: obj.devDependencies as PackageJson["devDependencies"],
72
+ peerDependencies: obj.peerDependencies as PackageJson["peerDependencies"],
73
+ optionalDependencies:
74
+ obj.optionalDependencies as PackageJson["optionalDependencies"],
75
+ updateIgnoreDependencies:
76
+ obj.updateIgnoreDependencies as PackageJson["updateIgnoreDependencies"],
77
+ };
78
+ }
79
+ return undefined;
80
+ }
81
+
82
+ /**
83
+ * Safe JSON parse that returns JsonValue type
84
+ */
85
+ export function safeJsonParse(text: string): JsonValue | undefined {
86
+ try {
87
+ return JSON.parse(text) as JsonValue;
88
+ } catch {
89
+ return undefined;
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Type guard for ReleaseConfig modules
95
+ */
96
+ export function isReleaseConfigModule(
97
+ module: { default?: ReleaseConfig } | null | undefined,
98
+ ): module is { default: ReleaseConfig } {
99
+ if (typeof module !== "object" || module === null) {
100
+ return false;
101
+ }
102
+ if (!("default" in module) || module.default === undefined) {
103
+ return false;
104
+ }
105
+ const defaultExport = module.default;
106
+ if (typeof defaultExport !== "object" || defaultExport === null) {
107
+ return false;
108
+ }
109
+ if (!("packages" in defaultExport)) {
110
+ return false;
111
+ }
112
+ return Array.isArray(defaultExport.packages);
113
+ }
114
+
115
+ /**
116
+ * Convert catch error to typed error
117
+ * Accepts any value from catch block and converts to CatchError
118
+ */
119
+ export function toCatchError(
120
+ err: Error | ExecSyncError | string | null | undefined,
121
+ ): CatchError {
122
+ if (err instanceof Error) {
123
+ return err;
124
+ }
125
+ if (typeof err === "string") {
126
+ return new Error(err);
127
+ }
128
+ if (typeof err === "object" && err !== null) {
129
+ return err as CatchError;
130
+ }
131
+ return new Error(String(err));
132
+ }
133
+
134
+ /**
135
+ * Type guard for errors with stdout
136
+ */
137
+ export function hasStdout(
138
+ error: CatchError,
139
+ ): error is CatchError & { stdout: string | Buffer } {
140
+ if (typeof error !== "object" || error === null) {
141
+ return false;
142
+ }
143
+ return (
144
+ "stdout" in error &&
145
+ error.stdout !== undefined &&
146
+ (typeof error.stdout === "string" || Buffer.isBuffer(error.stdout))
147
+ );
148
+ }
149
+
150
+ /**
151
+ * Type guard for errors with stderr
152
+ */
153
+ export function hasStderr(
154
+ error: CatchError,
155
+ ): error is CatchError & { stderr: string | Buffer } {
156
+ if (typeof error !== "object" || error === null) {
157
+ return false;
158
+ }
159
+ return (
160
+ "stderr" in error &&
161
+ error.stderr !== undefined &&
162
+ (typeof error.stderr === "string" || Buffer.isBuffer(error.stderr))
163
+ );
164
+ }
165
+
166
+ /**
167
+ * Type guard for errors with exit code
168
+ */
169
+ export function hasExitCode(
170
+ error: CatchError,
171
+ ): error is CatchError & { status: number } {
172
+ if (typeof error !== "object" || error === null) {
173
+ return false;
174
+ }
175
+ return "status" in error && typeof error.status === "number";
176
+ }
177
+
178
+ /**
179
+ * Check if a value is a non-empty string
180
+ */
181
+ export function isNonEmptyString(
182
+ value: string | undefined | null,
183
+ ): value is string {
184
+ return typeof value === "string" && value.trim().length > 0;
185
+ }
186
+
187
+ /**
188
+ * Check if a value is a valid semver string
189
+ */
190
+ export function isValidSemver(value: string): boolean {
191
+ const semverRegex = /^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$/;
192
+ return semverRegex.test(value);
193
+ }
194
+
195
+ // ============================================================================
196
+ // Retry Logic
197
+ // ============================================================================
198
+
199
+ /**
200
+ * Result type for retry operations
201
+ */
202
+ export type RetryResult<T> =
203
+ | { success: true; data: T }
204
+ | { success: false; message: string };
205
+
206
+ /**
207
+ * Handler for retrying failed operations with exponential backoff
208
+ */
209
+ export class RetryHandler {
210
+ private readonly maxAttempts: number;
211
+ private readonly delayMs: number;
212
+ private readonly backoffMultiplier: number;
213
+ private readonly maxDelayMs: number;
214
+
215
+ constructor(config?: RetryConfig) {
216
+ this.maxAttempts = config?.maxAttempts ?? RETRY_DEFAULTS.MAX_ATTEMPTS;
217
+ this.delayMs = config?.delayMs ?? RETRY_DEFAULTS.INITIAL_DELAY;
218
+ this.backoffMultiplier =
219
+ config?.backoffMultiplier ?? RETRY_DEFAULTS.BACKOFF_MULTIPLIER;
220
+ this.maxDelayMs = config?.maxDelayMs ?? RETRY_DEFAULTS.MAX_DELAY;
221
+ }
222
+
223
+ /**
224
+ * Execute an operation with retry logic
225
+ * Returns a result type instead of throwing
226
+ */
227
+ async withRetry<T>(
228
+ operation: () => Promise<T>,
229
+ logger: EndpointLogger,
230
+ operationName: string,
231
+ ): Promise<RetryResult<T>> {
232
+ let lastError: Error | undefined;
233
+
234
+ for (let attempt = 1; attempt <= this.maxAttempts; attempt++) {
235
+ try {
236
+ const data = await operation();
237
+ return { success: true, data };
238
+ } catch (error) {
239
+ lastError = error instanceof Error ? error : new Error(String(error));
240
+
241
+ if (attempt < this.maxAttempts) {
242
+ const delay = this.calculateDelay(attempt);
243
+ logger.warn(MESSAGES.RETRY_ATTEMPT, {
244
+ operation: operationName,
245
+ attempt,
246
+ maxAttempts: this.maxAttempts,
247
+ nextRetryIn: formatDuration(delay),
248
+ error: lastError.message,
249
+ });
250
+ await sleep(delay);
251
+ }
252
+ }
253
+ }
254
+
255
+ logger.error(MESSAGES.RETRY_FAILED, {
256
+ operation: operationName,
257
+ attempts: this.maxAttempts,
258
+ lastError: lastError?.message,
259
+ });
260
+
261
+ return {
262
+ success: false,
263
+ message:
264
+ lastError?.message ??
265
+ `${operationName} failed after ${this.maxAttempts} attempts`,
266
+ };
267
+ }
268
+
269
+ /**
270
+ * Calculate delay for a given attempt using exponential backoff
271
+ */
272
+ private calculateDelay(attempt: number): number {
273
+ const delay = this.delayMs * Math.pow(this.backoffMultiplier, attempt - 1);
274
+ return Math.min(delay, this.maxDelayMs);
275
+ }
276
+ }
277
+
278
+ // ============================================================================
279
+ // Time and Duration Helpers
280
+ // ============================================================================
281
+
282
+ /**
283
+ * Sleep for a specified duration
284
+ */
285
+ export function sleep(ms: number): Promise<void> {
286
+ return new Promise((resolve) => {
287
+ setTimeout(resolve, ms);
288
+ });
289
+ }
290
+
291
+ /**
292
+ * Format a duration in milliseconds to a human-readable string
293
+ */
294
+ export function formatDuration(ms: number): string {
295
+ if (ms < 1000) {
296
+ return `${ms}ms`;
297
+ }
298
+
299
+ const seconds = Math.floor(ms / 1000);
300
+ const remainingMs = ms % 1000;
301
+
302
+ if (seconds < 60) {
303
+ return remainingMs > 0
304
+ ? `${seconds}.${Math.floor(remainingMs / 100)}s`
305
+ : `${seconds}s`;
306
+ }
307
+
308
+ const minutes = Math.floor(seconds / 60);
309
+ const remainingSeconds = seconds % 60;
310
+
311
+ if (minutes < 60) {
312
+ return remainingSeconds > 0
313
+ ? `${minutes}m ${remainingSeconds}s`
314
+ : `${minutes}m`;
315
+ }
316
+
317
+ const hours = Math.floor(minutes / 60);
318
+ const remainingMinutes = minutes % 60;
319
+ return `${hours}h ${remainingMinutes}m`;
320
+ }
321
+
322
+ /**
323
+ * Create a stopwatch for measuring operation duration
324
+ */
325
+ export function createStopwatch(): {
326
+ stop: () => number;
327
+ elapsed: () => number;
328
+ } {
329
+ const start = Date.now();
330
+ return {
331
+ stop: () => Date.now() - start,
332
+ elapsed: () => Date.now() - start,
333
+ };
334
+ }
335
+
336
+ // ============================================================================
337
+ // String Helpers
338
+ // ============================================================================
339
+
340
+ /**
341
+ * Escape shell special characters in a string
342
+ */
343
+ export function sanitizeForShell(value: string): string {
344
+ return value.replaceAll(/[`$\\!"']/g, "\\$&");
345
+ }
346
+
347
+ /**
348
+ * Escape double quotes in a string for shell commands
349
+ */
350
+ export function escapeDoubleQuotes(value: string): string {
351
+ return value.replaceAll('"', '\\"');
352
+ }
353
+
354
+ /**
355
+ * Truncate a string to a maximum length with ellipsis
356
+ */
357
+ export function truncate(str: string, maxLength: number): string {
358
+ if (str.length <= maxLength) {
359
+ return str;
360
+ }
361
+ return `${str.slice(0, maxLength - 3)}...`;
362
+ }
363
+
364
+ /**
365
+ * Convert a string to kebab-case
366
+ */
367
+ export function toKebabCase(str: string): string {
368
+ return str
369
+ .replaceAll(/([a-z])([A-Z])/g, "$1-$2")
370
+ .replaceAll(/[\s_]+/g, "-")
371
+ .toLowerCase();
372
+ }
373
+
374
+ /**
375
+ * Pluralize a word based on count
376
+ */
377
+ export function pluralize(
378
+ count: number,
379
+ singular: string,
380
+ plural?: string,
381
+ ): string {
382
+ return count === 1 ? singular : (plural ?? `${singular}s`);
383
+ }
384
+
385
+ // ============================================================================
386
+ // Version Helpers
387
+ // ============================================================================
388
+
389
+ /**
390
+ * Parse a semantic version string into components
391
+ */
392
+ export function parseVersion(version: string): ParsedVersion {
393
+ const regex =
394
+ /^(\d+)\.(\d+)\.(\d+)(?:-([a-zA-Z0-9.-]+))?(?:\+([a-zA-Z0-9.-]+))?$/;
395
+ const match = version.match(regex);
396
+
397
+ if (!match) {
398
+ return {
399
+ major: 0,
400
+ minor: 0,
401
+ patch: 0,
402
+ prerelease: null,
403
+ prereleaseNumber: null,
404
+ buildMetadata: null,
405
+ };
406
+ }
407
+
408
+ const prerelease = match[4] ?? null;
409
+ let prereleaseNumber: number | null = null;
410
+
411
+ if (prerelease) {
412
+ const preMatch = prerelease.match(/\.(\d+)$/);
413
+ if (preMatch) {
414
+ prereleaseNumber = parseInt(preMatch[1] ?? "0", 10);
415
+ }
416
+ }
417
+
418
+ return {
419
+ major: parseInt(match[1] ?? "0", 10),
420
+ minor: parseInt(match[2] ?? "0", 10),
421
+ patch: parseInt(match[3] ?? "0", 10),
422
+ prerelease,
423
+ prereleaseNumber,
424
+ buildMetadata: match[5] ?? null,
425
+ };
426
+ }
427
+
428
+ /**
429
+ * Compare two semantic version strings
430
+ * Returns: -1 if a < b, 0 if a == b, 1 if a > b
431
+ */
432
+ export function compareVersions(a: string, b: string): -1 | 0 | 1 {
433
+ const va = parseVersion(a);
434
+ const vb = parseVersion(b);
435
+
436
+ // Compare major.minor.patch
437
+ if (va.major !== vb.major) {
438
+ return va.major > vb.major ? 1 : -1;
439
+ }
440
+ if (va.minor !== vb.minor) {
441
+ return va.minor > vb.minor ? 1 : -1;
442
+ }
443
+ if (va.patch !== vb.patch) {
444
+ return va.patch > vb.patch ? 1 : -1;
445
+ }
446
+
447
+ // Handle prerelease comparison
448
+ if (va.prerelease === null && vb.prerelease === null) {
449
+ return 0;
450
+ }
451
+ if (va.prerelease === null) {
452
+ return 1; // Release > prerelease
453
+ }
454
+ if (vb.prerelease === null) {
455
+ return -1;
456
+ }
457
+
458
+ // Compare prerelease identifiers
459
+ const comparison = va.prerelease.localeCompare(vb.prerelease);
460
+ return comparison === 0 ? 0 : comparison > 0 ? 1 : -1;
461
+ }
462
+
463
+ // ============================================================================
464
+ // Array Helpers
465
+ // ============================================================================
466
+
467
+ /**
468
+ * Chunk an array into smaller arrays of specified size
469
+ */
470
+ export function chunk<T>(array: T[], size: number): T[][] {
471
+ const chunks: T[][] = [];
472
+ for (let i = 0; i < array.length; i += size) {
473
+ chunks.push(array.slice(i, i + size));
474
+ }
475
+ return chunks;
476
+ }
477
+
478
+ /**
479
+ * Remove duplicate items from an array
480
+ */
481
+ export function unique<T>(array: T[]): T[] {
482
+ return [...new Set(array)];
483
+ }
484
+
485
+ /**
486
+ * Execute async operations with a concurrency limit
487
+ * Uses Promise.allSettled for cleaner implementation without type casts
488
+ */
489
+ export async function asyncPool<T, R>(
490
+ items: T[],
491
+ concurrency: number,
492
+ fn: (item: T) => Promise<R>,
493
+ ): Promise<R[]> {
494
+ const results: R[] = [];
495
+
496
+ // Process items in batches of concurrency size
497
+ for (let i = 0; i < items.length; i += concurrency) {
498
+ const batch = items.slice(i, i + concurrency);
499
+ const batchResults = await Promise.allSettled(batch.map(fn));
500
+
501
+ for (const result of batchResults) {
502
+ if (result.status === "fulfilled") {
503
+ results.push(result.value);
504
+ }
505
+ }
506
+ }
507
+
508
+ return results;
509
+ }
510
+
511
+ // ============================================================================
512
+ // Object Helpers
513
+ // ============================================================================
514
+
515
+ /**
516
+ * Deep clone an object
517
+ */
518
+ export function deepClone<T>(obj: T): T {
519
+ return JSON.parse(JSON.stringify(obj));
520
+ }
521
+
522
+ /**
523
+ * Pick specific keys from an object
524
+ */
525
+ export function pick<T extends Record<string, JsonValue>, K extends keyof T>(
526
+ obj: T,
527
+ keys: K[],
528
+ ): Pick<T, K> {
529
+ const result = {} as Pick<T, K>;
530
+ for (const key of keys) {
531
+ if (key in obj) {
532
+ result[key] = obj[key];
533
+ }
534
+ }
535
+ return result;
536
+ }
537
+
538
+ /**
539
+ * Omit specific keys from an object
540
+ */
541
+ export function omit<T extends Record<string, JsonValue>, K extends keyof T>(
542
+ obj: T,
543
+ keys: K[],
544
+ ): Omit<T, K> {
545
+ const result = { ...obj };
546
+ for (const key of keys) {
547
+ delete result[key];
548
+ }
549
+ return result as Omit<T, K>;
550
+ }
551
+
552
+ // ============================================================================
553
+ // Environment Helpers
554
+ // ============================================================================
555
+
556
+ /**
557
+ * Result type for environment variable retrieval
558
+ */
559
+ export type EnvResult =
560
+ | { success: true; value: string }
561
+ | { success: false; message: string };
562
+
563
+ /**
564
+ * Get an environment variable with a default value
565
+ */
566
+ export function getEnv(key: string, defaultValue?: string): string | undefined {
567
+ return process.env[key] ?? defaultValue;
568
+ }
569
+
570
+ /**
571
+ * Get a required environment variable
572
+ * Returns a result type instead of throwing
573
+ */
574
+ export function requireEnv(key: string): EnvResult {
575
+ const value = process.env[key];
576
+ if (value === undefined || value === "") {
577
+ return {
578
+ success: false,
579
+ message: `Required environment variable ${key} is not set`,
580
+ };
581
+ }
582
+ return { success: true, value };
583
+ }
584
+
585
+ /**
586
+ * Check if running in production
587
+ */
588
+ export function isProduction(): boolean {
589
+ return process.env.NODE_ENV === "production";
590
+ }
591
+
592
+ /**
593
+ * Check if running in development
594
+ */
595
+ export function isDevelopment(): boolean {
596
+ return process.env.NODE_ENV === "development" || !process.env.NODE_ENV;
597
+ }
598
+
599
+ // ============================================================================
600
+ // Path Helpers
601
+ // ============================================================================
602
+
603
+ /**
604
+ * Normalize path separators to forward slashes
605
+ */
606
+ export function normalizePath(path: string): string {
607
+ return path.replaceAll("\\", "/");
608
+ }
609
+
610
+ /**
611
+ * Get file extension from path (without dot)
612
+ */
613
+ export function getExtension(path: string): string {
614
+ const lastDot = path.lastIndexOf(".");
615
+ if (lastDot === -1 || lastDot === 0) {
616
+ return "";
617
+ }
618
+ return path.slice(lastDot + 1).toLowerCase();
619
+ }
620
+
621
+ // ============================================================================
622
+ // Date Helpers
623
+ // ============================================================================
624
+
625
+ /**
626
+ * Get current date in ISO format (YYYY-MM-DD)
627
+ */
628
+ export function getISODate(): string {
629
+ return new Date().toISOString().split("T")[0] ?? "";
630
+ }
631
+
632
+ /**
633
+ * Get current timestamp suitable for filenames
634
+ */
635
+ export function getFileTimestamp(): string {
636
+ return new Date()
637
+ .toISOString()
638
+ .replaceAll(/[:.T]/g, "-")
639
+ .split("-")
640
+ .slice(0, 6)
641
+ .join("-");
642
+ }