@next-vibe/checker 1.0.11 → 1.0.13

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 (400) hide show
  1. package/.dist/bin/vibe-runtime.js +26 -22
  2. package/.dist/bin/vibe-runtime.js.map +5 -5
  3. package/.dist/oxlint-plugins/i18n.js +4 -0
  4. package/.dist/oxlint-plugins/i18n.js.map +1 -0
  5. package/.dist/oxlint-plugins/jsx-capitalization.js +4 -0
  6. package/.dist/oxlint-plugins/jsx-capitalization.js.map +1 -0
  7. package/.dist/oxlint-plugins/restricted-syntax.js +4 -0
  8. package/.dist/oxlint-plugins/restricted-syntax.js.map +1 -0
  9. package/check.config.ts +4 -12
  10. package/package.json +2 -9
  11. package/src/app/api/[locale]/LICENSE +674 -0
  12. package/src/app/api/[locale]/i18n/de/index.ts +13 -0
  13. package/src/app/api/[locale]/i18n/en/index.ts +12 -0
  14. package/src/app/api/[locale]/i18n/pl/index.ts +11 -0
  15. package/src/app/api/[locale]/shared/i18n/de/index.ts +85 -0
  16. package/src/app/api/[locale]/shared/i18n/en/index.ts +83 -0
  17. package/src/app/api/[locale]/shared/i18n/pl/index.ts +85 -0
  18. package/src/app/api/[locale]/shared/stats-filtering.ts +202 -0
  19. package/src/app/api/[locale]/shared/types/common.schema.ts +55 -0
  20. package/src/app/api/[locale]/shared/types/response.schema.ts +372 -0
  21. package/src/app/api/[locale]/shared/types/stats-filtering.schema.ts +375 -0
  22. package/src/app/api/[locale]/shared/types/utils.ts +190 -0
  23. package/src/app/api/[locale]/shared/utils/base64.ts +49 -0
  24. package/src/app/api/[locale]/shared/utils/env-util.ts +40 -0
  25. package/src/app/api/[locale]/shared/utils/i18n/de/index.ts +21 -0
  26. package/src/app/api/[locale]/shared/utils/i18n/en/index.ts +19 -0
  27. package/src/app/api/[locale]/shared/utils/i18n/pl/index.ts +21 -0
  28. package/src/app/api/[locale]/shared/utils/index.ts +11 -0
  29. package/src/app/api/[locale]/shared/utils/object-path.ts +41 -0
  30. package/src/app/api/[locale]/shared/utils/object.test.ts +82 -0
  31. package/src/app/api/[locale]/shared/utils/object.ts +75 -0
  32. package/src/app/api/[locale]/shared/utils/parse-error.ts +134 -0
  33. package/src/app/api/[locale]/shared/utils/parse-json.ts +70 -0
  34. package/src/app/api/[locale]/shared/utils/time.ts +53 -0
  35. package/src/app/api/[locale]/shared/utils/validation.ts +127 -0
  36. package/src/app/api/[locale]/shared/utils/zod-required-fields.ts +116 -0
  37. package/src/app/api/[locale]/system/builder/definition.ts +1942 -0
  38. package/src/app/api/[locale]/system/builder/enum.ts +78 -0
  39. package/src/app/api/[locale]/system/builder/i18n/de/index.ts +677 -0
  40. package/src/app/api/[locale]/system/builder/i18n/en/index.ts +665 -0
  41. package/src/app/api/[locale]/system/builder/i18n/pl/index.ts +668 -0
  42. package/src/app/api/[locale]/system/builder/repository/build-executor.test.ts +182 -0
  43. package/src/app/api/[locale]/system/builder/repository/build-executor.ts +583 -0
  44. package/src/app/api/[locale]/system/builder/repository/bun-compiler.ts +261 -0
  45. package/src/app/api/[locale]/system/builder/repository/bundle-analyzer.ts +197 -0
  46. package/src/app/api/[locale]/system/builder/repository/config-loader.ts +159 -0
  47. package/src/app/api/[locale]/system/builder/repository/config-validator.ts +97 -0
  48. package/src/app/api/[locale]/system/builder/repository/constants.ts +125 -0
  49. package/src/app/api/[locale]/system/builder/repository/error-suggester.ts +75 -0
  50. package/src/app/api/[locale]/system/builder/repository/file-copier.ts +98 -0
  51. package/src/app/api/[locale]/system/builder/repository/folder-cleaner.ts +80 -0
  52. package/src/app/api/[locale]/system/builder/repository/index.ts +2 -0
  53. package/src/app/api/[locale]/system/builder/repository/npm-package-generator.ts +146 -0
  54. package/src/app/api/[locale]/system/builder/repository/output-formatter.ts +104 -0
  55. package/src/app/api/[locale]/system/builder/repository/profile-service.ts +79 -0
  56. package/src/app/api/[locale]/system/builder/repository/report-generator.ts +125 -0
  57. package/src/app/api/[locale]/system/builder/repository/vite-compiler.ts +291 -0
  58. package/src/app/api/[locale]/system/builder/route.ts +21 -0
  59. package/src/app/api/[locale]/system/builder/test-files/file1.ts +2 -0
  60. package/src/app/api/[locale]/system/builder/test-files/file2.tsx +10 -0
  61. package/src/app/api/[locale]/system/builder/test-files/file3.tsx +16 -0
  62. package/src/app/api/[locale]/system/builder/test-files/folderToCopy/fileInFolder.ts +2 -0
  63. package/src/app/api/[locale]/system/builder/test-files/test-config.ts +38 -0
  64. package/src/app/api/[locale]/system/builder/test-files/test-delete-config.ts +8 -0
  65. package/src/app/api/[locale]/system/builder/test-files/test-project/package.json +24 -0
  66. package/src/app/api/[locale]/system/builder/test-files/test-project/src/constants.ts +6 -0
  67. package/src/app/api/[locale]/system/builder/test-files/test-project/src/greet.ts +18 -0
  68. package/src/app/api/[locale]/system/builder/test-files/test-project/src/index.ts +7 -0
  69. package/src/app/api/[locale]/system/builder/test-files/test-project/src/utils/calculate.ts +27 -0
  70. package/src/app/api/[locale]/system/builder/test-files/test-project/tsconfig.json +19 -0
  71. package/src/app/api/[locale]/system/builder/test-files/test-project/tsconfig.tsbuildinfo +1 -0
  72. package/src/app/api/[locale]/system/builder/test-files/test3.css +1 -0
  73. package/src/app/api/[locale]/system/check/config/repository.ts +886 -0
  74. package/src/app/api/[locale]/system/check/config/shared.ts +396 -0
  75. package/src/app/api/[locale]/system/check/config/types.ts +616 -0
  76. package/src/app/api/[locale]/system/check/config/utils.ts +171 -0
  77. package/src/app/api/[locale]/system/check/i18n/de/index.ts +15 -0
  78. package/src/app/api/[locale]/system/check/i18n/en/index.ts +14 -0
  79. package/src/app/api/[locale]/system/check/i18n/pl/index.ts +15 -0
  80. package/src/app/api/[locale]/system/check/lint/definition.ts +414 -0
  81. package/src/app/api/[locale]/system/check/lint/enum.ts +37 -0
  82. package/src/app/api/[locale]/system/check/lint/i18n/de/index.ts +164 -0
  83. package/src/app/api/[locale]/system/check/lint/i18n/en/index.ts +162 -0
  84. package/src/app/api/[locale]/system/check/lint/i18n/pl/index.ts +164 -0
  85. package/src/app/api/[locale]/system/check/lint/repository.ts +753 -0
  86. package/src/app/api/[locale]/system/check/lint/route.ts +21 -0
  87. package/src/app/api/[locale]/system/check/oxlint/README.md +190 -0
  88. package/src/app/api/[locale]/system/check/oxlint/definition.ts +414 -0
  89. package/src/app/api/[locale]/system/check/oxlint/enum.ts +37 -0
  90. package/src/app/api/[locale]/system/check/oxlint/i18n/de/index.ts +171 -0
  91. package/src/app/api/[locale]/system/check/oxlint/i18n/en/index.ts +168 -0
  92. package/src/app/api/[locale]/system/check/oxlint/i18n/pl/index.ts +172 -0
  93. package/src/app/api/[locale]/system/check/oxlint/plugins/i18n/src/index.ts +372 -0
  94. package/src/app/api/[locale]/system/check/oxlint/plugins/jsx-capitalization/README.md +246 -0
  95. package/src/app/api/[locale]/system/check/oxlint/plugins/jsx-capitalization/src/index.ts +583 -0
  96. package/src/app/api/[locale]/system/check/oxlint/plugins/restricted-syntax/src/index.ts +500 -0
  97. package/src/app/api/[locale]/system/check/oxlint/plugins/restricted-syntax/test.tsx +74 -0
  98. package/src/app/api/[locale]/system/check/oxlint/plugins/shared/config-loader.ts +305 -0
  99. package/src/app/api/[locale]/system/check/oxlint/repository.ts +959 -0
  100. package/src/app/api/[locale]/system/check/oxlint/route.ts +21 -0
  101. package/src/app/api/[locale]/system/check/oxlint/types.ts +193 -0
  102. package/src/app/api/[locale]/system/check/test-project/bun.lock +532 -0
  103. package/src/app/api/[locale]/system/check/test-project/check.config.ts +981 -0
  104. package/src/app/api/[locale]/system/check/test-project/package.json +12 -0
  105. package/src/app/api/[locale]/system/check/test-project/src/constants.ts +6 -0
  106. package/src/app/api/[locale]/system/check/test-project/src/greet.ts +18 -0
  107. package/src/app/api/[locale]/system/check/test-project/src/test-issues/a11y-issues.tsx +107 -0
  108. package/src/app/api/[locale]/system/check/test-project/src/test-issues/eslint-issues.tsx +37 -0
  109. package/src/app/api/[locale]/system/check/test-project/src/test-issues/general-issues.ts +137 -0
  110. package/src/app/api/[locale]/system/check/test-project/src/test-issues/i18n-issues.tsx +129 -0
  111. package/src/app/api/[locale]/system/check/test-project/src/test-issues/jsx-capitalization-issues.tsx +131 -0
  112. package/src/app/api/[locale]/system/check/test-project/src/test-issues/nextjs-issues.tsx +95 -0
  113. package/src/app/api/[locale]/system/check/test-project/src/test-issues/promise-issues.ts +76 -0
  114. package/src/app/api/[locale]/system/check/test-project/src/test-issues/react-issues.tsx +95 -0
  115. package/src/app/api/[locale]/system/check/test-project/src/test-issues/restricted-syntax-issues.tsx +61 -0
  116. package/src/app/api/[locale]/system/check/test-project/src/test-issues/typescript-issues.ts +80 -0
  117. package/src/app/api/[locale]/system/check/test-project/src/utils/calculate.ts +27 -0
  118. package/src/app/api/[locale]/system/check/test-project/tsconfig.json +34 -0
  119. package/src/app/api/[locale]/system/check/test-project/tsconfig.tsbuildinfo +1 -0
  120. package/src/app/api/[locale]/system/check/typecheck/definition.ts +369 -0
  121. package/src/app/api/[locale]/system/check/typecheck/enum.ts +37 -0
  122. package/src/app/api/[locale]/system/check/typecheck/i18n/de/index.ts +159 -0
  123. package/src/app/api/[locale]/system/check/typecheck/i18n/en/index.ts +150 -0
  124. package/src/app/api/[locale]/system/check/typecheck/i18n/pl/index.ts +155 -0
  125. package/src/app/api/[locale]/system/check/typecheck/repository.ts +919 -0
  126. package/src/app/api/[locale]/system/check/typecheck/route.ts +22 -0
  127. package/src/app/api/[locale]/system/check/typecheck/utils.ts +168 -0
  128. package/src/app/api/[locale]/system/check/vibe-check/definition.ts +568 -0
  129. package/src/app/api/[locale]/system/check/vibe-check/enum.ts +69 -0
  130. package/src/app/api/[locale]/system/check/vibe-check/i18n/de/index.ts +192 -0
  131. package/src/app/api/[locale]/system/check/vibe-check/i18n/en/index.ts +189 -0
  132. package/src/app/api/[locale]/system/check/vibe-check/i18n/pl/index.ts +192 -0
  133. package/src/app/api/[locale]/system/check/vibe-check/repository.ts +545 -0
  134. package/src/app/api/[locale]/system/check/vibe-check/route.test.ts +1142 -0
  135. package/src/app/api/[locale]/system/check/vibe-check/route.ts +21 -0
  136. package/src/app/api/[locale]/system/generated/endpoint.ts +313 -0
  137. package/src/app/api/[locale]/system/generated/endpoints.ts +156 -0
  138. package/src/app/api/[locale]/system/generated/route-handlers.ts +224 -0
  139. package/src/app/api/[locale]/system/generators/endpoint/definition.ts +193 -0
  140. package/src/app/api/[locale]/system/generators/endpoint/i18n/de/index.ts +48 -0
  141. package/src/app/api/[locale]/system/generators/endpoint/i18n/en/index.ts +48 -0
  142. package/src/app/api/[locale]/system/generators/endpoint/i18n/pl/index.ts +50 -0
  143. package/src/app/api/[locale]/system/generators/endpoint/repository.ts +291 -0
  144. package/src/app/api/[locale]/system/generators/endpoint/route.ts +21 -0
  145. package/src/app/api/[locale]/system/generators/endpoints/definition.ts +246 -0
  146. package/src/app/api/[locale]/system/generators/endpoints/i18n/de/index.ts +54 -0
  147. package/src/app/api/[locale]/system/generators/endpoints/i18n/en/index.ts +52 -0
  148. package/src/app/api/[locale]/system/generators/endpoints/i18n/pl/index.ts +54 -0
  149. package/src/app/api/[locale]/system/generators/endpoints/options-repository.ts +463 -0
  150. package/src/app/api/[locale]/system/generators/endpoints/repository.ts +383 -0
  151. package/src/app/api/[locale]/system/generators/endpoints/route.ts +18 -0
  152. package/src/app/api/[locale]/system/generators/endpoints-index/definition.ts +194 -0
  153. package/src/app/api/[locale]/system/generators/endpoints-index/i18n/de/index.ts +71 -0
  154. package/src/app/api/[locale]/system/generators/endpoints-index/i18n/en/index.ts +69 -0
  155. package/src/app/api/[locale]/system/generators/endpoints-index/i18n/pl/index.ts +71 -0
  156. package/src/app/api/[locale]/system/generators/endpoints-index/repository.ts +294 -0
  157. package/src/app/api/[locale]/system/generators/endpoints-index/route.ts +18 -0
  158. package/src/app/api/[locale]/system/generators/generate-all/definition.ts +355 -0
  159. package/src/app/api/[locale]/system/generators/generate-all/i18n/de/index.ts +96 -0
  160. package/src/app/api/[locale]/system/generators/generate-all/i18n/en/index.ts +94 -0
  161. package/src/app/api/[locale]/system/generators/generate-all/i18n/pl/index.ts +96 -0
  162. package/src/app/api/[locale]/system/generators/generate-all/repository.ts +257 -0
  163. package/src/app/api/[locale]/system/generators/generate-all/route.ts +20 -0
  164. package/src/app/api/[locale]/system/generators/i18n/de/index.ts +15 -0
  165. package/src/app/api/[locale]/system/generators/i18n/en/index.ts +14 -0
  166. package/src/app/api/[locale]/system/generators/i18n/pl/index.ts +15 -0
  167. package/src/app/api/[locale]/system/generators/route-handlers/definition.ts +198 -0
  168. package/src/app/api/[locale]/system/generators/route-handlers/i18n/de/index.ts +48 -0
  169. package/src/app/api/[locale]/system/generators/route-handlers/i18n/en/index.ts +48 -0
  170. package/src/app/api/[locale]/system/generators/route-handlers/i18n/pl/index.ts +50 -0
  171. package/src/app/api/[locale]/system/generators/route-handlers/repository.ts +277 -0
  172. package/src/app/api/[locale]/system/generators/route-handlers/route.ts +17 -0
  173. package/src/app/api/[locale]/system/generators/shared/utils.ts +233 -0
  174. package/src/app/api/[locale]/system/help/definition.ts +445 -0
  175. package/src/app/api/[locale]/system/help/i18n/de/index.ts +267 -0
  176. package/src/app/api/[locale]/system/help/i18n/en/index.ts +262 -0
  177. package/src/app/api/[locale]/system/help/i18n/pl/index.ts +265 -0
  178. package/src/app/api/[locale]/system/help/interactive/definition.ts +125 -0
  179. package/src/app/api/[locale]/system/help/interactive/i18n/de/index.ts +22 -0
  180. package/src/app/api/[locale]/system/help/interactive/i18n/en/index.ts +19 -0
  181. package/src/app/api/[locale]/system/help/interactive/i18n/pl/index.ts +22 -0
  182. package/src/app/api/[locale]/system/help/interactive/repository.ts +1025 -0
  183. package/src/app/api/[locale]/system/help/interactive/route.ts +53 -0
  184. package/src/app/api/[locale]/system/help/list/definition.ts +372 -0
  185. package/src/app/api/[locale]/system/help/list/repository.ts +110 -0
  186. package/src/app/api/[locale]/system/help/list/route.ts +21 -0
  187. package/src/app/api/[locale]/system/help/repository.ts +212 -0
  188. package/src/app/api/[locale]/system/help/route.ts +16 -0
  189. package/src/app/api/[locale]/system/i18n/de/index.ts +68 -0
  190. package/src/app/api/[locale]/system/i18n/en/index.ts +65 -0
  191. package/src/app/api/[locale]/system/i18n/pl/index.ts +66 -0
  192. package/src/app/api/[locale]/system/release-tool/definition.ts +3104 -0
  193. package/src/app/api/[locale]/system/release-tool/i18n/de/index.ts +813 -0
  194. package/src/app/api/[locale]/system/release-tool/i18n/en/index.ts +797 -0
  195. package/src/app/api/[locale]/system/release-tool/i18n/pl/index.ts +810 -0
  196. package/src/app/api/[locale]/system/release-tool/repository/asset-zipper.ts +128 -0
  197. package/src/app/api/[locale]/system/release-tool/repository/changelog-generator.ts +212 -0
  198. package/src/app/api/[locale]/system/release-tool/repository/ci-detector.ts +566 -0
  199. package/src/app/api/[locale]/system/release-tool/repository/config.ts +113 -0
  200. package/src/app/api/[locale]/system/release-tool/repository/constants.ts +407 -0
  201. package/src/app/api/[locale]/system/release-tool/repository/dependency-manager.ts +527 -0
  202. package/src/app/api/[locale]/system/release-tool/repository/git-service.ts +403 -0
  203. package/src/app/api/[locale]/system/release-tool/repository/hook-runner.ts +100 -0
  204. package/src/app/api/[locale]/system/release-tool/repository/index.ts +1 -0
  205. package/src/app/api/[locale]/system/release-tool/repository/notification-service.ts +638 -0
  206. package/src/app/api/[locale]/system/release-tool/repository/package-service.ts +169 -0
  207. package/src/app/api/[locale]/system/release-tool/repository/publisher.ts +253 -0
  208. package/src/app/api/[locale]/system/release-tool/repository/quality-runner.ts +428 -0
  209. package/src/app/api/[locale]/system/release-tool/repository/release-creator.ts +293 -0
  210. package/src/app/api/[locale]/system/release-tool/repository/release-executor.ts +1198 -0
  211. package/src/app/api/[locale]/system/release-tool/repository/snyk-service.ts +136 -0
  212. package/src/app/api/[locale]/system/release-tool/repository/utils.ts +642 -0
  213. package/src/app/api/[locale]/system/release-tool/repository/validation.ts +288 -0
  214. package/src/app/api/[locale]/system/release-tool/repository/version-service.ts +297 -0
  215. package/src/app/api/[locale]/system/release-tool/route.ts +21 -0
  216. package/src/app/api/[locale]/system/unified-interface/README.md +328 -0
  217. package/src/app/api/[locale]/system/unified-interface/cli/README.md +349 -0
  218. package/src/app/api/[locale]/system/unified-interface/cli/auth/cli-handler.ts +95 -0
  219. package/src/app/api/[locale]/system/unified-interface/cli/auth/cli-user.ts +146 -0
  220. package/src/app/api/[locale]/system/unified-interface/cli/auth/session-file.ts +266 -0
  221. package/src/app/api/[locale]/system/unified-interface/cli/env.ts +26 -0
  222. package/src/app/api/[locale]/system/unified-interface/cli/i18n/de/index.ts +157 -0
  223. package/src/app/api/[locale]/system/unified-interface/cli/i18n/en/index.ts +155 -0
  224. package/src/app/api/[locale]/system/unified-interface/cli/i18n/pl/index.ts +158 -0
  225. package/src/app/api/[locale]/system/unified-interface/cli/runtime/debug.ts +595 -0
  226. package/src/app/api/[locale]/system/unified-interface/cli/runtime/entry-point.ts +129 -0
  227. package/src/app/api/[locale]/system/unified-interface/cli/runtime/environment.ts +155 -0
  228. package/src/app/api/[locale]/system/unified-interface/cli/runtime/execution-errors.ts +452 -0
  229. package/src/app/api/[locale]/system/unified-interface/cli/runtime/parsing.ts +297 -0
  230. package/src/app/api/[locale]/system/unified-interface/cli/runtime/route-executor.ts +859 -0
  231. package/src/app/api/[locale]/system/unified-interface/cli/setup/i18n/de/index.ts +12 -0
  232. package/src/app/api/[locale]/system/unified-interface/cli/setup/i18n/en/index.ts +11 -0
  233. package/src/app/api/[locale]/system/unified-interface/cli/setup/i18n/pl/index.ts +12 -0
  234. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/definition.ts +262 -0
  235. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/i18n/de/index.ts +54 -0
  236. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/i18n/en/index.ts +52 -0
  237. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/i18n/pl/index.ts +54 -0
  238. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/repository.ts +421 -0
  239. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/route.ts +25 -0
  240. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/definition.ts +181 -0
  241. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/i18n/de/index.ts +61 -0
  242. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/i18n/en/index.ts +59 -0
  243. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/i18n/pl/index.ts +61 -0
  244. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/repository.ts +195 -0
  245. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/route.ts +22 -0
  246. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/definition.ts +188 -0
  247. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/i18n/de/index.ts +54 -0
  248. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/i18n/en/index.ts +52 -0
  249. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/i18n/pl/index.ts +54 -0
  250. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/repository.ts +209 -0
  251. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/route.ts +24 -0
  252. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/definition.ts +200 -0
  253. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/i18n/de/index.ts +54 -0
  254. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/i18n/en/index.ts +52 -0
  255. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/i18n/pl/index.ts +54 -0
  256. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/repository.ts +113 -0
  257. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/route.ts +22 -0
  258. package/src/app/api/[locale]/system/unified-interface/cli/vibe-runtime.ts +304 -0
  259. package/src/app/api/[locale]/system/unified-interface/cli/widgets/core/base-renderer.ts +270 -0
  260. package/src/app/api/[locale]/system/unified-interface/cli/widgets/core/registry.ts +309 -0
  261. package/src/app/api/[locale]/system/unified-interface/cli/widgets/core/types.ts +126 -0
  262. package/src/app/api/[locale]/system/unified-interface/cli/widgets/i18n/de/index.ts +67 -0
  263. package/src/app/api/[locale]/system/unified-interface/cli/widgets/i18n/en/index.ts +65 -0
  264. package/src/app/api/[locale]/system/unified-interface/cli/widgets/i18n/pl/index.ts +67 -0
  265. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/accordion.ts +74 -0
  266. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/avatar.ts +39 -0
  267. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/badge.ts +54 -0
  268. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/code-output.ts +298 -0
  269. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/code-quality-files.ts +89 -0
  270. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/code-quality-list.ts +298 -0
  271. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/code-quality-summary.ts +96 -0
  272. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/container.ts +186 -0
  273. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/data-card.ts +65 -0
  274. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/data-cards.ts +570 -0
  275. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/data-list.ts +80 -0
  276. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/data-table.ts +385 -0
  277. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/editable-text.ts +99 -0
  278. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/empty-state.ts +55 -0
  279. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/errors.ts +67 -0
  280. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/grouped-list.ts +729 -0
  281. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/link-card.ts +87 -0
  282. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/link-list.ts +112 -0
  283. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/link.ts +59 -0
  284. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/loading.ts +50 -0
  285. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/markdown.ts +131 -0
  286. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/metric.ts +291 -0
  287. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/section.ts +120 -0
  288. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/stats-grid.ts +149 -0
  289. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/tabs.ts +61 -0
  290. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/text.ts +78 -0
  291. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/title.ts +42 -0
  292. package/src/app/api/[locale]/system/unified-interface/cli/widgets/renderers/response-renderer.ts +418 -0
  293. package/src/app/api/[locale]/system/unified-interface/cli/widgets/renderers/schema-handler.ts +534 -0
  294. package/src/app/api/[locale]/system/unified-interface/i18n/de/index.ts +42 -0
  295. package/src/app/api/[locale]/system/unified-interface/i18n/en/index.ts +40 -0
  296. package/src/app/api/[locale]/system/unified-interface/i18n/pl/index.ts +43 -0
  297. package/src/app/api/[locale]/system/unified-interface/mcp/README.md +114 -0
  298. package/src/app/api/[locale]/system/unified-interface/mcp/converter.ts +146 -0
  299. package/src/app/api/[locale]/system/unified-interface/mcp/i18n/de/index.ts +182 -0
  300. package/src/app/api/[locale]/system/unified-interface/mcp/i18n/en/index.ts +179 -0
  301. package/src/app/api/[locale]/system/unified-interface/mcp/i18n/pl/index.ts +181 -0
  302. package/src/app/api/[locale]/system/unified-interface/mcp/registry.ts +343 -0
  303. package/src/app/api/[locale]/system/unified-interface/mcp/serve/definition.ts +147 -0
  304. package/src/app/api/[locale]/system/unified-interface/mcp/serve/repository.ts +38 -0
  305. package/src/app/api/[locale]/system/unified-interface/mcp/serve/route.ts +14 -0
  306. package/src/app/api/[locale]/system/unified-interface/mcp/server/protocol-handler.ts +309 -0
  307. package/src/app/api/[locale]/system/unified-interface/mcp/server/server.ts +154 -0
  308. package/src/app/api/[locale]/system/unified-interface/mcp/server/stdio-transport.ts +193 -0
  309. package/src/app/api/[locale]/system/unified-interface/mcp/types.ts +246 -0
  310. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definition/create-form.ts +1510 -0
  311. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definition/create.ts +581 -0
  312. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definition/endpoint-to-metadata.ts +52 -0
  313. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definition/loader.ts +152 -0
  314. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definitions/registry.ts +265 -0
  315. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/permissions/registry.ts +680 -0
  316. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/executor.ts +220 -0
  317. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/handler.ts +325 -0
  318. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/multi.ts +184 -0
  319. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/request-validator.ts +201 -0
  320. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/single.ts +58 -0
  321. package/src/app/api/[locale]/system/unified-interface/shared/env/define-env-client.ts +49 -0
  322. package/src/app/api/[locale]/system/unified-interface/shared/env/define-env.ts +47 -0
  323. package/src/app/api/[locale]/system/unified-interface/shared/env/validation-logger.ts +58 -0
  324. package/src/app/api/[locale]/system/unified-interface/shared/field/enum.ts +110 -0
  325. package/src/app/api/[locale]/system/unified-interface/shared/field/specialized.ts +339 -0
  326. package/src/app/api/[locale]/system/unified-interface/shared/field/utils.test.ts +408 -0
  327. package/src/app/api/[locale]/system/unified-interface/shared/field/utils.ts +1349 -0
  328. package/src/app/api/[locale]/system/unified-interface/shared/field-config/endpoint-field-types.ts +107 -0
  329. package/src/app/api/[locale]/system/unified-interface/shared/field-config/field-config-types.ts +268 -0
  330. package/src/app/api/[locale]/system/unified-interface/shared/logger/colors.ts +114 -0
  331. package/src/app/api/[locale]/system/unified-interface/shared/logger/endpoint.ts +169 -0
  332. package/src/app/api/[locale]/system/unified-interface/shared/logger/file-logger.ts +88 -0
  333. package/src/app/api/[locale]/system/unified-interface/shared/logger/formatters.ts +177 -0
  334. package/src/app/api/[locale]/system/unified-interface/shared/server-only/auth/base-auth-handler.ts +82 -0
  335. package/src/app/api/[locale]/system/unified-interface/shared/server-only/auth/factory.ts +33 -0
  336. package/src/app/api/[locale]/system/unified-interface/shared/server-only/server-only.ts +4 -0
  337. package/src/app/api/[locale]/system/unified-interface/shared/types/actions.ts +289 -0
  338. package/src/app/api/[locale]/system/unified-interface/shared/types/endpoint.ts +1167 -0
  339. package/src/app/api/[locale]/system/unified-interface/shared/types/enums.ts +382 -0
  340. package/src/app/api/[locale]/system/unified-interface/shared/types/platform.ts +34 -0
  341. package/src/app/api/[locale]/system/unified-interface/shared/types/types.ts +80 -0
  342. package/src/app/api/[locale]/system/unified-interface/shared/types/ui-config.ts +76 -0
  343. package/src/app/api/[locale]/system/unified-interface/shared/utils/error-types.ts +27 -0
  344. package/src/app/api/[locale]/system/unified-interface/shared/utils/path.ts +63 -0
  345. package/src/app/api/[locale]/system/unified-interface/shared/utils/scanner.ts +241 -0
  346. package/src/app/api/[locale]/system/unified-interface/shared/widgets/actions.ts +256 -0
  347. package/src/app/api/[locale]/system/unified-interface/shared/widgets/configs.ts +1158 -0
  348. package/src/app/api/[locale]/system/unified-interface/shared/widgets/helpers.ts +80 -0
  349. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/accordion.ts +82 -0
  350. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/avatar.ts +75 -0
  351. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/badge.ts +89 -0
  352. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/code-output.ts +302 -0
  353. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/code-quality-list.ts +202 -0
  354. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/container.ts +129 -0
  355. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/data-card.ts +81 -0
  356. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/data-cards.ts +258 -0
  357. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/data-list.ts +123 -0
  358. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/data-table.ts +387 -0
  359. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/editable-text.ts +89 -0
  360. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/empty-state.ts +78 -0
  361. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/errors.ts +93 -0
  362. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/grouped-list.ts +448 -0
  363. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/index.ts +38 -0
  364. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/link-card.ts +130 -0
  365. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/link-list.ts +127 -0
  366. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/link.ts +68 -0
  367. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/loading.ts +81 -0
  368. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/markdown.ts +176 -0
  369. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/metric-card.ts +241 -0
  370. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/section.ts +90 -0
  371. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/stats-grid.ts +71 -0
  372. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/tabs.ts +80 -0
  373. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/text.ts +105 -0
  374. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/title.ts +72 -0
  375. package/src/app/api/[locale]/system/unified-interface/shared/widgets/types.ts +240 -0
  376. package/src/app/api/[locale]/system/unified-interface/shared/widgets/utils/field-helpers.ts +137 -0
  377. package/src/app/api/[locale]/system/unified-interface/shared/widgets/utils/formatting.ts +437 -0
  378. package/src/app/api/[locale]/system/unified-interface/shared/widgets/utils/url.ts +40 -0
  379. package/src/app/api/[locale]/system/unified-interface/shared/widgets/utils/widget-helpers.ts +465 -0
  380. package/src/app/api/[locale]/user/auth/enum.ts +16 -0
  381. package/src/app/api/[locale]/user/auth/i18n/de/index.ts +227 -0
  382. package/src/app/api/[locale]/user/auth/i18n/en/index.ts +205 -0
  383. package/src/app/api/[locale]/user/auth/i18n/pl/index.ts +219 -0
  384. package/src/app/api/[locale]/user/auth/types.ts +110 -0
  385. package/src/app/api/[locale]/user/enum.ts +64 -0
  386. package/src/app/api/[locale]/user/private/i18n/de/index.ts +3 -0
  387. package/src/app/api/[locale]/user/private/i18n/en/index.ts +1 -0
  388. package/src/app/api/[locale]/user/private/i18n/pl/index.ts +3 -0
  389. package/src/app/api/[locale]/user/types.ts +118 -0
  390. package/src/app/api/[locale]/user/user-roles/enum.ts +112 -0
  391. package/src/app/api/[locale]/user/user-roles/i18n/de/index.ts +85 -0
  392. package/src/app/api/[locale]/user/user-roles/i18n/en/index.ts +83 -0
  393. package/src/app/api/[locale]/user/user-roles/i18n/pl/index.ts +86 -0
  394. package/src/app/api/[locale]/user/user-roles/types.ts +34 -0
  395. package/src/app/api/i18n/de/index.ts +6 -0
  396. package/src/app/api/i18n/en/index.ts +5 -0
  397. package/src/app/api/i18n/pl/index.ts +5 -0
  398. package/src/app/i18n/de/index.ts +6 -0
  399. package/src/app/i18n/en/index.ts +5 -0
  400. package/src/app/i18n/pl/index.ts +5 -0
@@ -0,0 +1,1142 @@
1
+ /**
2
+ * Vibe Check Route Tests
3
+ *
4
+ * Tests the complete check system by running vibe check ONCE on test-project
5
+ * and validating ALL expected issues are detected.
6
+ *
7
+ * Architecture:
8
+ * - Single vibe check run in beforeAll (captures oxlint + eslint + typescript)
9
+ * - All assertions compare against this single cached output
10
+ * - Ensures consistent, comprehensive error detection
11
+ */
12
+
13
+ import { execSync } from "node:child_process";
14
+ import { existsSync, unlinkSync } from "node:fs";
15
+ import { resolve } from "node:path";
16
+
17
+ import { beforeAll, describe, expect, it } from "bun:test";
18
+
19
+ // Path constants
20
+ const TEST_PROJECT_PATH = resolve(__dirname, "../test-project");
21
+ const ROOT_PATH = resolve(__dirname, "../../../../../../..");
22
+ const TEST_PROJECT_CONFIG = resolve(TEST_PROJECT_PATH, "check.config.ts");
23
+
24
+ // Test file basenames for validation (src/** only per tsconfig.json)
25
+ const TEST_FILES = [
26
+ "a11y-issues.tsx",
27
+ "eslint-issues.tsx",
28
+ "general-issues.ts",
29
+ "i18n-issues.tsx",
30
+ "jsx-capitalization-issues.tsx",
31
+ "nextjs-issues.tsx",
32
+ "promise-issues.ts",
33
+ "react-issues.tsx",
34
+ "restricted-syntax-issues.tsx",
35
+ "typescript-issues.ts",
36
+ ];
37
+
38
+ // ============================================================
39
+ // EXPECTED ERROR COUNTS (verified manually from vibe check output)
40
+ // ============================================================
41
+ const EXPECTED_COUNTS = {
42
+ // Total summary (counts may vary slightly based on test environment)
43
+ totalIssues: 319,
44
+ totalErrors: 313,
45
+ totalWarnings: 6,
46
+ totalFiles: 11,
47
+
48
+ // Per-file expected errors+warnings
49
+ files: {
50
+ "a11y-issues.tsx": { errors: 64, warnings: 2 },
51
+ "eslint-issues.tsx": { errors: 7, warnings: 0 },
52
+ "general-issues.ts": { errors: 34, warnings: 0 },
53
+ "i18n-issues.tsx": { errors: 43, warnings: 1 },
54
+ "jsx-capitalization-issues.tsx": { errors: 30, warnings: 1 },
55
+ "nextjs-issues.tsx": { errors: 48, warnings: 1 },
56
+ "promise-issues.ts": { errors: 11, warnings: 0 },
57
+ "react-issues.tsx": { errors: 34, warnings: 1 },
58
+ "restricted-syntax-issues.tsx": { errors: 21, warnings: 0 },
59
+ "typescript-issues.ts": { errors: 20, warnings: 0 },
60
+ "calculate.ts": { errors: 1, warnings: 0 },
61
+ },
62
+
63
+ // Expected plugin/rule occurrences (minimum counts)
64
+ rules: {
65
+ // Custom plugins
66
+ "oxlint-plugin-jsx-capitalization": 100,
67
+ "oxlint-plugin-i18n": 50,
68
+ "oxlint-plugin-restricted": 8,
69
+
70
+ // ESLint rules
71
+ "eslint(no-debugger)": 1,
72
+ "eslint(no-console)": 8,
73
+ "eslint(curly)": 2,
74
+ "eslint(eqeqeq)": 3,
75
+ "eslint(no-unused-vars)": 5,
76
+ "eslint(no-template-curly-in-string)": 1,
77
+ "eslint(array-callback-return)": 1,
78
+ "eslint(no-constructor-return)": 1,
79
+ "eslint(no-self-compare)": 1,
80
+ "eslint(no-unused-private-class-members)": 1,
81
+ "eslint(prefer-template)": 1,
82
+ "eslint(no-new)": 1,
83
+
84
+ // TypeScript-ESLint rules
85
+ "typescript-eslint(no-explicit-any)": 3,
86
+ "typescript-eslint(no-inferrable-types)": 3,
87
+ "typescript-eslint(no-empty-function)": 1,
88
+ "typescript-eslint(consistent-type-imports)": 1,
89
+ "typescript-eslint(no-duplicate-enum-values)": 1,
90
+ "typescript-eslint(no-extra-non-null-assertion)": 2,
91
+ "typescript-eslint(explicit-function-return-type)": 1,
92
+
93
+ // React rules
94
+ "eslint-plugin-react(jsx-key)": 1,
95
+ "eslint-plugin-react(jsx-no-duplicate-props)": 1,
96
+ "eslint-plugin-react(no-children-prop)": 1,
97
+ "eslint-plugin-react(no-direct-mutation-state)": 1,
98
+ "eslint-plugin-react(self-closing-comp)": 4,
99
+ "eslint-plugin-react(no-unknown-property)": 1,
100
+ "eslint-plugin-react(iframe-missing-sandbox)": 1,
101
+
102
+ // React Hooks rules
103
+ "eslint-plugin-react-hooks(exhaustive-deps)": 2,
104
+
105
+ // JSX-A11Y rules
106
+ "eslint-plugin-jsx-a11y(alt-text)": 1,
107
+ "eslint-plugin-jsx-a11y(anchor-has-content)": 1,
108
+ "eslint-plugin-jsx-a11y(aria-props)": 1,
109
+ "eslint-plugin-jsx-a11y(aria-role)": 1,
110
+ "eslint-plugin-jsx-a11y(click-events-have-key-events)": 4,
111
+ "eslint-plugin-jsx-a11y(heading-has-content)": 2,
112
+ "eslint-plugin-jsx-a11y(iframe-has-title)": 1,
113
+ "eslint-plugin-jsx-a11y(img-redundant-alt)": 2,
114
+ "eslint-plugin-jsx-a11y(no-access-key)": 1,
115
+ "eslint-plugin-jsx-a11y(no-autofocus)": 1,
116
+ "eslint-plugin-jsx-a11y(no-distracting-elements)": 1,
117
+ "eslint-plugin-jsx-a11y(no-redundant-roles)": 2,
118
+ "eslint-plugin-jsx-a11y(role-has-required-aria-props)": 4,
119
+ "eslint-plugin-jsx-a11y(tabindex-no-positive)": 1,
120
+ "eslint-plugin-jsx-a11y(label-has-associated-control)": 1,
121
+ "eslint-plugin-jsx-a11y(html-has-lang)": 2,
122
+ "eslint-plugin-jsx-a11y(lang)": 2,
123
+ "eslint-plugin-jsx-a11y(prefer-tag-over-role)": 1,
124
+ "eslint-plugin-jsx-a11y(anchor-is-valid)": 1,
125
+
126
+ // Next.js rules
127
+ "eslint-plugin-next(no-img-element)": 4,
128
+ "eslint-plugin-next(no-html-link-for-pages)": 4,
129
+ "eslint-plugin-next(no-sync-scripts)": 1,
130
+ "eslint-plugin-next(no-css-tags)": 1,
131
+ "eslint-plugin-next(google-font-display)": 1,
132
+ "eslint-plugin-next(no-page-custom-font)": 2,
133
+
134
+ // Promise rules
135
+ "eslint-plugin-promise(param-names)": 2,
136
+ "eslint-plugin-promise(always-return)": 2,
137
+ "eslint-plugin-promise(catch-or-return)": 2,
138
+
139
+ // Unicorn rules
140
+ "eslint-plugin-unicorn(no-new-array)": 1,
141
+ "eslint-plugin-unicorn(prefer-spread)": 1,
142
+ "eslint-plugin-unicorn(prefer-array-flat)": 1,
143
+ "eslint-plugin-unicorn(prefer-includes)": 1,
144
+ "eslint-plugin-unicorn(no-await-in-promise-methods)": 2,
145
+ "eslint-plugin-unicorn(no-single-promise-in-promise-methods)": 1,
146
+
147
+ // OXC rules
148
+ "oxc(missing-throw)": 1,
149
+ "oxc(bad-comparison-sequence)": 1,
150
+ "oxc(const-comparisons)": 1,
151
+ },
152
+ };
153
+
154
+ // ============================================================
155
+ // HELPER FUNCTIONS
156
+ // ============================================================
157
+
158
+ /**
159
+ * Run full vibe check on test-project
160
+ */
161
+ function runVibeCheck(targetPath = "./"): string {
162
+ const fullPath = resolve(TEST_PROJECT_PATH, targetPath);
163
+ if (!existsSync(fullPath)) {
164
+ return `Path not found: ${fullPath}`;
165
+ }
166
+
167
+ try {
168
+ const output = execSync(
169
+ `cd "${TEST_PROJECT_PATH}" && bun "${resolve(ROOT_PATH, "src/app/api/[locale]/system/unified-interface/cli/vibe-runtime.ts")}" check "${targetPath}" 2>&1`,
170
+ {
171
+ encoding: "utf-8",
172
+ timeout: 120000,
173
+ },
174
+ );
175
+ return output;
176
+ } catch (error) {
177
+ const execError = error as { stdout?: string; stderr?: string };
178
+ return (execError.stdout || "") + (execError.stderr || "");
179
+ }
180
+ }
181
+
182
+ /**
183
+ * Count occurrences of a pattern in output
184
+ */
185
+ function countOccurrences(output: string, pattern: string): number {
186
+ const regex = new RegExp(
187
+ pattern.replaceAll(/[.*+?^${}()|[\]\\]/g, "\\$&"),
188
+ "g",
189
+ );
190
+ return (output.match(regex) || []).length;
191
+ }
192
+
193
+ /**
194
+ * Extract summary numbers from output
195
+ * The summary section looks like:
196
+ * 📊 Summary
197
+ * ──────────────────────────────────────────────────
198
+ * Files: 12
199
+ * Issues: 320
200
+ * ❌ 314 errors
201
+ * ⚠️ 6 warnings
202
+ */
203
+ function extractSummary(output: string): {
204
+ files: number;
205
+ issues: number;
206
+ errors: number;
207
+ warnings: number;
208
+ } {
209
+ const filesMatch = output.match(/Files:\s+(\d+)/);
210
+ const issuesMatch = output.match(/Issues:\s+(\d+)/);
211
+ // Match errors/warnings in the summary section (after the emoji icons)
212
+ const errorsMatch = output.match(/❌\s*(\d+)\s*errors/);
213
+ const warningsMatch = output.match(/⚠️\s*(\d+)\s*warnings/);
214
+
215
+ return {
216
+ files: filesMatch ? parseInt(filesMatch[1], 10) : 0,
217
+ issues: issuesMatch ? parseInt(issuesMatch[1], 10) : 0,
218
+ errors: errorsMatch ? parseInt(errorsMatch[1], 10) : 0,
219
+ warnings: warningsMatch ? parseInt(warningsMatch[1], 10) : 0,
220
+ };
221
+ }
222
+
223
+ // ============================================================
224
+ // CACHED OUTPUT (single run, all tests compare against this)
225
+ // ============================================================
226
+ let vibeCheckOutput: string;
227
+
228
+ // ============================================================
229
+ // CONFIG CREATION TEST FLOW
230
+ // Tests the full npm package workflow: no config → create → use
231
+ // ============================================================
232
+ describe("Config Creation Flow", () => {
233
+ it("Step 1: should delete existing config", () => {
234
+ if (existsSync(TEST_PROJECT_CONFIG)) {
235
+ unlinkSync(TEST_PROJECT_CONFIG);
236
+ }
237
+ expect(existsSync(TEST_PROJECT_CONFIG)).toBe(false);
238
+ });
239
+
240
+ it("Step 2: should fail without --create-config flag and show hint", () => {
241
+ let output = "";
242
+ try {
243
+ output = execSync(
244
+ `cd "${TEST_PROJECT_PATH}" && bun "${resolve(ROOT_PATH, "src/app/api/[locale]/system/unified-interface/cli/vibe-runtime.ts")}" check ./ 2>&1`,
245
+ { encoding: "utf-8", timeout: 30000 },
246
+ );
247
+ } catch (error) {
248
+ const execError = error as { stdout?: string; stderr?: string };
249
+ output = (execError.stdout || "") + (execError.stderr || "");
250
+ }
251
+
252
+ expect(output).toContain("check.config.ts");
253
+ expect(output).toContain("--create-config");
254
+ expect(existsSync(TEST_PROJECT_CONFIG)).toBe(false);
255
+ });
256
+
257
+ it("Step 3: should create config with --create-config flag", () => {
258
+ let output = "";
259
+ try {
260
+ output = execSync(
261
+ `cd "${TEST_PROJECT_PATH}" && bun "${resolve(ROOT_PATH, "src/app/api/[locale]/system/unified-interface/cli/vibe-runtime.ts")}" check --create-config --skip-lint --skip-typecheck 2>&1`,
262
+ { encoding: "utf-8", timeout: 30000 },
263
+ );
264
+ } catch (error) {
265
+ const execError = error as { stdout?: string; stderr?: string };
266
+ output = (execError.stdout || "") + (execError.stderr || "");
267
+ }
268
+
269
+ expect(existsSync(TEST_PROJECT_CONFIG)).toBe(true);
270
+ expect(output).toContain("Created check.config.ts");
271
+ });
272
+
273
+ it("Step 4: should fail with --create-config when config already exists", () => {
274
+ expect(existsSync(TEST_PROJECT_CONFIG)).toBe(true);
275
+
276
+ let output = "";
277
+ let exitCode = 0;
278
+ try {
279
+ output = execSync(
280
+ `cd "${TEST_PROJECT_PATH}" && bun "${resolve(ROOT_PATH, "src/app/api/[locale]/system/unified-interface/cli/vibe-runtime.ts")}" check --create-config --skip-lint --skip-typecheck 2>&1`,
281
+ { encoding: "utf-8", timeout: 30000 },
282
+ );
283
+ } catch (error) {
284
+ const execError = error as {
285
+ stdout?: string;
286
+ stderr?: string;
287
+ status?: number;
288
+ };
289
+ output = (execError.stdout || "") + (execError.stderr || "");
290
+ exitCode = execError.status || 1;
291
+ }
292
+
293
+ expect(exitCode).not.toBe(0);
294
+ expect(output).toContain("already exists");
295
+ });
296
+
297
+ it("Step 5: should run vibe check successfully with created config", () => {
298
+ expect(existsSync(TEST_PROJECT_CONFIG)).toBe(true);
299
+ vibeCheckOutput = runVibeCheck("./");
300
+ expect(vibeCheckOutput).toContain("Starting Oxlint check");
301
+ expect(vibeCheckOutput).toContain("All checks completed");
302
+ });
303
+ });
304
+
305
+ describe("Vibe Check Complete Test Suite", () => {
306
+ // Config should already exist from previous test suite
307
+ beforeAll(() => {
308
+ if (!vibeCheckOutput) {
309
+ // Ensure config exists
310
+ if (!existsSync(TEST_PROJECT_CONFIG)) {
311
+ try {
312
+ execSync(
313
+ `cd "${TEST_PROJECT_PATH}" && bun "${resolve(ROOT_PATH, "src/app/api/[locale]/system/unified-interface/cli/vibe-runtime.ts")}" check --create-config --skip-lint --skip-typecheck 2>&1`,
314
+ { encoding: "utf-8", timeout: 30000 },
315
+ );
316
+ } catch {
317
+ // Ignore errors
318
+ }
319
+ }
320
+ vibeCheckOutput = runVibeCheck("./");
321
+ }
322
+ });
323
+
324
+ // ============================================================
325
+ // CORE VALIDATION: CHECK COMPLETED SUCCESSFULLY
326
+ // ============================================================
327
+ describe("check execution", () => {
328
+ it("should complete all three checks (oxlint, eslint, typescript)", () => {
329
+ expect(vibeCheckOutput).toContain("Starting Oxlint check");
330
+ expect(vibeCheckOutput).toContain("Starting ESLint check");
331
+ expect(vibeCheckOutput).toContain("Starting TypeScript check");
332
+ expect(vibeCheckOutput).toContain("Oxlint check completed");
333
+ expect(vibeCheckOutput).toContain("ESLint check completed");
334
+ expect(vibeCheckOutput).toContain("TypeScript check completed");
335
+ expect(vibeCheckOutput).toContain("All checks completed");
336
+ });
337
+
338
+ it("should detect errors", () => {
339
+ expect(vibeCheckOutput).toContain("error");
340
+ });
341
+ });
342
+
343
+ // ============================================================
344
+ // SUMMARY VALIDATION
345
+ // ============================================================
346
+ describe("summary validation", () => {
347
+ it("should report expected total files", () => {
348
+ const summary = extractSummary(vibeCheckOutput);
349
+ expect(summary.files).toBe(EXPECTED_COUNTS.totalFiles);
350
+ });
351
+
352
+ it("should report expected total issues", () => {
353
+ const summary = extractSummary(vibeCheckOutput);
354
+ expect(summary.issues).toBe(EXPECTED_COUNTS.totalIssues);
355
+ });
356
+
357
+ it("should report expected error count", () => {
358
+ const summary = extractSummary(vibeCheckOutput);
359
+ expect(summary.errors).toBe(EXPECTED_COUNTS.totalErrors);
360
+ });
361
+
362
+ it("should report expected warning count", () => {
363
+ const summary = extractSummary(vibeCheckOutput);
364
+ expect(summary.warnings).toBe(EXPECTED_COUNTS.totalWarnings);
365
+ });
366
+ });
367
+
368
+ // ============================================================
369
+ // FILE COVERAGE VALIDATION
370
+ // ============================================================
371
+ describe("file coverage", () => {
372
+ it("should include all test files in output", () => {
373
+ for (const file of TEST_FILES) {
374
+ expect(vibeCheckOutput, `Output should include ${file}`).toContain(
375
+ file,
376
+ );
377
+ }
378
+ });
379
+
380
+ it("should include utils/calculate.ts in output", () => {
381
+ expect(vibeCheckOutput).toContain("calculate.ts");
382
+ });
383
+ });
384
+
385
+ // ============================================================
386
+ // CUSTOM PLUGIN VALIDATION
387
+ // ============================================================
388
+ describe("custom plugins", () => {
389
+ describe("oxlint-plugin-jsx-capitalization", () => {
390
+ it("should detect lowercase elements", () => {
391
+ expect(vibeCheckOutput).toContain(
392
+ "oxlint-plugin-jsx-capitalization(jsx-capitalization)",
393
+ );
394
+ });
395
+
396
+ it("should suggest platform-independent components", () => {
397
+ expect(vibeCheckOutput).toContain("instead of <div>");
398
+ expect(vibeCheckOutput).toContain("instead of <span>");
399
+ expect(vibeCheckOutput).toContain("instead of <button>");
400
+ expect(vibeCheckOutput).toContain("instead of <p>");
401
+ expect(vibeCheckOutput).toContain("instead of <h1>");
402
+ });
403
+
404
+ it("should suggest Link component for anchors", () => {
405
+ expect(vibeCheckOutput).toContain("Use platform-independent <Link>");
406
+ expect(vibeCheckOutput).toContain("next-vibe-ui/ui/link");
407
+ });
408
+
409
+ it("should have expected occurrence count", () => {
410
+ const count = countOccurrences(
411
+ vibeCheckOutput,
412
+ "oxlint-plugin-jsx-capitalization",
413
+ );
414
+ expect(count).toBeGreaterThanOrEqual(
415
+ EXPECTED_COUNTS.rules["oxlint-plugin-jsx-capitalization"],
416
+ );
417
+ });
418
+ });
419
+
420
+ describe("oxlint-plugin-i18n", () => {
421
+ it("should detect literal strings", () => {
422
+ expect(vibeCheckOutput).toContain(
423
+ "oxlint-plugin-i18n(no-literal-string)",
424
+ );
425
+ expect(vibeCheckOutput).toContain("should be translated");
426
+ });
427
+
428
+ it("should detect various literal string types", () => {
429
+ expect(vibeCheckOutput).toContain('Literal string "');
430
+ expect(vibeCheckOutput).toContain(
431
+ "in JSX attribute should be translated",
432
+ );
433
+ expect(vibeCheckOutput).toContain("should be translated using i18n");
434
+ });
435
+
436
+ it("should have expected occurrence count", () => {
437
+ const count = countOccurrences(vibeCheckOutput, "oxlint-plugin-i18n");
438
+ expect(count).toBeGreaterThanOrEqual(
439
+ EXPECTED_COUNTS.rules["oxlint-plugin-i18n"],
440
+ );
441
+ });
442
+ });
443
+
444
+ describe("oxlint-plugin-restricted", () => {
445
+ it("should detect unknown type usage", () => {
446
+ expect(vibeCheckOutput).toContain(
447
+ "oxlint-plugin-restricted(restricted-syntax)",
448
+ );
449
+ expect(vibeCheckOutput).toContain(
450
+ "Usage of the 'unknown' type isn't allowed",
451
+ );
452
+ });
453
+
454
+ it("should detect object type usage", () => {
455
+ expect(vibeCheckOutput).toContain(
456
+ "Usage of the 'object' type isn't allowed",
457
+ );
458
+ });
459
+
460
+ it("should detect throw statements", () => {
461
+ expect(vibeCheckOutput).toContain(
462
+ "Usage of 'throw' statements is not allowed",
463
+ );
464
+ });
465
+
466
+ it("should detect JSX in object literals", () => {
467
+ expect(vibeCheckOutput).toContain(
468
+ "JSX elements inside object literals are not allowed",
469
+ );
470
+ });
471
+
472
+ it("should have expected occurrence count", () => {
473
+ const count = countOccurrences(
474
+ vibeCheckOutput,
475
+ "oxlint-plugin-restricted",
476
+ );
477
+ expect(count).toBeGreaterThanOrEqual(
478
+ EXPECTED_COUNTS.rules["oxlint-plugin-restricted"],
479
+ );
480
+ });
481
+ });
482
+ });
483
+
484
+ // ============================================================
485
+ // ESLINT RULES VALIDATION
486
+ // ============================================================
487
+ describe("eslint rules", () => {
488
+ it("should detect no-debugger", () => {
489
+ expect(vibeCheckOutput).toContain("eslint(no-debugger)");
490
+ });
491
+
492
+ it("should detect no-console with expected count", () => {
493
+ const count = countOccurrences(vibeCheckOutput, "eslint(no-console)");
494
+ expect(count).toBeGreaterThanOrEqual(
495
+ EXPECTED_COUNTS.rules["eslint(no-console)"],
496
+ );
497
+ });
498
+
499
+ it("should detect curly violations", () => {
500
+ expect(vibeCheckOutput).toContain("eslint(curly)");
501
+ });
502
+
503
+ it("should detect eqeqeq violations", () => {
504
+ const count = countOccurrences(vibeCheckOutput, "eslint(eqeqeq)");
505
+ expect(count).toBeGreaterThanOrEqual(
506
+ EXPECTED_COUNTS.rules["eslint(eqeqeq)"],
507
+ );
508
+ });
509
+
510
+ it("should detect no-unused-vars", () => {
511
+ const count = countOccurrences(vibeCheckOutput, "eslint(no-unused-vars)");
512
+ expect(count).toBeGreaterThanOrEqual(
513
+ EXPECTED_COUNTS.rules["eslint(no-unused-vars)"],
514
+ );
515
+ });
516
+
517
+ it("should detect no-template-curly-in-string", () => {
518
+ expect(vibeCheckOutput).toContain("eslint(no-template-curly-in-string)");
519
+ });
520
+
521
+ it("should detect array-callback-return", () => {
522
+ expect(vibeCheckOutput).toContain("eslint(array-callback-return)");
523
+ });
524
+
525
+ it("should detect no-constructor-return", () => {
526
+ expect(vibeCheckOutput).toContain("eslint(no-constructor-return)");
527
+ });
528
+
529
+ it("should detect no-self-compare", () => {
530
+ expect(vibeCheckOutput).toContain("eslint(no-self-compare)");
531
+ });
532
+
533
+ it("should detect no-unused-private-class-members", () => {
534
+ expect(vibeCheckOutput).toContain(
535
+ "eslint(no-unused-private-class-members)",
536
+ );
537
+ });
538
+
539
+ it("should detect prefer-template", () => {
540
+ expect(vibeCheckOutput).toContain("eslint(prefer-template)");
541
+ });
542
+
543
+ it("should detect no-new", () => {
544
+ expect(vibeCheckOutput).toContain("eslint(no-new)");
545
+ });
546
+ });
547
+
548
+ // ============================================================
549
+ // TYPESCRIPT-ESLINT RULES VALIDATION
550
+ // ============================================================
551
+ describe("typescript-eslint rules", () => {
552
+ it("should detect no-explicit-any", () => {
553
+ const count = countOccurrences(
554
+ vibeCheckOutput,
555
+ "typescript-eslint(no-explicit-any)",
556
+ );
557
+ expect(count).toBeGreaterThanOrEqual(
558
+ EXPECTED_COUNTS.rules["typescript-eslint(no-explicit-any)"],
559
+ );
560
+ });
561
+
562
+ it("should detect no-inferrable-types", () => {
563
+ const count = countOccurrences(
564
+ vibeCheckOutput,
565
+ "typescript-eslint(no-inferrable-types)",
566
+ );
567
+ expect(count).toBeGreaterThanOrEqual(
568
+ EXPECTED_COUNTS.rules["typescript-eslint(no-inferrable-types)"],
569
+ );
570
+ });
571
+
572
+ it("should detect no-empty-function", () => {
573
+ expect(vibeCheckOutput).toContain("eslint(no-empty-function)");
574
+ });
575
+
576
+ it("should detect consistent-type-imports", () => {
577
+ expect(vibeCheckOutput).toContain(
578
+ "typescript-eslint(consistent-type-imports)",
579
+ );
580
+ });
581
+
582
+ it("should detect no-duplicate-enum-values", () => {
583
+ expect(vibeCheckOutput).toContain(
584
+ "typescript-eslint(no-duplicate-enum-values)",
585
+ );
586
+ });
587
+
588
+ it("should detect no-extra-non-null-assertion", () => {
589
+ const count = countOccurrences(
590
+ vibeCheckOutput,
591
+ "typescript-eslint(no-extra-non-null-assertion)",
592
+ );
593
+ expect(count).toBeGreaterThanOrEqual(
594
+ EXPECTED_COUNTS.rules["typescript-eslint(no-extra-non-null-assertion)"],
595
+ );
596
+ });
597
+
598
+ it("should detect explicit-function-return-type", () => {
599
+ expect(vibeCheckOutput).toContain(
600
+ "typescript-eslint(explicit-function-return-type)",
601
+ );
602
+ });
603
+ });
604
+
605
+ // ============================================================
606
+ // REACT RULES VALIDATION
607
+ // ============================================================
608
+ describe("react rules", () => {
609
+ it("should detect jsx-key", () => {
610
+ expect(vibeCheckOutput).toContain("eslint-plugin-react(jsx-key)");
611
+ });
612
+
613
+ it("should detect jsx-no-duplicate-props", () => {
614
+ expect(vibeCheckOutput).toContain(
615
+ "eslint-plugin-react(jsx-no-duplicate-props)",
616
+ );
617
+ });
618
+
619
+ it("should detect no-children-prop", () => {
620
+ expect(vibeCheckOutput).toContain(
621
+ "eslint-plugin-react(no-children-prop)",
622
+ );
623
+ });
624
+
625
+ it("should detect no-direct-mutation-state", () => {
626
+ expect(vibeCheckOutput).toContain(
627
+ "eslint-plugin-react(no-direct-mutation-state)",
628
+ );
629
+ });
630
+
631
+ it("should detect self-closing-comp", () => {
632
+ const count = countOccurrences(
633
+ vibeCheckOutput,
634
+ "eslint-plugin-react(self-closing-comp)",
635
+ );
636
+ expect(count).toBeGreaterThanOrEqual(
637
+ EXPECTED_COUNTS.rules["eslint-plugin-react(self-closing-comp)"],
638
+ );
639
+ });
640
+
641
+ it("should detect no-unknown-property", () => {
642
+ expect(vibeCheckOutput).toContain(
643
+ "eslint-plugin-react(no-unknown-property)",
644
+ );
645
+ });
646
+
647
+ it("should detect iframe-missing-sandbox", () => {
648
+ expect(vibeCheckOutput).toContain(
649
+ "eslint-plugin-react(iframe-missing-sandbox)",
650
+ );
651
+ });
652
+ });
653
+
654
+ // ============================================================
655
+ // REACT HOOKS RULES VALIDATION
656
+ // ============================================================
657
+ describe("react-hooks rules", () => {
658
+ it("should detect exhaustive-deps violations", () => {
659
+ const count = countOccurrences(
660
+ vibeCheckOutput,
661
+ "eslint-plugin-react-hooks(exhaustive-deps)",
662
+ );
663
+ expect(count).toBeGreaterThanOrEqual(
664
+ EXPECTED_COUNTS.rules["eslint-plugin-react-hooks(exhaustive-deps)"],
665
+ );
666
+ });
667
+
668
+ it("should mention missing dependencies", () => {
669
+ expect(vibeCheckOutput).toContain("missing dependency");
670
+ });
671
+ });
672
+
673
+ // ============================================================
674
+ // JSX-A11Y RULES VALIDATION
675
+ // ============================================================
676
+ describe("jsx-a11y rules", () => {
677
+ it("should detect alt-text", () => {
678
+ expect(vibeCheckOutput).toContain("eslint-plugin-jsx-a11y(alt-text)");
679
+ });
680
+
681
+ it("should detect anchor-has-content", () => {
682
+ expect(vibeCheckOutput).toContain(
683
+ "eslint-plugin-jsx-a11y(anchor-has-content)",
684
+ );
685
+ });
686
+
687
+ it("should detect click-events-have-key-events", () => {
688
+ const count = countOccurrences(
689
+ vibeCheckOutput,
690
+ "eslint-plugin-jsx-a11y(click-events-have-key-events)",
691
+ );
692
+ expect(count).toBeGreaterThanOrEqual(
693
+ EXPECTED_COUNTS.rules[
694
+ "eslint-plugin-jsx-a11y(click-events-have-key-events)"
695
+ ],
696
+ );
697
+ });
698
+
699
+ it("should detect heading-has-content", () => {
700
+ const count = countOccurrences(
701
+ vibeCheckOutput,
702
+ "eslint-plugin-jsx-a11y(heading-has-content)",
703
+ );
704
+ expect(count).toBeGreaterThanOrEqual(
705
+ EXPECTED_COUNTS.rules["eslint-plugin-jsx-a11y(heading-has-content)"],
706
+ );
707
+ });
708
+
709
+ it("should detect iframe-has-title", () => {
710
+ expect(vibeCheckOutput).toContain(
711
+ "eslint-plugin-jsx-a11y(iframe-has-title)",
712
+ );
713
+ });
714
+
715
+ it("should detect img-redundant-alt", () => {
716
+ const count = countOccurrences(
717
+ vibeCheckOutput,
718
+ "eslint-plugin-jsx-a11y(img-redundant-alt)",
719
+ );
720
+ expect(count).toBeGreaterThanOrEqual(
721
+ EXPECTED_COUNTS.rules["eslint-plugin-jsx-a11y(img-redundant-alt)"],
722
+ );
723
+ });
724
+
725
+ it("should detect no-access-key", () => {
726
+ expect(vibeCheckOutput).toContain(
727
+ "eslint-plugin-jsx-a11y(no-access-key)",
728
+ );
729
+ });
730
+
731
+ it("should detect no-autofocus", () => {
732
+ expect(vibeCheckOutput).toContain("eslint-plugin-jsx-a11y(no-autofocus)");
733
+ });
734
+
735
+ it("should detect no-distracting-elements", () => {
736
+ expect(vibeCheckOutput).toContain(
737
+ "eslint-plugin-jsx-a11y(no-distracting-elements)",
738
+ );
739
+ });
740
+
741
+ it("should detect no-redundant-roles", () => {
742
+ const count = countOccurrences(
743
+ vibeCheckOutput,
744
+ "eslint-plugin-jsx-a11y(no-redundant-roles)",
745
+ );
746
+ expect(count).toBeGreaterThanOrEqual(
747
+ EXPECTED_COUNTS.rules["eslint-plugin-jsx-a11y(no-redundant-roles)"],
748
+ );
749
+ });
750
+
751
+ it("should detect role-has-required-aria-props", () => {
752
+ const count = countOccurrences(
753
+ vibeCheckOutput,
754
+ "eslint-plugin-jsx-a11y(role-has-required-aria-props)",
755
+ );
756
+ expect(count).toBeGreaterThanOrEqual(
757
+ EXPECTED_COUNTS.rules[
758
+ "eslint-plugin-jsx-a11y(role-has-required-aria-props)"
759
+ ],
760
+ );
761
+ });
762
+
763
+ it("should detect tabindex-no-positive", () => {
764
+ expect(vibeCheckOutput).toContain(
765
+ "eslint-plugin-jsx-a11y(tabindex-no-positive)",
766
+ );
767
+ });
768
+
769
+ it("should detect aria-props violations", () => {
770
+ expect(vibeCheckOutput).toContain("eslint-plugin-jsx-a11y(aria-props)");
771
+ });
772
+
773
+ it("should detect aria-role violations", () => {
774
+ expect(vibeCheckOutput).toContain("eslint-plugin-jsx-a11y(aria-role)");
775
+ });
776
+
777
+ it("should detect label-has-associated-control", () => {
778
+ expect(vibeCheckOutput).toContain(
779
+ "eslint-plugin-jsx-a11y(label-has-associated-control)",
780
+ );
781
+ });
782
+
783
+ it("should detect html-has-lang", () => {
784
+ const count = countOccurrences(
785
+ vibeCheckOutput,
786
+ "eslint-plugin-jsx-a11y(html-has-lang)",
787
+ );
788
+ expect(count).toBeGreaterThanOrEqual(
789
+ EXPECTED_COUNTS.rules["eslint-plugin-jsx-a11y(html-has-lang)"],
790
+ );
791
+ });
792
+
793
+ it("should detect prefer-tag-over-role", () => {
794
+ expect(vibeCheckOutput).toContain(
795
+ "eslint-plugin-jsx-a11y(prefer-tag-over-role)",
796
+ );
797
+ });
798
+
799
+ it("should detect anchor-is-valid", () => {
800
+ expect(vibeCheckOutput).toContain(
801
+ "eslint-plugin-jsx-a11y(anchor-is-valid)",
802
+ );
803
+ });
804
+ });
805
+
806
+ // ============================================================
807
+ // NEXT.JS RULES VALIDATION
808
+ // ============================================================
809
+ describe("nextjs rules", () => {
810
+ it("should detect no-img-element (warning)", () => {
811
+ const count = countOccurrences(
812
+ vibeCheckOutput,
813
+ "eslint-plugin-next(no-img-element)",
814
+ );
815
+ expect(count).toBeGreaterThanOrEqual(
816
+ EXPECTED_COUNTS.rules["eslint-plugin-next(no-img-element)"],
817
+ );
818
+ });
819
+
820
+ it("should detect no-html-link-for-pages", () => {
821
+ const count = countOccurrences(
822
+ vibeCheckOutput,
823
+ "eslint-plugin-next(no-html-link-for-pages)",
824
+ );
825
+ expect(count).toBeGreaterThanOrEqual(
826
+ EXPECTED_COUNTS.rules["eslint-plugin-next(no-html-link-for-pages)"],
827
+ );
828
+ });
829
+
830
+ it("should detect no-sync-scripts", () => {
831
+ expect(vibeCheckOutput).toContain("eslint-plugin-next(no-sync-scripts)");
832
+ });
833
+
834
+ it("should detect no-css-tags", () => {
835
+ expect(vibeCheckOutput).toContain("eslint-plugin-next(no-css-tags)");
836
+ });
837
+
838
+ it("should detect google-font-display", () => {
839
+ expect(vibeCheckOutput).toContain(
840
+ "eslint-plugin-next(google-font-display)",
841
+ );
842
+ });
843
+
844
+ it("should detect no-page-custom-font", () => {
845
+ const count = countOccurrences(
846
+ vibeCheckOutput,
847
+ "eslint-plugin-next(no-page-custom-font)",
848
+ );
849
+ expect(count).toBeGreaterThanOrEqual(
850
+ EXPECTED_COUNTS.rules["eslint-plugin-next(no-page-custom-font)"],
851
+ );
852
+ });
853
+
854
+ // Note: no-title-in-document-head rule is not being triggered by current test files
855
+ });
856
+
857
+ // ============================================================
858
+ // PROMISE RULES VALIDATION
859
+ // ============================================================
860
+ describe("promise rules", () => {
861
+ it("should detect param-names", () => {
862
+ const count = countOccurrences(
863
+ vibeCheckOutput,
864
+ "eslint-plugin-promise(param-names)",
865
+ );
866
+ expect(count).toBeGreaterThanOrEqual(
867
+ EXPECTED_COUNTS.rules["eslint-plugin-promise(param-names)"],
868
+ );
869
+ });
870
+
871
+ it("should detect always-return", () => {
872
+ const count = countOccurrences(
873
+ vibeCheckOutput,
874
+ "eslint-plugin-promise(always-return)",
875
+ );
876
+ expect(count).toBeGreaterThanOrEqual(
877
+ EXPECTED_COUNTS.rules["eslint-plugin-promise(always-return)"],
878
+ );
879
+ });
880
+
881
+ it("should detect catch-or-return", () => {
882
+ const count = countOccurrences(
883
+ vibeCheckOutput,
884
+ "eslint-plugin-promise(catch-or-return)",
885
+ );
886
+ expect(count).toBeGreaterThanOrEqual(
887
+ EXPECTED_COUNTS.rules["eslint-plugin-promise(catch-or-return)"],
888
+ );
889
+ });
890
+ });
891
+
892
+ // ============================================================
893
+ // UNICORN RULES VALIDATION
894
+ // ============================================================
895
+ describe("unicorn rules", () => {
896
+ it("should detect no-new-array", () => {
897
+ expect(vibeCheckOutput).toContain("eslint-plugin-unicorn(no-new-array)");
898
+ });
899
+
900
+ it("should detect prefer-spread", () => {
901
+ expect(vibeCheckOutput).toContain("eslint-plugin-unicorn(prefer-spread)");
902
+ });
903
+
904
+ it("should detect prefer-array-flat", () => {
905
+ expect(vibeCheckOutput).toContain(
906
+ "eslint-plugin-unicorn(prefer-array-flat)",
907
+ );
908
+ });
909
+
910
+ it("should detect prefer-includes", () => {
911
+ expect(vibeCheckOutput).toContain(
912
+ "eslint-plugin-unicorn(prefer-includes)",
913
+ );
914
+ });
915
+
916
+ it("should detect no-await-in-promise-methods", () => {
917
+ const count = countOccurrences(
918
+ vibeCheckOutput,
919
+ "eslint-plugin-unicorn(no-await-in-promise-methods)",
920
+ );
921
+ expect(count).toBeGreaterThanOrEqual(
922
+ EXPECTED_COUNTS.rules[
923
+ "eslint-plugin-unicorn(no-await-in-promise-methods)"
924
+ ],
925
+ );
926
+ });
927
+
928
+ it("should detect no-single-promise-in-promise-methods", () => {
929
+ expect(vibeCheckOutput).toContain(
930
+ "eslint-plugin-unicorn(no-single-promise-in-promise-methods)",
931
+ );
932
+ });
933
+ });
934
+
935
+ // ============================================================
936
+ // OXC RULES VALIDATION
937
+ // ============================================================
938
+ describe("oxc rules", () => {
939
+ it("should detect missing-throw", () => {
940
+ expect(vibeCheckOutput).toContain("oxc(missing-throw)");
941
+ });
942
+
943
+ it("should detect bad-comparison-sequence", () => {
944
+ expect(vibeCheckOutput).toContain("oxc(bad-comparison-sequence)");
945
+ });
946
+
947
+ it("should detect const-comparisons", () => {
948
+ expect(vibeCheckOutput).toContain("oxc(const-comparisons)");
949
+ });
950
+ });
951
+
952
+ // ============================================================
953
+ // TYPESCRIPT COMPILER ERROR VALIDATION
954
+ // ============================================================
955
+ describe("typescript compiler errors", () => {
956
+ it("should detect Property does not exist errors", () => {
957
+ expect(vibeCheckOutput).toContain(
958
+ "Property 'marquee' does not exist on type 'JSX.IntrinsicElements'",
959
+ );
960
+ });
961
+
962
+ it("should detect read-only property assignment errors", () => {
963
+ expect(vibeCheckOutput).toContain(
964
+ "Cannot assign to 'count' because it is a read-only property",
965
+ );
966
+ });
967
+
968
+ it("should detect type assignment errors", () => {
969
+ expect(vibeCheckOutput).toContain("is not assignable to type");
970
+ });
971
+
972
+ it("should detect condition always true errors", () => {
973
+ expect(vibeCheckOutput).toContain(
974
+ "This condition will always return true",
975
+ );
976
+ });
977
+ });
978
+
979
+ // ============================================================
980
+ // COMPREHENSIVE RULE COUNT VALIDATION
981
+ // ============================================================
982
+ describe("rule count validation", () => {
983
+ const highVolumeRules = [
984
+ { name: "oxlint-plugin-jsx-capitalization", min: 100 },
985
+ { name: "oxlint-plugin-i18n", min: 50 },
986
+ { name: "eslint(no-console)", min: 8 },
987
+ { name: "eslint(no-unused-vars)", min: 5 },
988
+ { name: "eslint-plugin-react(self-closing-comp)", min: 4 },
989
+ { name: "eslint-plugin-jsx-a11y(click-events-have-key-events)", min: 4 },
990
+ { name: "eslint-plugin-next(no-img-element)", min: 4 },
991
+ { name: "eslint-plugin-next(no-html-link-for-pages)", min: 4 },
992
+ ];
993
+
994
+ for (const rule of highVolumeRules) {
995
+ it(`should have at least ${rule.min} occurrences of ${rule.name}`, () => {
996
+ const count = countOccurrences(vibeCheckOutput, rule.name);
997
+ expect(count).toBeGreaterThanOrEqual(rule.min);
998
+ });
999
+ }
1000
+ });
1001
+ });
1002
+
1003
+ // ============================================================
1004
+ // COMPILED RUNTIME TESTS
1005
+ // ============================================================
1006
+ describe("Compiled Runtime Tests", () => {
1007
+ const COMPILED_RUNTIME = resolve(ROOT_PATH, ".dist/bin/vibe-runtime.js");
1008
+ let compiledOutput: string;
1009
+
1010
+ beforeAll(() => {
1011
+ if (!existsSync(COMPILED_RUNTIME)) {
1012
+ compiledOutput =
1013
+ "SKIP: Compiled runtime not found - run 'bun vibe builder' first";
1014
+ return;
1015
+ }
1016
+
1017
+ try {
1018
+ compiledOutput = execSync(
1019
+ `cd "${TEST_PROJECT_PATH}" && bun "${COMPILED_RUNTIME}" check ./ 2>&1`,
1020
+ { encoding: "utf-8", timeout: 120000 },
1021
+ );
1022
+ } catch (error) {
1023
+ const execError = error as { stdout?: string; stderr?: string };
1024
+ compiledOutput = (execError.stdout || "") + (execError.stderr || "");
1025
+ }
1026
+ });
1027
+
1028
+ it("should detect errors when using compiled runtime", () => {
1029
+ if (compiledOutput.includes("SKIP:")) {
1030
+ return;
1031
+ }
1032
+ expect(compiledOutput).toContain("error");
1033
+ });
1034
+
1035
+ it("should detect custom plugin errors with compiled runtime", () => {
1036
+ if (compiledOutput.includes("SKIP:")) {
1037
+ return;
1038
+ }
1039
+ expect(compiledOutput).toContain("oxlint-plugin-jsx-capitalization");
1040
+ expect(compiledOutput).toContain("oxlint-plugin-i18n");
1041
+ expect(compiledOutput).toContain("oxlint-plugin-restricted");
1042
+ });
1043
+
1044
+ it("should complete TypeScript check with compiled runtime", () => {
1045
+ if (compiledOutput.includes("SKIP:")) {
1046
+ return;
1047
+ }
1048
+ expect(compiledOutput).toContain("TypeScript check completed");
1049
+ });
1050
+
1051
+ it("should produce similar summary to bun runtime", () => {
1052
+ if (compiledOutput.includes("SKIP:")) {
1053
+ return;
1054
+ }
1055
+ const summary = extractSummary(compiledOutput);
1056
+ // Allow some variance - compiled runtime may detect fewer TypeScript errors
1057
+ // Bun runtime: 319 issues, compiled runtime: ~309 issues (10 fewer due to tsc differences)
1058
+ expect(summary.files).toBe(EXPECTED_COUNTS.totalFiles);
1059
+ expect(summary.issues).toBeGreaterThanOrEqual(
1060
+ EXPECTED_COUNTS.totalIssues - 15,
1061
+ );
1062
+ expect(summary.issues).toBeLessThanOrEqual(EXPECTED_COUNTS.totalIssues + 5);
1063
+ });
1064
+ });
1065
+
1066
+ // ============================================================
1067
+ // MULTI-DIRECTORY TESTS
1068
+ // ============================================================
1069
+ describe("Multi-Directory Tests", () => {
1070
+ describe("running from test-project directory", () => {
1071
+ let fromTestProjectOutput: string;
1072
+
1073
+ beforeAll(() => {
1074
+ try {
1075
+ fromTestProjectOutput = execSync(
1076
+ `cd "${TEST_PROJECT_PATH}" && bun "${resolve(ROOT_PATH, "src/app/api/[locale]/system/unified-interface/cli/vibe-runtime.ts")}" check ./ 2>&1`,
1077
+ { encoding: "utf-8", timeout: 120000 },
1078
+ );
1079
+ } catch (error) {
1080
+ const execError = error as { stdout?: string; stderr?: string };
1081
+ fromTestProjectOutput =
1082
+ (execError.stdout || "") + (execError.stderr || "");
1083
+ }
1084
+ });
1085
+
1086
+ it("should find all plugin errors when running from test-project", () => {
1087
+ expect(fromTestProjectOutput).toContain(
1088
+ "oxlint-plugin-jsx-capitalization",
1089
+ );
1090
+ expect(fromTestProjectOutput).toContain("oxlint-plugin-i18n");
1091
+ expect(fromTestProjectOutput).toContain("oxlint-plugin-restricted");
1092
+ });
1093
+
1094
+ it("should complete TypeScript check when running from test-project", () => {
1095
+ expect(fromTestProjectOutput).toContain("TypeScript check completed");
1096
+ });
1097
+
1098
+ it("should detect TypeScript compiler errors when running from test-project", () => {
1099
+ expect(fromTestProjectOutput).toContain(
1100
+ "Property 'marquee' does not exist",
1101
+ );
1102
+ });
1103
+
1104
+ it("should find all test files when running from test-project", () => {
1105
+ for (const file of TEST_FILES) {
1106
+ expect(fromTestProjectOutput).toContain(file);
1107
+ }
1108
+ });
1109
+
1110
+ it("should have correct summary when running from test-project", () => {
1111
+ const summary = extractSummary(fromTestProjectOutput);
1112
+ expect(summary.files).toBe(EXPECTED_COUNTS.totalFiles);
1113
+ expect(summary.issues).toBe(EXPECTED_COUNTS.totalIssues);
1114
+ });
1115
+ });
1116
+
1117
+ describe("running from project root", () => {
1118
+ let fromRootOutput: string;
1119
+
1120
+ beforeAll(() => {
1121
+ try {
1122
+ fromRootOutput = execSync(
1123
+ `cd "${ROOT_PATH}" && bun src/app/api/[locale]/system/unified-interface/cli/vibe-runtime.ts check "src/app/api/[locale]/system/check/test-project" 2>&1`,
1124
+ { encoding: "utf-8", timeout: 120000 },
1125
+ );
1126
+ } catch (error) {
1127
+ const execError = error as { stdout?: string; stderr?: string };
1128
+ fromRootOutput = (execError.stdout || "") + (execError.stderr || "");
1129
+ }
1130
+ });
1131
+
1132
+ it("should respect ignore patterns when running from project root", () => {
1133
+ // When running from project root, test-project is in ignores
1134
+ // so it should either find no issues or very few
1135
+ const hasMinimalIssues =
1136
+ fromRootOutput.includes("Keine Codequalitätsprobleme") ||
1137
+ fromRootOutput.includes("No code quality issues") ||
1138
+ fromRootOutput.includes("true");
1139
+ expect(hasMinimalIssues).toBe(true);
1140
+ });
1141
+ });
1142
+ });