tutanus 0.12.2 → 0.12.4

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 (309) hide show
  1. package/README.md +7 -7
  2. package/dist/analysts/converters/converter-base.js.map +1 -1
  3. package/dist/analysts/converters/engines/converter-gha-to-gitlab.js.map +1 -1
  4. package/dist/analysts/converters/index.js.map +1 -1
  5. package/dist/analysts/corrections/map-reversion.js +2 -2
  6. package/dist/analysts/corrections/map-reversion.js.map +1 -1
  7. package/dist/analysts/corrections/pruning.js +3 -3
  8. package/dist/analysts/corrections/pruning.js.map +1 -1
  9. package/dist/analysts/detectors/detector-recommendation-architecture.js +2 -2
  10. package/dist/analysts/detectors/detector-recommendation-architecture.js.map +1 -1
  11. package/dist/analysts/github-actions/detectors/org-verified.js.map +1 -1
  12. package/dist/analysts/github-actions/reports/generator-report-github-actions.js +4 -4
  13. package/dist/analysts/github-actions/reports/generator-report-github-actions.js.map +1 -1
  14. package/dist/analysts/js-ts/detectors/detector-context-smart.js +10 -10
  15. package/dist/analysts/js-ts/detectors/detector-context-smart.js.map +1 -1
  16. package/dist/analysts/js-ts/detectors/detector-types-unsafe.js +3 -3
  17. package/dist/analysts/js-ts/detectors/detector-types-unsafe.js.map +1 -1
  18. package/dist/analysts/plugins/detector-documentation.js.map +1 -1
  19. package/dist/analysts/plugins/index.js.map +1 -1
  20. package/dist/analysts/scorers/scorer.js +67 -67
  21. package/dist/analysts/scorers/scorer.js.map +1 -1
  22. package/dist/app/github/app/repo-downloader.d.ts +2 -0
  23. package/dist/app/github/app/repo-downloader.d.ts.map +1 -1
  24. package/dist/app/github/app/repo-downloader.js +2 -2
  25. package/dist/app/github/app/repo-downloader.js.map +1 -1
  26. package/dist/app/github/jobs/auto-fix-job.d.ts.map +1 -1
  27. package/dist/app/github/jobs/auto-fix-job.js +19 -3
  28. package/dist/app/github/jobs/auto-fix-job.js.map +1 -1
  29. package/dist/app/github/push-analysis/push-analysis-service.d.ts.map +1 -1
  30. package/dist/app/github/push-analysis/push-analysis-service.js +19 -7
  31. package/dist/app/github/push-analysis/push-analysis-service.js.map +1 -1
  32. package/dist/app/github/push-analysis/push-report.js +2 -2
  33. package/dist/app/github/push-analysis/push-report.js.map +1 -1
  34. package/dist/bin/index.d.ts.map +1 -1
  35. package/dist/bin/index.js +5 -0
  36. package/dist/bin/index.js.map +1 -1
  37. package/dist/cli/commands/command-azure.js +1 -1
  38. package/dist/cli/commands/command-azure.js.map +1 -1
  39. package/dist/cli/commands/command-circleci.js +1 -1
  40. package/dist/cli/commands/command-circleci.js.map +1 -1
  41. package/dist/cli/commands/command-convert.js.map +1 -1
  42. package/dist/cli/commands/command-github-actions.js +1 -1
  43. package/dist/cli/commands/command-github-actions.js.map +1 -1
  44. package/dist/cli/commands/command-gitlab-ci.js +1 -1
  45. package/dist/cli/commands/command-gitlab-ci.js.map +1 -1
  46. package/dist/cli/commands/command-jenkins.js +1 -1
  47. package/dist/cli/commands/command-jenkins.js.map +1 -1
  48. package/dist/cli/diagnostic/exporters/compliance-exporter.js +2 -2
  49. package/dist/cli/diagnostic/exporters/compliance-exporter.js.map +1 -1
  50. package/dist/cli/diagnostic/exporters/markdown-exporter.js +7 -7
  51. package/dist/cli/diagnostic/exporters/markdown-exporter.js.map +1 -1
  52. package/dist/cli/diagnostic/handlers/archetype-handler.js.map +1 -1
  53. package/dist/cli/diagnostic/handlers/guardian-handler.js.map +1 -1
  54. package/dist/cli/diagnostic/processing-diagnostic.d.ts.map +1 -1
  55. package/dist/cli/diagnostic/processing-diagnostic.js +2 -3
  56. package/dist/cli/diagnostic/processing-diagnostic.js.map +1 -1
  57. package/dist/core/config/auto/fix-config.js.map +1 -1
  58. package/dist/core/execution/executor.js +4 -4
  59. package/dist/core/execution/executor.js.map +1 -1
  60. package/dist/core/execution/inquisitor.js +6 -6
  61. package/dist/core/execution/inquisitor.js.map +1 -1
  62. package/dist/core/execution/scanner.js.map +1 -1
  63. package/dist/core/messages/en/analysts/archetypes-extra-messages.d.ts +2 -2
  64. package/dist/core/messages/en/analysts/archetypes-extra-messages.js +2 -2
  65. package/dist/core/messages/en/analysts/archetypes-extra-messages.js.map +1 -1
  66. package/dist/core/messages/en/analysts/detector-clean-arch-messages.d.ts +4 -4
  67. package/dist/core/messages/en/analysts/detector-clean-arch-messages.js +4 -4
  68. package/dist/core/messages/en/analysts/detector-clean-arch-messages.js.map +1 -1
  69. package/dist/core/messages/en/analysts/detector-js-ts-messages.d.ts +2 -2
  70. package/dist/core/messages/en/analysts/detector-js-ts-messages.js +2 -2
  71. package/dist/core/messages/en/analysts/detector-js-ts-messages.js.map +1 -1
  72. package/dist/core/messages/en/analysts/map-reversion-extra-messages.d.ts +6 -6
  73. package/dist/core/messages/en/analysts/map-reversion-extra-messages.js +6 -6
  74. package/dist/core/messages/en/analysts/map-reversion-extra-messages.js.map +1 -1
  75. package/dist/core/messages/en/analysts/report-github-actions-messages.d.ts +2 -2
  76. package/dist/core/messages/en/analysts/report-github-actions-messages.js +2 -2
  77. package/dist/core/messages/en/analysts/report-github-actions-messages.js.map +1 -1
  78. package/dist/core/messages/en/analysts/scorer-messages.d.ts +45 -45
  79. package/dist/core/messages/en/analysts/scorer-messages.js +49 -49
  80. package/dist/core/messages/en/analysts/scorer-messages.js.map +1 -1
  81. package/dist/core/messages/en/cli/cli-command-convert-messages.d.ts +1 -1
  82. package/dist/core/messages/en/cli/cli-command-convert-messages.js +1 -1
  83. package/dist/core/messages/en/cli/cli-command-convert-messages.js.map +1 -1
  84. package/dist/core/messages/en/cli/cli-command-format-messages.d.ts +1 -1
  85. package/dist/core/messages/en/cli/cli-command-format-messages.js +1 -1
  86. package/dist/core/messages/en/cli/cli-command-format-messages.js.map +1 -1
  87. package/dist/core/messages/en/cli/cli-command-github-actions-messages.d.ts +1 -1
  88. package/dist/core/messages/en/cli/cli-command-github-actions-messages.js +4 -4
  89. package/dist/core/messages/en/cli/cli-command-github-actions-messages.js.map +1 -1
  90. package/dist/core/messages/en/cli/cli-command-update-messages.d.ts +2 -2
  91. package/dist/core/messages/en/cli/cli-command-update-messages.js +2 -2
  92. package/dist/core/messages/en/cli/cli-command-update-messages.js.map +1 -1
  93. package/dist/core/messages/en/cli/cli-flags-validator-messages.d.ts +3 -3
  94. package/dist/core/messages/en/cli/cli-flags-validator-messages.js +3 -3
  95. package/dist/core/messages/en/cli/cli-flags-validator-messages.js.map +1 -1
  96. package/dist/core/messages/en/core/correcoes-messages.js +2 -2
  97. package/dist/core/messages/en/core/correcoes-messages.js.map +1 -1
  98. package/dist/core/messages/en/core/inquisitor-extra-messages.d.ts +2 -2
  99. package/dist/core/messages/en/core/inquisitor-extra-messages.js +2 -2
  100. package/dist/core/messages/en/core/inquisitor-extra-messages.js.map +1 -1
  101. package/dist/core/messages/en/core/parser-extra-messages.d.ts +3 -3
  102. package/dist/core/messages/en/core/parser-extra-messages.js +3 -3
  103. package/dist/core/messages/en/core/parser-extra-messages.js.map +1 -1
  104. package/dist/core/messages/en/guardian/guardian-messages.d.ts +2 -2
  105. package/dist/core/messages/en/guardian/guardian-messages.js +2 -2
  106. package/dist/core/messages/en/guardian/guardian-messages.js.map +1 -1
  107. package/dist/core/messages/en/guardian/watcher-hidden-messages.d.ts +2 -2
  108. package/dist/core/messages/en/guardian/watcher-hidden-messages.js +2 -2
  109. package/dist/core/messages/en/guardian/watcher-hidden-messages.js.map +1 -1
  110. package/dist/core/messages/en/log/log-helper.js.map +1 -1
  111. package/dist/core/messages/en/reports/report-async-patterns-messages.d.ts +3 -3
  112. package/dist/core/messages/en/reports/report-async-patterns-messages.js +3 -3
  113. package/dist/core/messages/en/reports/report-async-patterns-messages.js.map +1 -1
  114. package/dist/core/messages/en/shared/plugin-core-messages.d.ts +2 -2
  115. package/dist/core/messages/en/shared/plugin-core-messages.js +2 -2
  116. package/dist/core/messages/en/shared/plugin-core-messages.js.map +1 -1
  117. package/dist/core/messages/en/shared/plugin-registry-messages.d.ts +4 -4
  118. package/dist/core/messages/en/shared/plugin-registry-messages.js +4 -4
  119. package/dist/core/messages/en/shared/plugin-registry-messages.js.map +1 -1
  120. package/dist/core/messages/ja/analysts/archetypes-extra-messages.d.ts +2 -2
  121. package/dist/core/messages/ja/analysts/archetypes-extra-messages.js +2 -2
  122. package/dist/core/messages/ja/analysts/archetypes-extra-messages.js.map +1 -1
  123. package/dist/core/messages/ja/analysts/detector-clean-arch-messages.d.ts +4 -4
  124. package/dist/core/messages/ja/analysts/detector-clean-arch-messages.js +4 -4
  125. package/dist/core/messages/ja/analysts/detector-clean-arch-messages.js.map +1 -1
  126. package/dist/core/messages/ja/analysts/detector-js-ts-messages.d.ts +2 -2
  127. package/dist/core/messages/ja/analysts/detector-js-ts-messages.js +2 -2
  128. package/dist/core/messages/ja/analysts/detector-js-ts-messages.js.map +1 -1
  129. package/dist/core/messages/ja/analysts/map-reversion-extra-messages.d.ts +6 -6
  130. package/dist/core/messages/ja/analysts/map-reversion-extra-messages.js +6 -6
  131. package/dist/core/messages/ja/analysts/map-reversion-extra-messages.js.map +1 -1
  132. package/dist/core/messages/ja/analysts/report-github-actions-messages.d.ts +2 -2
  133. package/dist/core/messages/ja/analysts/report-github-actions-messages.js +2 -2
  134. package/dist/core/messages/ja/analysts/report-github-actions-messages.js.map +1 -1
  135. package/dist/core/messages/ja/analysts/scorer-messages.d.ts +45 -45
  136. package/dist/core/messages/ja/analysts/scorer-messages.js +49 -49
  137. package/dist/core/messages/ja/analysts/scorer-messages.js.map +1 -1
  138. package/dist/core/messages/ja/cli/cli-command-analysts-messages.d.ts +2 -2
  139. package/dist/core/messages/ja/cli/cli-command-analysts-messages.js +2 -2
  140. package/dist/core/messages/ja/cli/cli-command-analysts-messages.js.map +1 -1
  141. package/dist/core/messages/ja/cli/cli-command-convert-messages.d.ts +1 -1
  142. package/dist/core/messages/ja/cli/cli-command-convert-messages.js +1 -1
  143. package/dist/core/messages/ja/cli/cli-command-convert-messages.js.map +1 -1
  144. package/dist/core/messages/ja/cli/cli-command-format-messages.d.ts +1 -1
  145. package/dist/core/messages/ja/cli/cli-command-format-messages.js +1 -1
  146. package/dist/core/messages/ja/cli/cli-command-format-messages.js.map +1 -1
  147. package/dist/core/messages/ja/cli/cli-command-github-actions-messages.d.ts +1 -1
  148. package/dist/core/messages/ja/cli/cli-command-github-actions-messages.js +4 -4
  149. package/dist/core/messages/ja/cli/cli-command-github-actions-messages.js.map +1 -1
  150. package/dist/core/messages/ja/cli/cli-command-update-messages.d.ts +2 -2
  151. package/dist/core/messages/ja/cli/cli-command-update-messages.js +2 -2
  152. package/dist/core/messages/ja/cli/cli-command-update-messages.js.map +1 -1
  153. package/dist/core/messages/ja/cli/cli-flags-validator-messages.d.ts +3 -3
  154. package/dist/core/messages/ja/cli/cli-flags-validator-messages.js +3 -3
  155. package/dist/core/messages/ja/cli/cli-flags-validator-messages.js.map +1 -1
  156. package/dist/core/messages/ja/core/correcoes-messages.js +2 -2
  157. package/dist/core/messages/ja/core/correcoes-messages.js.map +1 -1
  158. package/dist/core/messages/ja/core/inquisitor-extra-messages.d.ts +2 -2
  159. package/dist/core/messages/ja/core/inquisitor-extra-messages.js +2 -2
  160. package/dist/core/messages/ja/core/inquisitor-extra-messages.js.map +1 -1
  161. package/dist/core/messages/ja/core/parser-extra-messages.d.ts +3 -3
  162. package/dist/core/messages/ja/core/parser-extra-messages.js +3 -3
  163. package/dist/core/messages/ja/core/parser-extra-messages.js.map +1 -1
  164. package/dist/core/messages/ja/guardian/guardian-messages.d.ts +2 -2
  165. package/dist/core/messages/ja/guardian/guardian-messages.js +2 -2
  166. package/dist/core/messages/ja/guardian/guardian-messages.js.map +1 -1
  167. package/dist/core/messages/ja/guardian/watcher-hidden-messages.d.ts +2 -2
  168. package/dist/core/messages/ja/guardian/watcher-hidden-messages.js +2 -2
  169. package/dist/core/messages/ja/guardian/watcher-hidden-messages.js.map +1 -1
  170. package/dist/core/messages/ja/log/log-helper.js.map +1 -1
  171. package/dist/core/messages/ja/reports/report-async-patterns-messages.d.ts +3 -3
  172. package/dist/core/messages/ja/reports/report-async-patterns-messages.js +3 -3
  173. package/dist/core/messages/ja/reports/report-async-patterns-messages.js.map +1 -1
  174. package/dist/core/messages/ja/shared/plugin-core-messages.d.ts +2 -2
  175. package/dist/core/messages/ja/shared/plugin-core-messages.js +2 -2
  176. package/dist/core/messages/ja/shared/plugin-core-messages.js.map +1 -1
  177. package/dist/core/messages/ja/shared/plugin-registry-messages.d.ts +4 -4
  178. package/dist/core/messages/ja/shared/plugin-registry-messages.js +4 -4
  179. package/dist/core/messages/ja/shared/plugin-registry-messages.js.map +1 -1
  180. package/dist/core/messages/pt/analysts/archetypes-extra-messages.d.ts +2 -2
  181. package/dist/core/messages/pt/analysts/archetypes-extra-messages.js +2 -2
  182. package/dist/core/messages/pt/analysts/archetypes-extra-messages.js.map +1 -1
  183. package/dist/core/messages/pt/analysts/detector-clean-arch-messages.d.ts +4 -4
  184. package/dist/core/messages/pt/analysts/detector-clean-arch-messages.js +4 -4
  185. package/dist/core/messages/pt/analysts/detector-clean-arch-messages.js.map +1 -1
  186. package/dist/core/messages/pt/analysts/detector-js-ts-messages.d.ts +2 -2
  187. package/dist/core/messages/pt/analysts/detector-js-ts-messages.js +2 -2
  188. package/dist/core/messages/pt/analysts/detector-js-ts-messages.js.map +1 -1
  189. package/dist/core/messages/pt/analysts/map-reversion-extra-messages.d.ts +6 -6
  190. package/dist/core/messages/pt/analysts/map-reversion-extra-messages.js +6 -6
  191. package/dist/core/messages/pt/analysts/map-reversion-extra-messages.js.map +1 -1
  192. package/dist/core/messages/pt/analysts/report-github-actions-messages.d.ts +2 -2
  193. package/dist/core/messages/pt/analysts/report-github-actions-messages.js +2 -2
  194. package/dist/core/messages/pt/analysts/report-github-actions-messages.js.map +1 -1
  195. package/dist/core/messages/pt/analysts/scorer-messages.d.ts +45 -45
  196. package/dist/core/messages/pt/analysts/scorer-messages.js +49 -49
  197. package/dist/core/messages/pt/analysts/scorer-messages.js.map +1 -1
  198. package/dist/core/messages/pt/cli/cli-command-convert-messages.d.ts +1 -1
  199. package/dist/core/messages/pt/cli/cli-command-convert-messages.js +1 -1
  200. package/dist/core/messages/pt/cli/cli-command-convert-messages.js.map +1 -1
  201. package/dist/core/messages/pt/cli/cli-command-format-messages.d.ts +1 -1
  202. package/dist/core/messages/pt/cli/cli-command-format-messages.js +1 -1
  203. package/dist/core/messages/pt/cli/cli-command-format-messages.js.map +1 -1
  204. package/dist/core/messages/pt/cli/cli-command-github-actions-messages.d.ts +1 -1
  205. package/dist/core/messages/pt/cli/cli-command-github-actions-messages.js +4 -4
  206. package/dist/core/messages/pt/cli/cli-command-github-actions-messages.js.map +1 -1
  207. package/dist/core/messages/pt/cli/cli-command-update-messages.d.ts +2 -2
  208. package/dist/core/messages/pt/cli/cli-command-update-messages.js +2 -2
  209. package/dist/core/messages/pt/cli/cli-command-update-messages.js.map +1 -1
  210. package/dist/core/messages/pt/cli/cli-flags-validator-messages.d.ts +3 -3
  211. package/dist/core/messages/pt/cli/cli-flags-validator-messages.js +3 -3
  212. package/dist/core/messages/pt/cli/cli-flags-validator-messages.js.map +1 -1
  213. package/dist/core/messages/pt/core/correcoes-messages.js +2 -2
  214. package/dist/core/messages/pt/core/correcoes-messages.js.map +1 -1
  215. package/dist/core/messages/pt/core/inquisitor-extra-messages.d.ts +2 -2
  216. package/dist/core/messages/pt/core/inquisitor-extra-messages.js +2 -2
  217. package/dist/core/messages/pt/core/inquisitor-extra-messages.js.map +1 -1
  218. package/dist/core/messages/pt/core/parser-extra-messages.d.ts +3 -3
  219. package/dist/core/messages/pt/core/parser-extra-messages.js +3 -3
  220. package/dist/core/messages/pt/core/parser-extra-messages.js.map +1 -1
  221. package/dist/core/messages/pt/guardian/guardian-messages.d.ts +2 -2
  222. package/dist/core/messages/pt/guardian/guardian-messages.js +2 -2
  223. package/dist/core/messages/pt/guardian/guardian-messages.js.map +1 -1
  224. package/dist/core/messages/pt/guardian/watcher-hidden-messages.d.ts +2 -2
  225. package/dist/core/messages/pt/guardian/watcher-hidden-messages.js +2 -2
  226. package/dist/core/messages/pt/guardian/watcher-hidden-messages.js.map +1 -1
  227. package/dist/core/messages/pt/log/log-helper.js.map +1 -1
  228. package/dist/core/messages/pt/reports/report-async-patterns-messages.d.ts +3 -3
  229. package/dist/core/messages/pt/reports/report-async-patterns-messages.js +3 -3
  230. package/dist/core/messages/pt/reports/report-async-patterns-messages.js.map +1 -1
  231. package/dist/core/messages/pt/shared/plugin-core-messages.d.ts +2 -2
  232. package/dist/core/messages/pt/shared/plugin-core-messages.js +2 -2
  233. package/dist/core/messages/pt/shared/plugin-core-messages.js.map +1 -1
  234. package/dist/core/messages/pt/shared/plugin-registry-messages.d.ts +4 -4
  235. package/dist/core/messages/pt/shared/plugin-registry-messages.js +4 -4
  236. package/dist/core/messages/pt/shared/plugin-registry-messages.js.map +1 -1
  237. package/dist/core/messages/zh/analysts/archetypes-extra-messages.d.ts +2 -2
  238. package/dist/core/messages/zh/analysts/archetypes-extra-messages.js +2 -2
  239. package/dist/core/messages/zh/analysts/archetypes-extra-messages.js.map +1 -1
  240. package/dist/core/messages/zh/analysts/detector-clean-arch-messages.d.ts +4 -4
  241. package/dist/core/messages/zh/analysts/detector-clean-arch-messages.js +4 -4
  242. package/dist/core/messages/zh/analysts/detector-clean-arch-messages.js.map +1 -1
  243. package/dist/core/messages/zh/analysts/detector-js-ts-messages.d.ts +2 -2
  244. package/dist/core/messages/zh/analysts/detector-js-ts-messages.js +2 -2
  245. package/dist/core/messages/zh/analysts/detector-js-ts-messages.js.map +1 -1
  246. package/dist/core/messages/zh/analysts/map-reversion-extra-messages.d.ts +6 -6
  247. package/dist/core/messages/zh/analysts/map-reversion-extra-messages.js +6 -6
  248. package/dist/core/messages/zh/analysts/map-reversion-extra-messages.js.map +1 -1
  249. package/dist/core/messages/zh/analysts/report-github-actions-messages.d.ts +2 -2
  250. package/dist/core/messages/zh/analysts/report-github-actions-messages.js +2 -2
  251. package/dist/core/messages/zh/analysts/report-github-actions-messages.js.map +1 -1
  252. package/dist/core/messages/zh/analysts/scorer-messages.d.ts +45 -45
  253. package/dist/core/messages/zh/analysts/scorer-messages.js +49 -49
  254. package/dist/core/messages/zh/analysts/scorer-messages.js.map +1 -1
  255. package/dist/core/messages/zh/cli/cli-command-analysts-messages.d.ts +2 -2
  256. package/dist/core/messages/zh/cli/cli-command-analysts-messages.js +2 -2
  257. package/dist/core/messages/zh/cli/cli-command-analysts-messages.js.map +1 -1
  258. package/dist/core/messages/zh/cli/cli-command-convert-messages.d.ts +1 -1
  259. package/dist/core/messages/zh/cli/cli-command-convert-messages.js +1 -1
  260. package/dist/core/messages/zh/cli/cli-command-convert-messages.js.map +1 -1
  261. package/dist/core/messages/zh/cli/cli-command-format-messages.d.ts +1 -1
  262. package/dist/core/messages/zh/cli/cli-command-format-messages.js +1 -1
  263. package/dist/core/messages/zh/cli/cli-command-format-messages.js.map +1 -1
  264. package/dist/core/messages/zh/cli/cli-command-github-actions-messages.d.ts +1 -1
  265. package/dist/core/messages/zh/cli/cli-command-github-actions-messages.js +4 -4
  266. package/dist/core/messages/zh/cli/cli-command-github-actions-messages.js.map +1 -1
  267. package/dist/core/messages/zh/cli/cli-command-update-messages.d.ts +2 -2
  268. package/dist/core/messages/zh/cli/cli-command-update-messages.js +2 -2
  269. package/dist/core/messages/zh/cli/cli-command-update-messages.js.map +1 -1
  270. package/dist/core/messages/zh/cli/cli-flags-validator-messages.d.ts +3 -3
  271. package/dist/core/messages/zh/cli/cli-flags-validator-messages.js +3 -3
  272. package/dist/core/messages/zh/cli/cli-flags-validator-messages.js.map +1 -1
  273. package/dist/core/messages/zh/core/correcoes-messages.js +2 -2
  274. package/dist/core/messages/zh/core/correcoes-messages.js.map +1 -1
  275. package/dist/core/messages/zh/core/inquisitor-extra-messages.d.ts +2 -2
  276. package/dist/core/messages/zh/core/inquisitor-extra-messages.js +2 -2
  277. package/dist/core/messages/zh/core/inquisitor-extra-messages.js.map +1 -1
  278. package/dist/core/messages/zh/core/parser-extra-messages.d.ts +3 -3
  279. package/dist/core/messages/zh/core/parser-extra-messages.js +3 -3
  280. package/dist/core/messages/zh/core/parser-extra-messages.js.map +1 -1
  281. package/dist/core/messages/zh/guardian/guardian-messages.d.ts +2 -2
  282. package/dist/core/messages/zh/guardian/guardian-messages.js +2 -2
  283. package/dist/core/messages/zh/guardian/guardian-messages.js.map +1 -1
  284. package/dist/core/messages/zh/guardian/watcher-hidden-messages.d.ts +2 -2
  285. package/dist/core/messages/zh/guardian/watcher-hidden-messages.js +2 -2
  286. package/dist/core/messages/zh/guardian/watcher-hidden-messages.js.map +1 -1
  287. package/dist/core/messages/zh/log/log-helper.js.map +1 -1
  288. package/dist/core/messages/zh/reports/report-async-patterns-messages.d.ts +3 -3
  289. package/dist/core/messages/zh/reports/report-async-patterns-messages.js +3 -3
  290. package/dist/core/messages/zh/reports/report-async-patterns-messages.js.map +1 -1
  291. package/dist/core/messages/zh/shared/plugin-core-messages.d.ts +2 -2
  292. package/dist/core/messages/zh/shared/plugin-core-messages.js +2 -2
  293. package/dist/core/messages/zh/shared/plugin-core-messages.js.map +1 -1
  294. package/dist/core/messages/zh/shared/plugin-registry-messages.d.ts +4 -4
  295. package/dist/core/messages/zh/shared/plugin-registry-messages.js +4 -4
  296. package/dist/core/messages/zh/shared/plugin-registry-messages.js.map +1 -1
  297. package/dist/core/parsing/utils.d.ts +3 -3
  298. package/dist/core/workers/worker-pool.js +1 -1
  299. package/dist/core/workers/worker-pool.js.map +1 -1
  300. package/dist/guardian/baseline.js.map +1 -1
  301. package/dist/guardian/constants.js.map +1 -1
  302. package/dist/guardian/diff.js.map +1 -1
  303. package/dist/reports/analise-async-patterns.js +1 -1
  304. package/dist/reports/analise-async-patterns.js.map +1 -1
  305. package/dist/reports/filter-smart.js.map +1 -1
  306. package/dist/reports/report-caretaker-health.js +1 -1
  307. package/dist/reports/report-caretaker-health.js.map +1 -1
  308. package/dist/shared/plugins/init.js.map +1 -1
  309. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"worker-pool.js","sourceRoot":"","sources":["../../../src/core/workers/worker-pool.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * Sistema de Pool de Workers para Processamento Paralelo de Arquivos\n *\n * Permite processar múltiplos arquivos em paralelo usando Worker Threads,\n * melhorando a performance em projetos grandes com muitos arquivos.\n */\n\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { Worker } from 'node:worker_threads';\n\nimport { config } from '@core/config';\nimport { log } from '@core/messages';\n\nimport type { ContextoExecucao, FileEntryWithAst, MetricaAnalista, Ocorrencia, ProcessFilesResult, Tecnica, WorkerPoolOptions, WorkerResult, WorkerTask } from '@';\nimport { ocorrenciaErroAnalista } from '@';\n\n// ESM compatível: __dirname não existe em módulos ES\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Re-exporta os tipos para compatibilidade\nexport type { ProcessFilesResult, WorkerPoolOptions, WorkerResult, WorkerTask };\n\n/**\n * Pool de workers para processamento paralelo de arquivos\n */\nexport class WorkerPool {\n private maxWorkers: number;\n private batchSize: number;\n private timeoutMs: number;\n private enabled: boolean;\n private activeWorkers = 0;\n private results: WorkerResult[] = [];\n private errors: string[] = [];\n constructor(options: WorkerPoolOptions = {}) {\n // Se o valor foi passado via options usa ele; se config define 0 usamos no de CPUs\n const configuredMax = options.maxWorkers ?? config.WORKER_POOL_MAX_WORKERS ?? 0;\n this.maxWorkers = configuredMax > 0 ? configuredMax : Math.max(1, os.cpus().length);\n this.batchSize = options.batchSize ?? 10;\n // Timeout base vindo de opções/config\n let baseTempoLimite = options.timeoutMs ?? config.ANALISE_TIMEOUT_POR_ANALISTA_MS;\n // Permite sobrescrever com variável de ambiente para ambientes de produção\n const envCap = Number(process.env.TUTANUS_MAX_ANALYST_TIMEOUT_MS) || 0;\n if (envCap > 0) {\n baseTempoLimite = Math.min(baseTempoLimite, envCap);\n } else if (process.env.NODE_ENV === 'production') {\n // Em produção, por padrão, limitamos para não exceder 10s salvo override explícito\n baseTempoLimite = Math.min(baseTempoLimite, 10000);\n }\n this.timeoutMs = baseTempoLimite;\n this.enabled = options.enabled ?? config.WORKER_POOL_ENABLED !== false;\n\n // Verifica se Worker Threads estão disponíveis\n if (!this.enabled || !Worker) {\n this.enabled = false;\n log.info('Pool de workers desabilitado (Worker Threads não disponível)');\n }\n }\n\n /**\n * Processa arquivos usando pool de workers\n */\n async processFiles(files: FileEntryWithAst[], techniques: Tecnica[], context: ContextoExecucao): Promise<ProcessFilesResult> {\n if (!this.enabled || files.length < this.batchSize) {\n // Fallback para processamento sequencial\n return this.processSequentially(files, techniques, context);\n }\n const startHora = performance.now();\n const batches = this.createBatches(files);\n const nonGlobalTechniques = techniques.filter(textoTitulo => !textoTitulo.global);\n log.info(`[LANCAMENTO] Iniciando processamento paralelo com ${this.maxWorkers} workers`);\n log.info(`[PACOTE] ${batches.length} lotes de até ${this.batchSize} arquivos cada`);\n\n // Processa lotes globais primeiro\n const globalTechniques = techniques.filter(textoTitulo => textoTitulo.global);\n if (globalTechniques.length > 0) {\n await this.processGlobalTechniques(globalTechniques, context);\n }\n\n // Processa lotes de arquivos em paralelo\n await this.processBatches(batches, nonGlobalTechniques, context);\n const duration = performance.now() - startHora;\n const totalOccurrences = this.results.reduce((sum, raiz) => sum + raiz.occurrences.length, 0);\n const totalMetricas = this.results.flatMap(raiz => raiz.metrics);\n log.info(`[OK] Processamento paralelo concluído em ${Math.round(duration)}ms`);\n log.info(`[GRAFICO] ${this.results.length} workers, ${files.length} arquivos, ${totalOccurrences} ocorrências`);\n return {\n occurrences: this.results.flatMap(raiz => raiz.occurrences),\n metrics: totalMetricas,\n totalProcessed: files.length,\n duration\n };\n }\n\n /**\n * Cria lotes de arquivos para processamento paralelo\n */\n private createBatches(files: FileEntryWithAst[]): FileEntryWithAst[][] {\n const batches: FileEntryWithAst[][] = [];\n for (let indice = 0; indice < files.length; indice += this.batchSize) {\n batches.push(files.slice(indice, indice + this.batchSize));\n }\n return batches;\n }\n\n /**\n * Processa técnicas globais (não paralelizáveis)\n */\n private async processGlobalTechniques(techniques: Tecnica[], context: ContextoExecucao): Promise<void> {\n for (const technique of techniques) {\n try {\n const startHora = performance.now();\n const result = await this.executeTechniqueWithTimeout(technique, '',\n // conteúdo vazio para técnicas globais\n '[global]', null,\n // sem AST\n undefined,\n // sem fullPath\n context);\n if (result) {\n const occurrences = Array.isArray(result) ? result : [result];\n this.results.push({\n workerId: -1,\n // ID especial para global\n occurrences,\n metrics: [{\n nome: technique.nome || 'global',\n duracaoMs: performance.now() - startHora,\n ocorrencias: occurrences.length,\n global: true\n }],\n processedArquivos: 0,\n errors: [],\n duration: performance.now() - startHora\n });\n }\n } catch (error) {\n const err = error as Error;\n this.errors.push(`Erro em técnica global '${technique.nome}': ${err.message}`);\n this.results.push({\n workerId: -1,\n occurrences: [ocorrenciaErroAnalista({\n mensagem: `Falha na técnica global '${technique.nome}': ${err.message}`,\n relPath: '[execução global]',\n origem: technique.nome\n })],\n metrics: [],\n processedArquivos: 0,\n errors: [err.message],\n duration: 0\n });\n }\n }\n }\n\n /**\n * Processa lotes de arquivos em paralelo\n */\n private async processBatches(batches: FileEntryWithAst[][], techniques: Tecnica[], context: ContextoExecucao): Promise<void> {\n // Conjunto de promises ativas para controle fino (removemos quando conclu\u0000eddas)\n const activePromises = new Set<Promise<void>>();\n for (let indice = 0; indice < batches.length; indice++) {\n // Espera até ter vaga para novo worker\n while (this.activeWorkers >= this.maxWorkers) {\n // Aguarda a primeira promise ativa resolver (libera capacidade)\n if (activePromises.size === 0) break;\n await Promise.race(Array.from(activePromises));\n }\n const caminho = this.processBatch(batches[indice], techniques, context, indice);\n activePromises.add(caminho);\n\n // Quando a promise terminar, remove do conjunto\n caminho.then(() => activePromises.delete(caminho)).catch(() => activePromises.delete(caminho));\n }\n\n // Aguarda todas as promises ativas terminarem\n await Promise.all(Array.from(activePromises));\n }\n\n /**\n * Processa um lote de arquivos em um worker\n */\n private async processBatch(files: FileEntryWithAst[], techniques: Tecnica[], context: ContextoExecucao, batchId: number): Promise<void> {\n this.activeWorkers++;\n try {\n const workerCaminho = path.join(__dirname, 'worker-executor.js');\n\n // Serializar técnicas: remover funções (não podem ser clonadas para workers)\n const techniquesSerializaveis = techniques.map(textoTitulo => {\n const techObj = textoTitulo as unknown as Record<string, unknown>;\n const {\n aplicar: _aplicar,\n test,\n visitor: _visitor,\n ...rest\n } = techObj;\n // Salvar info sobre test para reconstruir no worker\n return {\n ...rest,\n _hasTest: typeof test === 'function',\n _testSource: typeof test === 'function' ? test.toString() : null\n };\n });\n\n // Parallel AST parsing: remove ASTs antes de enviar para workers\n // Workers farão o parsing dos ASTs localmente, distribuindo a carga entre CPUs\n const filesSemAst = files.map(arquivo => {\n const { ast: _ast, ...resto } = arquivo;\n return resto;\n });\n\n // Calcula timeout adaptativo por lote baseado no tamanho médio dos arquivos\n const avgSize = files.reduce((string, arquivo) => string + (arquivo.content ? arquivo.content.length : 0), 0) / Math.max(1, files.length);\n const sizeMultiplier = 1 + Math.min(4, avgSize / 50000);\n const batchTempoLimiteMs = Math.max(1000, Math.min(this.timeoutMs, Math.floor(this.timeoutMs * sizeMultiplier)));\n const worker = new Worker(workerCaminho, {\n workerData: {\n files: filesSemAst,\n techniques: techniquesSerializaveis,\n context,\n workerId: batchId,\n timeoutMs: batchTempoLimiteMs\n } as unknown as WorkerTask\n });\n const adjustedKillMs = Math.max(1000, Math.min(Math.max(30000, this.timeoutMs * 2 || 30000), batchTempoLimiteMs + 1000));\n const result = await this.runWorker(worker, batchId, adjustedKillMs, files.length);\n this.results.push(result);\n } catch (error) {\n const err = error as Error;\n this.errors.push(`Erro no worker ${batchId}: ${err.message}`);\n\n // Adiciona resultado de erro\n this.results.push({\n workerId: batchId,\n occurrences: [ocorrenciaErroAnalista({\n mensagem: `Falha no worker ${batchId}: ${err.message}`,\n relPath: `[worker-${batchId}]`,\n origem: 'worker-pool'\n })],\n metrics: [],\n processedArquivos: 0,\n errors: [err.message],\n duration: 0\n });\n } finally {\n this.activeWorkers--;\n }\n }\n\n /**\n * Processamento sequencial como fallback\n */\n private async processSequentially(files: FileEntryWithAst[], techniques: Tecnica[], context: ContextoExecucao): Promise<{\n occurrences: Ocorrencia[];\n metrics: MetricaAnalista[];\n totalProcessed: number;\n duration: number;\n }> {\n const startHora = performance.now();\n const occurrences: Ocorrencia[] = [];\n const metrics: MetricaAnalista[] = [];\n log.info('🔄 Usando processamento sequencial (workers desabilitados)');\n\n // Processa técnicas globais\n const globalTechniques = techniques.filter(textoTitulo => textoTitulo.global);\n for (const technique of globalTechniques) {\n try {\n const result = await this.executeTechniqueWithTimeout(technique, '', '[global]', null, undefined, context);\n if (result) {\n const occs = Array.isArray(result) ? result : [result];\n occurrences.push(...occs);\n }\n } catch (error) {\n const err = error as Error;\n occurrences.push(ocorrenciaErroAnalista({\n mensagem: `Falha na técnica global '${technique.nome}': ${err.message}`,\n relPath: '[execução global]',\n origem: technique.nome\n }));\n }\n }\n\n // Processa arquivos sequencialmente\n const nonGlobalTechniques = techniques.filter(textoTitulo => !textoTitulo.global);\n for (const file of files) {\n for (const technique of nonGlobalTechniques) {\n if (technique.test && !technique.test(file.relPath)) continue;\n try {\n const startHora = performance.now();\n const result = await this.executeTechniqueWithTimeout(technique, file.content ?? '', file.relPath, file.ast && 'node' in file.ast ? file.ast : null, file.fullCaminho, context);\n if (result) {\n const occs = Array.isArray(result) ? result : [result];\n occurrences.push(...occs);\n }\n const duration = performance.now() - startHora;\n metrics.push({\n nome: technique.nome || 'desconhecido',\n duracaoMs: duration,\n ocorrencias: Array.isArray(result) ? result.length : result ? 1 : 0,\n global: false\n });\n } catch (error) {\n const err = error as Error;\n occurrences.push(ocorrenciaErroAnalista({\n mensagem: `Falha na técnica '${technique.nome}' para ${file.relPath}: ${err.message}`,\n relPath: file.relPath,\n origem: technique.nome\n }));\n }\n }\n }\n return {\n occurrences,\n metrics,\n totalProcessed: files.length,\n duration: performance.now() - startHora\n };\n }\n\n /**\n * Executa uma técnica com timeout\n */\n private async executeTechniqueWithTimeout(technique: Tecnica, content: string, relPath: string, ast: import('@babel/traverse').NodePath<import('@babel/types').Node> | null, fullCaminho: string | undefined, context: ContextoExecucao): Promise<ReturnType<Tecnica['aplicar']>> {\n if (this.timeoutMs > 0) {\n let timer: NodeJS.Timeout | null = null;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n reject(new Error(`Timeout: analista '${technique.nome}' excedeu ${this.timeoutMs}ms`));\n }, this.timeoutMs);\n });\n const execPromise = technique.aplicar(content, relPath, ast, fullCaminho, context);\n try {\n return await Promise.race([execPromise, timeoutPromise]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n } else {\n return await technique.aplicar(content, relPath, ast, fullCaminho, context);\n }\n }\n\n private parseWorkerMsg(msg: unknown, batchId: number, totalFiles: number): WorkerResult | null {\n const metrica = msg as Record<string, unknown>;\n if (!metrica || metrica['type'] === 'heartbeat') return null;\n const workerId = typeof metrica['workerId'] === 'number' ? metrica['workerId'] : batchId;\n const occurrences = Array.isArray(metrica['occurrences']) ? metrica['occurrences'] : Array.isArray(metrica['resultados']) ? metrica['resultados'] : [];\n const metrics = Array.isArray(metrica['metrics']) ? metrica['metrics'] : [];\n const processedArquivos = typeof metrica['processedFiles'] === 'number' ? metrica['processedFiles'] : totalFiles;\n const errors = Array.isArray(metrica['errors']) ? metrica['errors'].map(String) : metrica['erro'] ? [String(metrica['erro'])] : [];\n const duration = typeof metrica['duration'] === 'number' ? metrica['duration'] : 0;\n return { workerId, occurrences, metrics, processedArquivos, errors, duration };\n }\n private async runWorker(worker: Worker, batchId: number, killMs: number, totalFiles: number): Promise<WorkerResult> {\n return new Promise<WorkerResult>((resolve, reject) => {\n let settled = false;\n let killTimer: NodeJS.Timeout | null = setTimeout(() => {\n if (settled) return;\n settled = true;\n try { void worker.terminate(); } catch {}\n log.infoSemSanitizar(JSON.stringify({ event: 'worker_killed', batchId, killMs, reason: 'timeout' }));\n reject(new Error(`Worker ${batchId} killed after ${killMs}ms`));\n }, killMs);\n const clearAndSettle = () => {\n settled = true;\n if (killTimer) { try { clearTimeout(killTimer); } catch {} }\n };\n worker.on('message', (msg: unknown) => {\n const parsed = this.parseWorkerMsg(msg, batchId, totalFiles);\n if (!parsed) {\n if (killTimer) { try { clearTimeout(killTimer); } catch {} }\n killTimer = setTimeout(() => {\n if (settled) return;\n settled = true;\n try { void worker.terminate(); } catch {}\n reject(new Error(`Worker ${batchId} killed after ${killMs}ms (heartbeat timeout)`));\n }, killMs);\n return;\n }\n clearAndSettle();\n resolve(parsed);\n });\n worker.on('error', err => {\n clearAndSettle();\n reject(err);\n });\n worker.on('exit', code => {\n clearAndSettle();\n if (code !== 0) {\n log.infoSemSanitizar(JSON.stringify({ event: 'worker_exit_nonzero', batchId, code }));\n reject(new Error(`Worker ${batchId} exited with code ${code}`));\n } else {\n resolve({ workerId: batchId, occurrences: [], metrics: [], processedArquivos: totalFiles, errors: [], duration: 0 });\n }\n });\n });\n }\n /**\n * Retorna estatísticas do pool\n */\n getStats(): {\n maxWorkers: number;\n batchSize: number;\n enabled: boolean;\n activeWorkers: number;\n completedWorkers: number;\n totalErrors: number;\n errors: string[];\n } {\n return {\n maxWorkers: this.maxWorkers,\n batchSize: this.batchSize,\n enabled: this.enabled,\n activeWorkers: this.activeWorkers,\n completedWorkers: this.results.length,\n totalErrors: this.errors.length,\n errors: this.errors\n };\n }\n}\n\n/**\n * Função de conveniência para usar o pool de workers\n */\n\nexport async function processarComWorkers(files: FileEntryWithAst[], techniques: Tecnica[], context: ContextoExecucao, options?: WorkerPoolOptions): Promise<{\n occurrences: Ocorrencia[];\n metrics: MetricaAnalista[];\n totalProcessed: number;\n duration: number;\n}> {\n const pool = new WorkerPool(options);\n return await pool.processFiles(files, techniques, context);\n}"]}
1
+ {"version":3,"file":"worker-pool.js","sourceRoot":"","sources":["../../../src/core/workers/worker-pool.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * Sistema de Pool de Workers para Processamento Paralelo de Arquivos\n *\n * Permite processar múltiplos arquivos em paralelo usando Worker Threads,\n * melhorando a performance em projetos grandes com muitos arquivos.\n */\n\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { Worker } from 'node:worker_threads';\n\nimport { config } from '@core/config';\nimport { log } from '@core/messages';\n\nimport type { ContextoExecucao, FileEntryWithAst, MetricaAnalista, Ocorrencia, ProcessFilesResult, Tecnica, WorkerPoolOptions, WorkerResult, WorkerTask } from '@';\nimport { ocorrenciaErroAnalista } from '@';\n\n// ESM compatível: __dirname não existe em módulos ES\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Re-exporta os tipos para compatibilidade\nexport type { ProcessFilesResult, WorkerPoolOptions, WorkerResult, WorkerTask };\n\n/**\n * Pool de workers para processamento paralelo de arquivos\n */\nexport class WorkerPool {\n private maxWorkers: number;\n private batchSize: number;\n private timeoutMs: number;\n private enabled: boolean;\n private activeWorkers = 0;\n private results: WorkerResult[] = [];\n private errors: string[] = [];\n constructor(options: WorkerPoolOptions = {}) {\n // Se o valor foi passado via options usa ele; se config define 0 usamos no de CPUs\n const configuredMax = options.maxWorkers ?? config.WORKER_POOL_MAX_WORKERS ?? 0;\n this.maxWorkers = configuredMax > 0 ? configuredMax : Math.max(1, os.cpus().length);\n this.batchSize = options.batchSize ?? 10;\n // Timeout base vindo de opções/config\n let baseTempoLimite = options.timeoutMs ?? config.ANALISE_TIMEOUT_POR_ANALISTA_MS;\n // Permite sobrescrever com variável de ambiente para ambientes de produção\n const envCap = Number(process.env.TUTANUS_MAX_ANALYST_TIMEOUT_MS) || 0;\n if (envCap > 0) {\n baseTempoLimite = Math.min(baseTempoLimite, envCap);\n } else if (process.env.NODE_ENV === 'production') {\n // Em produção, por padrão, limitamos para não exceder 10s salvo override explícito\n baseTempoLimite = Math.min(baseTempoLimite, 10000);\n }\n this.timeoutMs = baseTempoLimite;\n this.enabled = options.enabled ?? config.WORKER_POOL_ENABLED !== false;\n\n // Verifica se Worker Threads estão disponíveis\n if (!this.enabled || !Worker) {\n this.enabled = false;\n log.info('Pool de workers desabilitado (Worker Threads não disponível)');\n }\n }\n\n /**\n * Processa arquivos usando pool de workers\n */\n async processFiles(files: FileEntryWithAst[], techniques: Tecnica[], context: ContextoExecucao): Promise<ProcessFilesResult> {\n if (!this.enabled || files.length < this.batchSize) {\n // Fallback para processamento sequencial\n return this.processSequentially(files, techniques, context);\n }\n const startHora = performance.now();\n const batches = this.createBatches(files);\n const nonGlobalTechniques = techniques.filter(textoTitulo => !textoTitulo.global);\n log.info(`[LANCAMENTO] Iniciando processamento paralelo com ${this.maxWorkers} workers`);\n log.info(`[PACOTE] ${batches.length} lotes de até ${this.batchSize} arquivos cada`);\n\n // Processa lotes globais primeiro\n const globalTechniques = techniques.filter(textoTitulo => textoTitulo.global);\n if (globalTechniques.length > 0) {\n await this.processGlobalTechniques(globalTechniques, context);\n }\n\n // Processa lotes de arquivos em paralelo\n await this.processBatches(batches, nonGlobalTechniques, context);\n const duration = performance.now() - startHora;\n const totalOccurrences = this.results.reduce((sum, raiz) => sum + raiz.occurrences.length, 0);\n const totalMetricas = this.results.flatMap(raiz => raiz.metrics);\n log.info(`[OK] Processamento paralelo concluído em ${Math.round(duration)}ms`);\n log.info(`[GRAFICO] ${this.results.length} workers, ${files.length} arquivos, ${totalOccurrences} ocorrências`);\n return {\n occurrences: this.results.flatMap(raiz => raiz.occurrences),\n metrics: totalMetricas,\n totalProcessed: files.length,\n duration\n };\n }\n\n /**\n * Cria lotes de arquivos para processamento paralelo\n */\n private createBatches(files: FileEntryWithAst[]): FileEntryWithAst[][] {\n const batches: FileEntryWithAst[][] = [];\n for (let indice = 0; indice < files.length; indice += this.batchSize) {\n batches.push(files.slice(indice, indice + this.batchSize));\n }\n return batches;\n }\n\n /**\n * Processa técnicas globais (não paralelizáveis)\n */\n private async processGlobalTechniques(techniques: Tecnica[], context: ContextoExecucao): Promise<void> {\n for (const technique of techniques) {\n try {\n const startHora = performance.now();\n const result = await this.executeTechniqueWithTimeout(technique, '',\n // conteúdo vazio para técnicas globais\n '[global]', null,\n // sem AST\n undefined,\n // sem fullPath\n context);\n if (result) {\n const occurrences = Array.isArray(result) ? result : [result];\n this.results.push({\n workerId: -1,\n // ID especial para global\n occurrences,\n metrics: [{\n nome: technique.nome || 'global',\n duracaoMs: performance.now() - startHora,\n ocorrencias: occurrences.length,\n global: true\n }],\n processedArquivos: 0,\n errors: [],\n duration: performance.now() - startHora\n });\n }\n } catch (error) {\n const err = error as Error;\n this.errors.push(`Erro em técnica global '${technique.nome}': ${err.message}`);\n this.results.push({\n workerId: -1,\n occurrences: [ocorrenciaErroAnalista({\n mensagem: `Falha na técnica global '${technique.nome}': ${err.message}`,\n relPath: '[execução global]',\n origem: technique.nome\n })],\n metrics: [],\n processedArquivos: 0,\n errors: [err.message],\n duration: 0\n });\n }\n }\n }\n\n /**\n * Processa lotes de arquivos em paralelo\n */\n private async processBatches(batches: FileEntryWithAst[][], techniques: Tecnica[], context: ContextoExecucao): Promise<void> {\n // Conjunto de promises ativas para controle fino (removemos quando conclu\u0000eddas)\n const activePromises = new Set<Promise<void>>();\n for (let indice = 0; indice < batches.length; indice++) {\n // Espera até ter vaga para novo worker\n while (this.activeWorkers >= this.maxWorkers) {\n // Aguarda a primeira promise ativa resolver (libera capacidade)\n if (activePromises.size === 0) break;\n await Promise.race(Array.from(activePromises));\n }\n const caminho = this.processBatch(batches[indice], techniques, context, indice);\n activePromises.add(caminho);\n\n // Quando a promise terminar, remove do conjunto\n caminho.then(() => activePromises.delete(caminho)).catch(() => activePromises.delete(caminho));\n }\n\n // Aguarda todas as promises ativas terminarem\n await Promise.all(Array.from(activePromises));\n }\n\n /**\n * Processa um lote de arquivos em um worker\n */\n private async processBatch(files: FileEntryWithAst[], techniques: Tecnica[], context: ContextoExecucao, batchId: number): Promise<void> {\n this.activeWorkers++;\n try {\n const workerCaminho = path.join(__dirname, 'worker-executor.js');\n\n // Serializar técnicas: remover funções (não podem ser clonadas para workers)\n const techniquesSerializaveis = techniques.map(textoTitulo => {\n const techObj = textoTitulo as unknown as Record<string, unknown>;\n const {\n aplicar: _aplicar,\n test,\n visitor: _visitor,\n ...rest\n } = techObj;\n // Salvar info sobre test para reconstruir no worker\n return {\n ...rest,\n _hasTest: typeof test === 'function',\n _testSource: typeof test === 'function' ? test.toString() : null\n };\n });\n\n // Parallel AST parsing: remove ASTs antes de enviar para workers\n // Workers farão o parsing dos ASTs localmente, distribuindo a carga entre CPUs\n const filesSemAst = files.map(arquivo => {\n const { ast: _ast, ...resto } = arquivo;\n return resto;\n });\n\n // Calcula timeout adaptativo por lote baseado no tamanho médio dos arquivos\n const avgSize = files.reduce((string, arquivo) => string + (arquivo.content ? arquivo.content.length : 0), 0) / Math.max(1, files.length);\n const sizeMultiplier = 1 + Math.min(4, avgSize / 50000);\n const batchTempoLimiteMs = Math.max(1000, Math.min(this.timeoutMs, Math.floor(this.timeoutMs * sizeMultiplier)));\n const worker = new Worker(workerCaminho, {\n workerData: {\n files: filesSemAst,\n techniques: techniquesSerializaveis,\n context,\n workerId: batchId,\n timeoutMs: batchTempoLimiteMs\n } as unknown as WorkerTask\n });\n const adjustedKillMs = Math.max(1000, Math.min(Math.max(30000, this.timeoutMs * 2 || 30000), batchTempoLimiteMs + 1000));\n const result = await this.runWorker(worker, batchId, adjustedKillMs, files.length);\n this.results.push(result);\n } catch (error) {\n const err = error as Error;\n this.errors.push(`Erro no worker ${batchId}: ${err.message}`);\n\n // Adiciona resultado de erro\n this.results.push({\n workerId: batchId,\n occurrences: [ocorrenciaErroAnalista({\n mensagem: `Falha no worker ${batchId}: ${err.message}`,\n relPath: `[worker-${batchId}]`,\n origem: 'worker-pool'\n })],\n metrics: [],\n processedArquivos: 0,\n errors: [err.message],\n duration: 0\n });\n } finally {\n this.activeWorkers--;\n }\n }\n\n /**\n * Processamento sequencial como fallback\n */\n private async processSequentially(files: FileEntryWithAst[], techniques: Tecnica[], context: ContextoExecucao): Promise<{\n occurrences: Ocorrencia[];\n metrics: MetricaAnalista[];\n totalProcessed: number;\n duration: number;\n }> {\n const startHora = performance.now();\n const occurrences: Ocorrencia[] = [];\n const metrics: MetricaAnalista[] = [];\n log.info('[REFRESH] Usando processamento sequencial (workers desabilitados)');\n\n // Processa técnicas globais\n const globalTechniques = techniques.filter(textoTitulo => textoTitulo.global);\n for (const technique of globalTechniques) {\n try {\n const result = await this.executeTechniqueWithTimeout(technique, '', '[global]', null, undefined, context);\n if (result) {\n const occs = Array.isArray(result) ? result : [result];\n occurrences.push(...occs);\n }\n } catch (error) {\n const err = error as Error;\n occurrences.push(ocorrenciaErroAnalista({\n mensagem: `Falha na técnica global '${technique.nome}': ${err.message}`,\n relPath: '[execução global]',\n origem: technique.nome\n }));\n }\n }\n\n // Processa arquivos sequencialmente\n const nonGlobalTechniques = techniques.filter(textoTitulo => !textoTitulo.global);\n for (const file of files) {\n for (const technique of nonGlobalTechniques) {\n if (technique.test && !technique.test(file.relPath)) continue;\n try {\n const startHora = performance.now();\n const result = await this.executeTechniqueWithTimeout(technique, file.content ?? '', file.relPath, file.ast && 'node' in file.ast ? file.ast : null, file.fullCaminho, context);\n if (result) {\n const occs = Array.isArray(result) ? result : [result];\n occurrences.push(...occs);\n }\n const duration = performance.now() - startHora;\n metrics.push({\n nome: technique.nome || 'desconhecido',\n duracaoMs: duration,\n ocorrencias: Array.isArray(result) ? result.length : result ? 1 : 0,\n global: false\n });\n } catch (error) {\n const err = error as Error;\n occurrences.push(ocorrenciaErroAnalista({\n mensagem: `Falha na técnica '${technique.nome}' para ${file.relPath}: ${err.message}`,\n relPath: file.relPath,\n origem: technique.nome\n }));\n }\n }\n }\n return {\n occurrences,\n metrics,\n totalProcessed: files.length,\n duration: performance.now() - startHora\n };\n }\n\n /**\n * Executa uma técnica com timeout\n */\n private async executeTechniqueWithTimeout(technique: Tecnica, content: string, relPath: string, ast: import('@babel/traverse').NodePath<import('@babel/types').Node> | null, fullCaminho: string | undefined, context: ContextoExecucao): Promise<ReturnType<Tecnica['aplicar']>> {\n if (this.timeoutMs > 0) {\n let timer: NodeJS.Timeout | null = null;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n reject(new Error(`Timeout: analista '${technique.nome}' excedeu ${this.timeoutMs}ms`));\n }, this.timeoutMs);\n });\n const execPromise = technique.aplicar(content, relPath, ast, fullCaminho, context);\n try {\n return await Promise.race([execPromise, timeoutPromise]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n } else {\n return await technique.aplicar(content, relPath, ast, fullCaminho, context);\n }\n }\n\n private parseWorkerMsg(msg: unknown, batchId: number, totalFiles: number): WorkerResult | null {\n const metrica = msg as Record<string, unknown>;\n if (!metrica || metrica['type'] === 'heartbeat') return null;\n const workerId = typeof metrica['workerId'] === 'number' ? metrica['workerId'] : batchId;\n const occurrences = Array.isArray(metrica['occurrences']) ? metrica['occurrences'] : Array.isArray(metrica['resultados']) ? metrica['resultados'] : [];\n const metrics = Array.isArray(metrica['metrics']) ? metrica['metrics'] : [];\n const processedArquivos = typeof metrica['processedFiles'] === 'number' ? metrica['processedFiles'] : totalFiles;\n const errors = Array.isArray(metrica['errors']) ? metrica['errors'].map(String) : metrica['erro'] ? [String(metrica['erro'])] : [];\n const duration = typeof metrica['duration'] === 'number' ? metrica['duration'] : 0;\n return { workerId, occurrences, metrics, processedArquivos, errors, duration };\n }\n private async runWorker(worker: Worker, batchId: number, killMs: number, totalFiles: number): Promise<WorkerResult> {\n return new Promise<WorkerResult>((resolve, reject) => {\n let settled = false;\n let killTimer: NodeJS.Timeout | null = setTimeout(() => {\n if (settled) return;\n settled = true;\n try { void worker.terminate(); } catch {}\n log.infoSemSanitizar(JSON.stringify({ event: 'worker_killed', batchId, killMs, reason: 'timeout' }));\n reject(new Error(`Worker ${batchId} killed after ${killMs}ms`));\n }, killMs);\n const clearAndSettle = () => {\n settled = true;\n if (killTimer) { try { clearTimeout(killTimer); } catch {} }\n };\n worker.on('message', (msg: unknown) => {\n const parsed = this.parseWorkerMsg(msg, batchId, totalFiles);\n if (!parsed) {\n if (killTimer) { try { clearTimeout(killTimer); } catch {} }\n killTimer = setTimeout(() => {\n if (settled) return;\n settled = true;\n try { void worker.terminate(); } catch {}\n reject(new Error(`Worker ${batchId} killed after ${killMs}ms (heartbeat timeout)`));\n }, killMs);\n return;\n }\n clearAndSettle();\n resolve(parsed);\n });\n worker.on('error', err => {\n clearAndSettle();\n reject(err);\n });\n worker.on('exit', code => {\n clearAndSettle();\n if (code !== 0) {\n log.infoSemSanitizar(JSON.stringify({ event: 'worker_exit_nonzero', batchId, code }));\n reject(new Error(`Worker ${batchId} exited with code ${code}`));\n } else {\n resolve({ workerId: batchId, occurrences: [], metrics: [], processedArquivos: totalFiles, errors: [], duration: 0 });\n }\n });\n });\n }\n /**\n * Retorna estatísticas do pool\n */\n getStats(): {\n maxWorkers: number;\n batchSize: number;\n enabled: boolean;\n activeWorkers: number;\n completedWorkers: number;\n totalErrors: number;\n errors: string[];\n } {\n return {\n maxWorkers: this.maxWorkers,\n batchSize: this.batchSize,\n enabled: this.enabled,\n activeWorkers: this.activeWorkers,\n completedWorkers: this.results.length,\n totalErrors: this.errors.length,\n errors: this.errors\n };\n }\n}\n\n/**\n * Função de conveniência para usar o pool de workers\n */\n\nexport async function processarComWorkers(files: FileEntryWithAst[], techniques: Tecnica[], context: ContextoExecucao, options?: WorkerPoolOptions): Promise<{\n occurrences: Ocorrencia[];\n metrics: MetricaAnalista[];\n totalProcessed: number;\n duration: number;\n}> {\n const pool = new WorkerPool(options);\n return await pool.processFiles(files, techniques, context);\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/guardian/baseline.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAa9D,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAAmB,kBAAkB,CAAC,CAAC;QACnE,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;YACnJ,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAqB,CAAC;QACzD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAA0B;IAC7D,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE;QACxD,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IACH,MAAM,YAAY,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\nimport path from 'node:path';\n\nimport { LINHA_BASE_CAMINHO } from '@guardian';\nimport { lerEstado, salvarEstado } from '@shared/persistence';\n\n/**\n * Representa o estado salvo de integridade de arquivos no baseline.\n * Mapeia caminho relativo de arquivo para hash (string).\n */\nexport type SnapshotBaseline = Record<string, string>;\n\n/**\n * L� o baseline atual do sistema de integridade.\n * Retorna null se o arquivo n�o existir ou estiver malformado.\n */\n\nexport async function carregarBaseline(): Promise<SnapshotBaseline | null> {\n try {\n const json = await lerEstado<SnapshotBaseline>(LINHA_BASE_CAMINHO);\n if (json && typeof json === 'object' && !Array.isArray(json)) {\n const entries = Object.entries(json as Record<string, unknown>).filter(([chave, valor]) => typeof chave === 'string' && typeof valor === 'string');\n return Object.fromEntries(entries) as SnapshotBaseline;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Salva um novo baseline de integridade em disco, sobrescrevendo qualquer estado anterior.\n */\n\nexport async function salvarBaseline(snapshot: SnapshotBaseline): Promise<void> {\n const fs = await import('node:fs');\n await fs.promises.mkdir(path.dirname(LINHA_BASE_CAMINHO), {\n recursive: true\n });\n await salvarEstado(LINHA_BASE_CAMINHO, snapshot);\n}"]}
1
+ {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/guardian/baseline.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAa9D,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAAmB,kBAAkB,CAAC,CAAC;QACnE,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;YACnJ,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAqB,CAAC;QACzD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAA0B;IAC7D,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE;QACxD,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IACH,MAAM,YAAY,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\nimport path from 'node:path';\n\nimport { LINHA_BASE_CAMINHO } from '@guardian';\nimport { lerEstado, salvarEstado } from '@shared/persistence';\n\n/**\n * Representa o estado salvo de integridade de arquivos no baseline.\n * Mapeia caminho relativo de arquivo para hash (string).\n */\nexport type SnapshotBaseline = Record<string, string>;\n\n/**\n * o baseline atual do sistema de integridade.\n * Retorna null se o arquivo não existir ou estiver malformado.\n */\n\nexport async function carregarBaseline(): Promise<SnapshotBaseline | null> {\n try {\n const json = await lerEstado<SnapshotBaseline>(LINHA_BASE_CAMINHO);\n if (json && typeof json === 'object' && !Array.isArray(json)) {\n const entries = Object.entries(json as Record<string, unknown>).filter(([chave, valor]) => typeof chave === 'string' && typeof valor === 'string');\n return Object.fromEntries(entries) as SnapshotBaseline;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Salva um novo baseline de integridade em disco, sobrescrevendo qualquer estado anterior.\n */\n\nexport async function salvarBaseline(snapshot: SnapshotBaseline): Promise<void> {\n const fs = await import('node:fs');\n await fs.promises.mkdir(path.dirname(LINHA_BASE_CAMINHO), {\n recursive: true\n });\n await salvarEstado(LINHA_BASE_CAMINHO, snapshot);\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/guardian/constants.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAQlD,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,iBAAiB,CAAC;AAOrE,MAAM,CAAC,MAAM,6BAA6B,GAAG,gBAAgB,CAAC,cAAc,CAAC;AAK7E,MAAM,CAAC,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,sBAAsB,CAAC;AAK7E,MAAM,CAAC,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,sBAAsB,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { TUTANUS_ARQUIVOS } from '@core/registry';\n\n/**\n * 📌 Caminho absoluto para o arquivo de baseline principal (usado pelo Sentinela).\n *\n * Usa o sistema de paths centralizado: .tutanus/guardian.baseline.json\n * Com fallback automático para baseline.json legado se necessário.\n */\nexport const LINHA_BASE_CAMINHO = TUTANUS_ARQUIVOS.GUARDIAN_BASELINE;\n\n/**\n * 📌 Caminho padrão para os registros da Vigia Oculta.\n *\n * Integridade de execução armazenada em .tutanus/integridade.json\n */\nexport const REGISTRO_VIGIA_CAMINHO_PADRAO = TUTANUS_ARQUIVOS.REGISTRO_VIGIA;\n\n/**\n * 🔑 Caminho para a chave pública GPG do Guardian.\n */\nexport const CHAVE_PUBLICA_CAMINHO = TUTANUS_ARQUIVOS.GUARDIAN_CHAVE_PUBLICA;\n\n/**\n * 🔑 Caminho para a chave privada GPG do Guardian.\n */\nexport const CHAVE_PRIVADA_CAMINHO = TUTANUS_ARQUIVOS.GUARDIAN_CHAVE_PRIVADA;"]}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/guardian/constants.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAQlD,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,iBAAiB,CAAC;AAOrE,MAAM,CAAC,MAAM,6BAA6B,GAAG,gBAAgB,CAAC,cAAc,CAAC;AAK7E,MAAM,CAAC,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,sBAAsB,CAAC;AAK7E,MAAM,CAAC,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,sBAAsB,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { TUTANUS_ARQUIVOS } from '@core/registry';\n\n/**\n * [PIN] Caminho absoluto para o arquivo de baseline principal (usado pelo Sentinela).\n *\n * Usa o sistema de paths centralizado: .tutanus/guardian.baseline.json\n * Com fallback automático para baseline.json legado se necessário.\n */\nexport const LINHA_BASE_CAMINHO = TUTANUS_ARQUIVOS.GUARDIAN_BASELINE;\n\n/**\n * [PIN] Caminho padrão para os registros da Vigia Oculta.\n *\n * Integridade de execução armazenada em .tutanus/integridade.json\n */\nexport const REGISTRO_VIGIA_CAMINHO_PADRAO = TUTANUS_ARQUIVOS.REGISTRO_VIGIA;\n\n/**\n * [KEY] Caminho para a chave pública GPG do Guardian.\n */\nexport const CHAVE_PUBLICA_CAMINHO = TUTANUS_ARQUIVOS.GUARDIAN_CHAVE_PUBLICA;\n\n/**\n * [KEY] Caminho para a chave privada GPG do Guardian.\n */\nexport const CHAVE_PRIVADA_CAMINHO = TUTANUS_ARQUIVOS.GUARDIAN_CHAVE_PRIVADA;"]}
@@ -1 +1 @@
1
- {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/guardian/diff.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { config } from '@core/config';\n\nimport type { ComparacaoSnapshot } from '@';\n\n/**\n * Compara dois snapshots de integridade (hash por arquivo) e retorna as diferenças encontradas.\n */\n\nexport function diffSnapshots(before: Record<string, string>, after: Record<string, string>): ComparacaoSnapshot {\n // Cache intra-processo para evitar recomputar diffs id�nticos em execu��es repetidas\n const key = `${Object.keys(before).length}:${Object.keys(after).length}`;\n const hashBefore = config.GUARDIAN_ENFORCE_PROTECTION ? Object.values(before).join('|') : '';\n const hashAfter = config.GUARDIAN_ENFORCE_PROTECTION ? Object.values(after).join('|') : '';\n const cacheChave = `${key}:${hashBefore}>${hashAfter}`;\n const globalAny = global as unknown as {\n __TUTANUS_DIFF_CACHE__?: Map<string, ComparacaoSnapshot>;\n };\n if (!globalAny.__TUTANUS_DIFF_CACHE__) globalAny.__TUTANUS_DIFF_CACHE__ = new Map();\n const cache = globalAny.__TUTANUS_DIFF_CACHE__;\n if (cache.has(cacheChave)) {\n const globAny = globalAny as unknown as {\n __TUTANUS_DIFF_CACHE_HITS__?: number;\n };\n globAny.__TUTANUS_DIFF_CACHE_HITS__ = (globAny.__TUTANUS_DIFF_CACHE_HITS__ || 0) + 1;\n const hit = cache.get(cacheChave);\n if (hit) return hit;\n }\n const removidos = Object.keys(before).filter(key => !(key in after));\n const adicionados = Object.keys(after).filter(key => !(key in before));\n const alterados = Object.keys(before).filter(key => key in after && before[key] !== after[key]);\n const resultado = {\n removidos,\n adicionados,\n alterados\n };\n cache.set(cacheChave, resultado);\n return resultado;\n}\n\n/**\n * Gera mensagens de erro de integridade com base nas permiss�es configuradas.\n */\n\nexport function verificarErros(diffs: ComparacaoSnapshot): string[] {\n const erros: string[] = [];\n if (diffs.removidos.length > 0 && !config.GUARDIAN_ALLOW_DELS) {\n erros.push(`??? Arquivos removidos: ${diffs.removidos.join(', ')}`);\n }\n if (diffs.adicionados.length > 0 && !config.GUARDIAN_ALLOW_ADDS) {\n erros.push(`?? Arquivos adicionados: ${diffs.adicionados.join(', ')}`);\n }\n if (diffs.alterados.length > 0 && !config.GUARDIAN_ALLOW_CHG) {\n erros.push(`?? Arquivos alterados: ${diffs.alterados.join(', ')}`);\n }\n return erros;\n}"]}
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/guardian/diff.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { config } from '@core/config';\n\nimport type { ComparacaoSnapshot } from '@';\n\n/**\n * Compara dois snapshots de integridade (hash por arquivo) e retorna as diferenças encontradas.\n */\n\nexport function diffSnapshots(before: Record<string, string>, after: Record<string, string>): ComparacaoSnapshot {\n // Cache intra-processo para evitar recomputar diffs idênticos em execuções repetidas\n const key = `${Object.keys(before).length}:${Object.keys(after).length}`;\n const hashBefore = config.GUARDIAN_ENFORCE_PROTECTION ? Object.values(before).join('|') : '';\n const hashAfter = config.GUARDIAN_ENFORCE_PROTECTION ? Object.values(after).join('|') : '';\n const cacheChave = `${key}:${hashBefore}>${hashAfter}`;\n const globalAny = global as unknown as {\n __TUTANUS_DIFF_CACHE__?: Map<string, ComparacaoSnapshot>;\n };\n if (!globalAny.__TUTANUS_DIFF_CACHE__) globalAny.__TUTANUS_DIFF_CACHE__ = new Map();\n const cache = globalAny.__TUTANUS_DIFF_CACHE__;\n if (cache.has(cacheChave)) {\n const globAny = globalAny as unknown as {\n __TUTANUS_DIFF_CACHE_HITS__?: number;\n };\n globAny.__TUTANUS_DIFF_CACHE_HITS__ = (globAny.__TUTANUS_DIFF_CACHE_HITS__ || 0) + 1;\n const hit = cache.get(cacheChave);\n if (hit) return hit;\n }\n const removidos = Object.keys(before).filter(key => !(key in after));\n const adicionados = Object.keys(after).filter(key => !(key in before));\n const alterados = Object.keys(before).filter(key => key in after && before[key] !== after[key]);\n const resultado = {\n removidos,\n adicionados,\n alterados\n };\n cache.set(cacheChave, resultado);\n return resultado;\n}\n\n/**\n * Gera mensagens de erro de integridade com base nas permissões configuradas.\n */\n\nexport function verificarErros(diffs: ComparacaoSnapshot): string[] {\n const erros: string[] = [];\n if (diffs.removidos.length > 0 && !config.GUARDIAN_ALLOW_DELS) {\n erros.push(`??? Arquivos removidos: ${diffs.removidos.join(', ')}`);\n }\n if (diffs.adicionados.length > 0 && !config.GUARDIAN_ALLOW_ADDS) {\n erros.push(`?? Arquivos adicionados: ${diffs.adicionados.join(', ')}`);\n }\n if (diffs.alterados.length > 0 && !config.GUARDIAN_ALLOW_CHG) {\n erros.push(`?? Arquivos alterados: ${diffs.alterados.join(', ')}`);\n }\n return erros;\n}"]}
@@ -59,7 +59,7 @@ export async function analisarAsyncPatterns(ocorrencias, options = {}) {
59
59
  log.info(RelatorioAsyncPatternsMensagens.topArquivos.replace('{total}', String(Math.min(topN, arquivosOrdenados.length))));
60
60
  for (let indice = 0; indice < Math.min(topN, arquivosOrdenados.length); indice++) {
61
61
  const { arquivo, total, nivel } = arquivosOrdenados[indice];
62
- const nivelIcon = nivel === 'erro' ? '🔴' : nivel === 'aviso' ? '[AVISO]' : 'i️';
62
+ const nivelIcon = nivel === 'erro' ? '[RED]' : nivel === 'aviso' ? '[AVISO]' : '[INFO]';
63
63
  log.info(`${indice + 1}. ${nivelIcon} ${arquivo}`);
64
64
  log.info(RelatorioAsyncPatternsMensagens.promiseSemTratamento.replace('{total}', String(total)));
65
65
  log.info(RelatorioAsyncPatternsMensagens.prioridade.replace('{nivel}', nivel.toUpperCase()));
@@ -1 +1 @@
1
- {"version":3,"file":"analise-async-patterns.js","sourceRoot":"","sources":["../../src/reports/analise-async-patterns.ts"],"names":[],"mappings":"AAWA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMnD,MAAM,EACJ,GAAG,EACH,4BAA4B,EAC5B,+BAA+B,EAChC,GAAG,WAAW,EAAE,CAAC;AAKlB,SAAS,kBAAkB,CAAC,OAAe;IACzC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,WAAW,CAAC;IACvD,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,MAAM,CAAC;IAC5E,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,UAAU,CAAC;IACrD,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/E,OAAO,QAAQ,CAAC;AAClB,CAAC;AAKD,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC/C,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAKD,SAAS,iBAAiB,CAAC,WAAyB;IAClD,MAAM,UAAU,GAAG,IAAI,GAAG,EAA8B,CAAC;IACzD,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE;gBACtB,WAAW,EAAE,EAAE;gBACf,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAA8B;gBAC3D,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;QACL,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAA8B;SAC5D,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,IAAI,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAKD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,WAAyB,EAAE,UAAgC,EAAE;IACvG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;IAGhC,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC7H,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5D,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAG1G,MAAM,UAAU,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAGlD,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,EAAyB,EAAE,CAAC,CAAC;QAC1G,OAAO;QACP,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAA8B;KAC3D,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAGxD,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3H,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;QACjF,MAAM,EACJ,OAAO,EACP,KAAK,EACL,KAAK,EACN,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QACjF,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,KAAK,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC;QACnD,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,oBAAoB,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjG,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC/F,CAAC;IAGD,MAAM,UAAU,GAAgD;QAC9D,GAAG,EAAE;YACH,aAAa,EAAE,CAAC;YAChB,aAAa,EAAE,CAAC;SACjB;QACD,SAAS,EAAE;YACT,aAAa,EAAE,CAAC;YAChB,aAAa,EAAE,CAAC;SACjB;QACD,IAAI,EAAE;YACJ,aAAa,EAAE,CAAC;YAChB,aAAa,EAAE,CAAC;SACjB;QACD,QAAQ,EAAE;YACR,aAAa,EAAE,CAAC;YAChB,aAAa,EAAE,CAAC;SACjB;QACD,IAAI,EAAE;YACJ,aAAa,EAAE,CAAC;YAChB,aAAa,EAAE,CAAC;SACjB;QACD,MAAM,EAAE;YACN,aAAa,EAAE,CAAC;YAChB,aAAa,EAAE,CAAC;SACjB;KACF,CAAC;IACF,KAAK,MAAM,EACT,OAAO,EACP,KAAK,EACN,IAAI,iBAAiB,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC9C,UAAU,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC;QACtC,UAAU,CAAC,SAAS,CAAC,CAAC,aAAa,IAAI,KAAK,CAAC;IAC/C,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,qBAAqB,CAAC,CAAC;IAChE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;YAC5B,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,cAAc,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAC3M,CAAC;IACH,CAAC;IAGD,IAAI,OAAO,CAAC,oBAAoB,KAAK,KAAK,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;QAC/E,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;QAC7E,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QACnE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC7D,KAAK,MAAM,EACT,OAAO,EACR,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC1B,GAAG,CAAC,IAAI,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC1D,KAAK,MAAM,EACT,OAAO,EACR,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBACxB,GAAG,CAAC,IAAI,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,cAAc,CAAC,CAAC;QACzD,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,MAAM,CAAC,CAAC;QACjD,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,MAAM,CAAC,CAAC;QACjD,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,MAAM,CAAC,CAAC;QACjD,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IAGD,MAAM,MAAM,GAAwB;QAClC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,WAAW,EAAE,WAAW,CAAC,MAAM;QAC/B,UAAU,EAAE,UAAU,CAAC,IAAI;QAC3B,WAAW,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;QAC7C,UAAU;KACX,CAAC;IACF,IAAI,OAAO,CAAC,oBAAoB,KAAK,KAAK,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;QAC/E,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;QAC7E,MAAM,CAAC,aAAa,GAAG;YACrB,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;YAC9D,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;YACzD,cAAc,EAAE,CAAC,+BAA+B,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,+BAA+B,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,+BAA+B,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,+BAA+B,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;SACzP,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAKD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAA2B,EAAE,aAAqB;IAC3F,MAAM,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC1C,GAAG,CAAC,OAAO,CAAC,4BAA4B,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;AAC/E,CAAC;AAKD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,WAAyB,EAAE,OAAe,EAAE,UAAgC,EAAE;IACvH,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACjE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,4BAA4B,CAAC,CAAC;IAClF,MAAM,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AACpD,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * @fileoverview Análise de padrões async/await\n *\n * Pós-processador de relatórios que analisa ocorrências `unhandled-async`,\n * agrupa por criticidade e gera recomendações priorizadas.\n *\n * Migrado de: scripts/analisar-async-patterns.mjs\n * Data: 2025-11-02\n */\n\nimport path from 'node:path';\n\nimport { getMessages } from '@core/messages';\nimport { salvarEstado } from '@shared/persistence';\n\nimport type { Ocorrencia } from '@';\n\nimport type { AsyncAnalysisOptions, AsyncAnalysisReport, AsyncArquivoRanqueado, AsyncCategoria, AsyncCategoriaStats, AsyncIssuesArquivo } from '../types/reports/async-analysis.js';\n\nconst {\n log,\n MENSAGENS_RELATORIOS_ANALISE,\n RelatorioAsyncPatternsMensagens\n} = getMessages();\n\n/**\n * Categoriza arquivo baseado no path\n */\nfunction categorizarArquivo(relPath: string): AsyncCategoria {\n if (relPath.includes('cli/')) return 'cli';\n if (relPath.includes('analistas/')) return 'analistas';\n if (relPath.includes('core/') || relPath.includes('nucleo/')) return 'core';\n if (relPath.includes('guardian/')) return 'guardian';\n if (relPath.includes('auto/') || relPath.includes('zeladores/')) return 'auto';\n return 'outros';\n}\n\n/**\n * Extrai total de promises de uma mensagem\n */\nfunction extrairTotalPromises(mensagem: string): number {\n const match = mensagem.match(/\\((\\d+) mais\\)/);\n if (match) {\n return parseInt(match[1], 10) + 1;\n }\n return 1;\n}\n\n/**\n * Agrupa ocorrências por arquivo\n */\nfunction agruparPorArquivo(ocorrencias: Ocorrencia[]): Map<string, AsyncIssuesArquivo> {\n const porArquivo = new Map<string, AsyncIssuesArquivo>();\n for (const issue of ocorrencias) {\n const arquivo = issue.relPath;\n if (!porArquivo.has(arquivo)) {\n porArquivo.set(arquivo, {\n ocorrencias: [],\n nivel: (issue.nivel || 'info') as 'erro' | 'aviso' | 'info',\n total: 0\n });\n }\n const info = porArquivo.get(arquivo);\n if (!info) continue;\n info.ocorrencias.push({\n linha: issue.linha,\n mensagem: issue.mensagem,\n nivel: (issue.nivel || 'info') as 'erro' | 'aviso' | 'info'\n });\n info.total += extrairTotalPromises(issue.mensagem);\n }\n return porArquivo;\n}\n\n/**\n * Analisa padrões async/await de um relatório\n */\nexport async function analisarAsyncPatterns(ocorrencias: Ocorrencia[], options: AsyncAnalysisOptions = {}): Promise<AsyncAnalysisReport> {\n const topN = options.topN || 20;\n\n // Filtrar apenas unhandled-async\n const asyncIssues = ocorrencias.filter(ocorrencia => ocorrencia.mensagem && ocorrencia.mensagem.includes('unhandled-async'));\n log.info(MENSAGENS_RELATORIOS_ANALISE.asyncPatterns.titulo);\n log.info(RelatorioAsyncPatternsMensagens.totalOcorrencias.replace('{total}', String(asyncIssues.length)));\n\n // Agrupar por arquivo\n const porArquivo = agruparPorArquivo(asyncIssues);\n\n // Ordenar por total (decrescente)\n const arquivosOrdenados = Array.from(porArquivo.entries()).map(([arquivo, info]): AsyncArquivoRanqueado => ({\n arquivo,\n total: info.total,\n nivel: (info.nivel || 'info') as 'erro' | 'aviso' | 'info'\n })).sort((arquivo, base) => base.total - arquivo.total);\n\n // Top arquivos\n log.info(RelatorioAsyncPatternsMensagens.topArquivos.replace('{total}', String(Math.min(topN, arquivosOrdenados.length))));\n for (let indice = 0; indice < Math.min(topN, arquivosOrdenados.length); indice++) {\n const {\n arquivo,\n total,\n nivel\n } = arquivosOrdenados[indice];\n const nivelIcon = nivel === 'erro' ? '🔴' : nivel === 'aviso' ? '[AVISO]' : 'i️';\n log.info(`${indice + 1}. ${nivelIcon} ${arquivo}`);\n log.info(RelatorioAsyncPatternsMensagens.promiseSemTratamento.replace('{total}', String(total)));\n log.info(RelatorioAsyncPatternsMensagens.prioridade.replace('{nivel}', nivel.toUpperCase()));\n }\n\n // Estatísticas por categoria\n const categorias: Record<AsyncCategoria, AsyncCategoriaStats> = {\n cli: {\n totalArquivos: 0,\n totalPromises: 0\n },\n analistas: {\n totalArquivos: 0,\n totalPromises: 0\n },\n core: {\n totalArquivos: 0,\n totalPromises: 0\n },\n guardian: {\n totalArquivos: 0,\n totalPromises: 0\n },\n auto: {\n totalArquivos: 0,\n totalPromises: 0\n },\n outros: {\n totalArquivos: 0,\n totalPromises: 0\n }\n };\n for (const {\n arquivo,\n total\n } of arquivosOrdenados) {\n const categoria = categorizarArquivo(arquivo);\n categorias[categoria].totalArquivos++;\n categorias[categoria].totalPromises += total;\n }\n log.info(RelatorioAsyncPatternsMensagens.distribuicaoCategoria);\n for (const [cat, stats] of Object.entries(categorias)) {\n if (stats.totalArquivos > 0) {\n log.info(RelatorioAsyncPatternsMensagens.categoriaStats.replace('{categoria}', cat.toUpperCase()).replace('{arquivos}', String(stats.totalArquivos)).replace('{promises}', String(stats.totalPromises)));\n }\n }\n\n // Recomendações\n if (options.includeRecomendacoes !== false) {\n const criticos = arquivosOrdenados.filter(arquivo => arquivo.nivel === 'erro');\n const altos = arquivosOrdenados.filter(arquivo => arquivo.nivel === 'aviso');\n log.info(MENSAGENS_RELATORIOS_ANALISE.asyncPatterns.recomendacoes);\n if (criticos.length > 0) {\n log.info(MENSAGENS_RELATORIOS_ANALISE.asyncPatterns.critico);\n for (const {\n arquivo\n } of criticos.slice(0, 5)) {\n log.info(` - ${arquivo}`);\n }\n }\n if (altos.length > 0) {\n log.info(MENSAGENS_RELATORIOS_ANALISE.asyncPatterns.alto);\n for (const {\n arquivo\n } of altos.slice(0, 10)) {\n log.info(` - ${arquivo}`);\n }\n }\n log.info(RelatorioAsyncPatternsMensagens.proximosPassos);\n log.info(RelatorioAsyncPatternsMensagens.passo1);\n log.info(RelatorioAsyncPatternsMensagens.passo2);\n log.info(RelatorioAsyncPatternsMensagens.passo3);\n log.info(RelatorioAsyncPatternsMensagens.passo4);\n }\n\n // Montar relatório\n const report: AsyncAnalysisReport = {\n timestamp: new Date().toISOString(),\n totalIssues: asyncIssues.length,\n totalFiles: porArquivo.size,\n topArquivos: arquivosOrdenados.slice(0, topN),\n categorias\n };\n if (options.includeRecomendacoes !== false) {\n const criticos = arquivosOrdenados.filter(arquivo => arquivo.nivel === 'erro');\n const altos = arquivosOrdenados.filter(arquivo => arquivo.nivel === 'aviso');\n report.recomendacoes = {\n criticos: criticos.slice(0, 5).map(arquivo => arquivo.arquivo),\n altos: altos.slice(0, 10).map(arquivo => arquivo.arquivo),\n proximosPassos: [RelatorioAsyncPatternsMensagens.passo1.replace('. ', ''), RelatorioAsyncPatternsMensagens.passo2.replace('. ', ''), RelatorioAsyncPatternsMensagens.passo3.replace('. ', ''), RelatorioAsyncPatternsMensagens.passo4.replace('. ', '')]\n };\n }\n return report;\n}\n\n/**\n * Salva relatório de análise async\n */\nexport async function salvarRelatorioAsync(report: AsyncAnalysisReport, outputCaminho: string): Promise<void> {\n await salvarEstado(outputCaminho, report);\n log.sucesso(MENSAGENS_RELATORIOS_ANALISE.asyncPatterns.salvo(outputCaminho));\n}\n\n/**\n * Executa análise completa e salva relatório\n */\nexport async function executarAnaliseAsync(ocorrencias: Ocorrencia[], baseDir: string, options: AsyncAnalysisOptions = {}): Promise<void> {\n const report = await analisarAsyncPatterns(ocorrencias, options);\n const reportCaminho = path.join(baseDir, 'reports', 'async-analysis-report.json');\n await salvarRelatorioAsync(report, reportCaminho);\n}"]}
1
+ {"version":3,"file":"analise-async-patterns.js","sourceRoot":"","sources":["../../src/reports/analise-async-patterns.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * @fileoverview Análise de padrões async/await\n *\n * Pós-processador de relatórios que analisa ocorrências `unhandled-async`,\n * agrupa por criticidade e gera recomendações priorizadas.\n *\n * Migrado de: scripts/analisar-async-patterns.mjs\n * Data: 2025-11-02\n */\n\nimport path from 'node:path';\n\nimport { getMessages } from '@core/messages';\nimport { salvarEstado } from '@shared/persistence';\n\nimport type { Ocorrencia } from '@';\n\nimport type { AsyncAnalysisOptions, AsyncAnalysisReport, AsyncArquivoRanqueado, AsyncCategoria, AsyncCategoriaStats, AsyncIssuesArquivo } from '../types/reports/async-analysis.js';\n\nconst {\n log,\n MENSAGENS_RELATORIOS_ANALISE,\n RelatorioAsyncPatternsMensagens\n} = getMessages();\n\n/**\n * Categoriza arquivo baseado no path\n */\nfunction categorizarArquivo(relPath: string): AsyncCategoria {\n if (relPath.includes('cli/')) return 'cli';\n if (relPath.includes('analistas/')) return 'analistas';\n if (relPath.includes('core/') || relPath.includes('nucleo/')) return 'core';\n if (relPath.includes('guardian/')) return 'guardian';\n if (relPath.includes('auto/') || relPath.includes('zeladores/')) return 'auto';\n return 'outros';\n}\n\n/**\n * Extrai total de promises de uma mensagem\n */\nfunction extrairTotalPromises(mensagem: string): number {\n const match = mensagem.match(/\\((\\d+) mais\\)/);\n if (match) {\n return parseInt(match[1], 10) + 1;\n }\n return 1;\n}\n\n/**\n * Agrupa ocorrências por arquivo\n */\nfunction agruparPorArquivo(ocorrencias: Ocorrencia[]): Map<string, AsyncIssuesArquivo> {\n const porArquivo = new Map<string, AsyncIssuesArquivo>();\n for (const issue of ocorrencias) {\n const arquivo = issue.relPath;\n if (!porArquivo.has(arquivo)) {\n porArquivo.set(arquivo, {\n ocorrencias: [],\n nivel: (issue.nivel || 'info') as 'erro' | 'aviso' | 'info',\n total: 0\n });\n }\n const info = porArquivo.get(arquivo);\n if (!info) continue;\n info.ocorrencias.push({\n linha: issue.linha,\n mensagem: issue.mensagem,\n nivel: (issue.nivel || 'info') as 'erro' | 'aviso' | 'info'\n });\n info.total += extrairTotalPromises(issue.mensagem);\n }\n return porArquivo;\n}\n\n/**\n * Analisa padrões async/await de um relatório\n */\nexport async function analisarAsyncPatterns(ocorrencias: Ocorrencia[], options: AsyncAnalysisOptions = {}): Promise<AsyncAnalysisReport> {\n const topN = options.topN || 20;\n\n // Filtrar apenas unhandled-async\n const asyncIssues = ocorrencias.filter(ocorrencia => ocorrencia.mensagem && ocorrencia.mensagem.includes('unhandled-async'));\n log.info(MENSAGENS_RELATORIOS_ANALISE.asyncPatterns.titulo);\n log.info(RelatorioAsyncPatternsMensagens.totalOcorrencias.replace('{total}', String(asyncIssues.length)));\n\n // Agrupar por arquivo\n const porArquivo = agruparPorArquivo(asyncIssues);\n\n // Ordenar por total (decrescente)\n const arquivosOrdenados = Array.from(porArquivo.entries()).map(([arquivo, info]): AsyncArquivoRanqueado => ({\n arquivo,\n total: info.total,\n nivel: (info.nivel || 'info') as 'erro' | 'aviso' | 'info'\n })).sort((arquivo, base) => base.total - arquivo.total);\n\n // Top arquivos\n log.info(RelatorioAsyncPatternsMensagens.topArquivos.replace('{total}', String(Math.min(topN, arquivosOrdenados.length))));\n for (let indice = 0; indice < Math.min(topN, arquivosOrdenados.length); indice++) {\n const {\n arquivo,\n total,\n nivel\n } = arquivosOrdenados[indice];\n const nivelIcon = nivel === 'erro' ? '[RED]' : nivel === 'aviso' ? '[AVISO]' : '[INFO]';\n log.info(`${indice + 1}. ${nivelIcon} ${arquivo}`);\n log.info(RelatorioAsyncPatternsMensagens.promiseSemTratamento.replace('{total}', String(total)));\n log.info(RelatorioAsyncPatternsMensagens.prioridade.replace('{nivel}', nivel.toUpperCase()));\n }\n\n // Estatísticas por categoria\n const categorias: Record<AsyncCategoria, AsyncCategoriaStats> = {\n cli: {\n totalArquivos: 0,\n totalPromises: 0\n },\n analistas: {\n totalArquivos: 0,\n totalPromises: 0\n },\n core: {\n totalArquivos: 0,\n totalPromises: 0\n },\n guardian: {\n totalArquivos: 0,\n totalPromises: 0\n },\n auto: {\n totalArquivos: 0,\n totalPromises: 0\n },\n outros: {\n totalArquivos: 0,\n totalPromises: 0\n }\n };\n for (const {\n arquivo,\n total\n } of arquivosOrdenados) {\n const categoria = categorizarArquivo(arquivo);\n categorias[categoria].totalArquivos++;\n categorias[categoria].totalPromises += total;\n }\n log.info(RelatorioAsyncPatternsMensagens.distribuicaoCategoria);\n for (const [cat, stats] of Object.entries(categorias)) {\n if (stats.totalArquivos > 0) {\n log.info(RelatorioAsyncPatternsMensagens.categoriaStats.replace('{categoria}', cat.toUpperCase()).replace('{arquivos}', String(stats.totalArquivos)).replace('{promises}', String(stats.totalPromises)));\n }\n }\n\n // Recomendações\n if (options.includeRecomendacoes !== false) {\n const criticos = arquivosOrdenados.filter(arquivo => arquivo.nivel === 'erro');\n const altos = arquivosOrdenados.filter(arquivo => arquivo.nivel === 'aviso');\n log.info(MENSAGENS_RELATORIOS_ANALISE.asyncPatterns.recomendacoes);\n if (criticos.length > 0) {\n log.info(MENSAGENS_RELATORIOS_ANALISE.asyncPatterns.critico);\n for (const {\n arquivo\n } of criticos.slice(0, 5)) {\n log.info(` - ${arquivo}`);\n }\n }\n if (altos.length > 0) {\n log.info(MENSAGENS_RELATORIOS_ANALISE.asyncPatterns.alto);\n for (const {\n arquivo\n } of altos.slice(0, 10)) {\n log.info(` - ${arquivo}`);\n }\n }\n log.info(RelatorioAsyncPatternsMensagens.proximosPassos);\n log.info(RelatorioAsyncPatternsMensagens.passo1);\n log.info(RelatorioAsyncPatternsMensagens.passo2);\n log.info(RelatorioAsyncPatternsMensagens.passo3);\n log.info(RelatorioAsyncPatternsMensagens.passo4);\n }\n\n // Montar relatório\n const report: AsyncAnalysisReport = {\n timestamp: new Date().toISOString(),\n totalIssues: asyncIssues.length,\n totalFiles: porArquivo.size,\n topArquivos: arquivosOrdenados.slice(0, topN),\n categorias\n };\n if (options.includeRecomendacoes !== false) {\n const criticos = arquivosOrdenados.filter(arquivo => arquivo.nivel === 'erro');\n const altos = arquivosOrdenados.filter(arquivo => arquivo.nivel === 'aviso');\n report.recomendacoes = {\n criticos: criticos.slice(0, 5).map(arquivo => arquivo.arquivo),\n altos: altos.slice(0, 10).map(arquivo => arquivo.arquivo),\n proximosPassos: [RelatorioAsyncPatternsMensagens.passo1.replace('. ', ''), RelatorioAsyncPatternsMensagens.passo2.replace('. ', ''), RelatorioAsyncPatternsMensagens.passo3.replace('. ', ''), RelatorioAsyncPatternsMensagens.passo4.replace('. ', '')]\n };\n }\n return report;\n}\n\n/**\n * Salva relatório de análise async\n */\nexport async function salvarRelatorioAsync(report: AsyncAnalysisReport, outputCaminho: string): Promise<void> {\n await salvarEstado(outputCaminho, report);\n log.sucesso(MENSAGENS_RELATORIOS_ANALISE.asyncPatterns.salvo(outputCaminho));\n}\n\n/**\n * Executa análise completa e salva relatório\n */\nexport async function executarAnaliseAsync(ocorrencias: Ocorrencia[], baseDir: string, options: AsyncAnalysisOptions = {}): Promise<void> {\n const report = await analisarAsyncPatterns(ocorrencias, options);\n const reportCaminho = path.join(baseDir, 'reports', 'async-analysis-report.json');\n await salvarRelatorioAsync(report, reportCaminho);\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"filter-smart.js","sourceRoot":"","sources":["../../src/reports/filter-smart.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n// @tutanus-disable tipo-literal-inline-complexo\n// Justificativa: tipos locais para filtragem de relatórios\n// Sistema inteligente de filtragem e priorização de relatórios\n// Agrupa problemas similares e prioriza por impacto para evitar sobrecarga de informação\n\nimport { getMessages } from '@core/messages';\n\nimport type { Ocorrencia, OcorrenciaNivel, ProblemaAgrupado, RelatorioResumo } from '@';\n\n// Prefixos de diretórios de infraestrutura própria — ocorrências nestes caminhos\n// são inerentemente menos relevantes (complexidade esperada da ferramenta)\nconst INFRA_PREFIXES = ['src/analistas/', 'src/core/messages/', 'src/bin/', 'src/cli/', 'src/shared/', 'extensions/', 'vitest.config.ts', 'THIRD-PARTY'];\n\nconst {\n AGRUPAMENTOS_MENSAGEM,\n PRIORIDADES,\n RelatorioMensagens\n} = getMessages();\n\n/**\n * Processa e filtra ocorrências para gerar um relatório resumido inteligente\n */\n\nexport function processarRelatorioResumo(ocorrencias: Ocorrencia[], limitePrioridade = 30): RelatorioResumo {\n // --- Pré-filtragem: identifica e colapsa ocorrências de infraestrutura própria ---\n // Ex: dezenas de \"ml-alta-probabilidade-bugs\" em src/analistas/ são ruído esperado\n const ocorrenciasFiltradas: Ocorrencia[] = [];\n const contagemInfra = new Map<string, number>();\n\n for (const ocorrencia of ocorrencias) {\n const relPath = ocorrencia.relPath || '';\n const isInfraPath = INFRA_PREFIXES.some(prefix => relPath.startsWith(prefix));\n if (isInfraPath) {\n const chave = `${ocorrencia.tipo}::infra`;\n contagemInfra.set(chave, (contagemInfra.get(chave) || 0) + 1);\n // Só inclui a primeira ocorrência de cada tipo em infraestrutura\n // para evitar poluir o relatório — as demais são colapsadas\n if (contagemInfra.get(chave) === 1) {\n ocorrenciasFiltradas.push(ocorrencia);\n }\n continue;\n }\n ocorrenciasFiltradas.push(ocorrencia);\n }\n\n // Adiciona itens colapsados como ocorrência única agregada\n for (const [chave, total] of contagemInfra) {\n const tipo = chave.split('::')[0];\n if (total > 1) {\n ocorrenciasFiltradas.push({\n tipo,\n nivel: 'info',\n relPath: '(infraestrutura interna)',\n linha: 0,\n mensagem: `ML: ${total} ocorrências do tipo \"${tipo}\" em arquivos de infraestrutura interna foram colapsadas (complexidade esperada)`,\n origem: 'filtro-inteligente',\n });\n } else if (total === 1) {\n // A única ocorrência já foi incluída individualmente\n }\n }\n\n const effectiveOcorrencias = ocorrenciasFiltradas.length > 0 ? ocorrenciasFiltradas : ocorrencias;\n\n const { gruposPorTipo, gruposPorMensagem } = agruparOcorrencias(effectiveOcorrencias);\n\n const problemasAgrupados = converterGruposEmProblemas(gruposPorTipo, gruposPorMensagem);\n\n // Ordenar por prioridade e quantidade\n problemasAgrupados.sort((arquivo, base) => {\n const prioridadeOrdem = {\n critica: 0,\n alta: 1,\n media: 2,\n baixa: 3\n };\n const prioA = prioridadeOrdem[arquivo.prioridade];\n const prioB = prioridadeOrdem[base.prioridade];\n if (prioA !== prioB) return prioA - prioB;\n return base.quantidade - arquivo.quantidade; // Mais ocorrências primeiro\n });\n\n // Separar por n�veis de prioridade\n const problemasCriticos = problemasAgrupados.filter(caminho => caminho.prioridade === 'critica');\n const problemasAltos = problemasAgrupados.filter(caminho => caminho.prioridade === 'alta');\n const problemasOutros = problemasAgrupados.filter(caminho => ['media', 'baixa'].includes(caminho.prioridade));\n\n // Calcular estat�sticas\n const arquivosAfetados = new Set(effectiveOcorrencias.map(ocorrencia => ocorrencia.relPath).filter(path => path && path !== 'undefined')).size;\n const problemasPrioritarios = problemasCriticos.length + problemasAltos.length;\n return {\n problemasCriticos: problemasCriticos.slice(0, limitePrioridade / 3),\n problemasAltos: problemasAltos.slice(0, limitePrioridade / 3),\n problemasOutros: problemasOutros.slice(0, limitePrioridade / 3),\n estatisticas: {\n totalOcorrencias: effectiveOcorrencias.length,\n arquivosAfetados,\n problemasPrioritarios,\n problemasAgrupados: problemasAgrupados.length\n }\n };\n}\n\nfunction agruparOcorrencias(ocorrencias: Ocorrencia[]): { gruposPorTipo: Map<string, Ocorrencia[]>; gruposPorMensagem: Map<string, Ocorrencia[]> } {\n const gruposPorTipo = new Map<string, Ocorrencia[]>();\n const gruposPorMensagem = new Map<string, Ocorrencia[]>();\n\n for (const ocorrencia of ocorrencias) {\n const tipo = String(ocorrencia.tipo || 'OUTROS');\n if (!gruposPorTipo.has(tipo)) {\n gruposPorTipo.set(tipo, []);\n }\n const grupo = gruposPorTipo.get(tipo);\n if (grupo) {\n grupo.push(ocorrencia);\n }\n }\n\n for (const ocorrencia of ocorrencias) {\n const mensagem = String(ocorrencia.mensagem || '');\n let agrupado = false;\n for (const grupo of AGRUPAMENTOS_MENSAGEM) {\n if (grupo.padrao.test(mensagem)) {\n if (!gruposPorMensagem.has(grupo.categoria)) {\n gruposPorMensagem.set(grupo.categoria, []);\n }\n const categoriaGrupo = gruposPorMensagem.get(grupo.categoria);\n if (categoriaGrupo) {\n categoriaGrupo.push(ocorrencia);\n }\n agrupado = true;\n break;\n }\n }\n if (!agrupado) {\n const tipo = String(ocorrencia.tipo || 'OUTROS');\n if (!gruposPorMensagem.has(tipo)) {\n gruposPorMensagem.set(tipo, []);\n }\n const tipoGrupo = gruposPorMensagem.get(tipo);\n if (tipoGrupo) {\n tipoGrupo.push(ocorrencia);\n }\n }\n }\n\n return { gruposPorTipo, gruposPorMensagem };\n}\n\nfunction converterGruposEmProblemas(gruposPorTipo: Map<string, Ocorrencia[]>, gruposPorMensagem: Map<string, Ocorrencia[]>): ProblemaAgrupado[] {\n const problemasAgrupados: ProblemaAgrupado[] = [];\n\n for (const [tipo, ocorrenciasTipo] of gruposPorTipo) {\n const config = PRIORIDADES[tipo] || {\n prioridade: 'baixa' as const,\n icone: '??'\n };\n\n const jaAgrupado = Array.from(gruposPorMensagem.keys()).some(categoria => {\n const ocorrenciasGrupo = gruposPorMensagem.get(categoria) || [];\n return ocorrenciasGrupo.some(ocorrencia => ocorrencia.tipo === tipo);\n });\n if (!jaAgrupado && ocorrenciasTipo.length > 0) {\n problemasAgrupados.push({\n categoria: tipo,\n prioridade: config.prioridade,\n icone: config.icone,\n titulo: formatarTituloTipo(tipo),\n quantidade: ocorrenciasTipo.length,\n ocorrencias: ocorrenciasTipo,\n resumo: gerarResumoOcorrencias(ocorrenciasTipo)\n });\n }\n }\n\n for (const agrupamento of AGRUPAMENTOS_MENSAGEM) {\n const ocorrenciasGrupo = gruposPorMensagem.get(agrupamento.categoria) || [];\n if (ocorrenciasGrupo.length > 0) {\n problemasAgrupados.push({\n categoria: agrupamento.categoria,\n prioridade: 'critica',\n icone: '??',\n titulo: agrupamento.titulo,\n quantidade: ocorrenciasGrupo.length,\n ocorrencias: ocorrenciasGrupo,\n resumo: `${ocorrenciasGrupo.length} ocorrências detectadas`,\n acaoSugerida: agrupamento.acaoSugerida\n });\n }\n }\n\n return problemasAgrupados;\n}\n\n/**\n * Formata o título do tipo de problema para exibição\n */\n\nfunction formatarTituloTipo(tipo: string): string {\n const titulos: Record<string, string> = {\n PROBLEMA_SEGURANCA: 'Problemas de Segurança',\n VULNERABILIDADE_SEGURANCA: 'Vulnerabilidades de Segurança',\n CODIGO_FRAGIL: 'Código Frágil',\n PROBLEMA_TESTE: 'Problemas de Teste',\n PROBLEMA_DOCUMENTACAO: 'Problemas de Documentação',\n CONSTRUCOES_SINTATICAS: 'Construções Sintáticas',\n ANALISE_ARQUITETURA: 'Análise de Arquitetura',\n CARACTERISTICAS_ARQUITETURA: 'Características de Arquitetura',\n METRICAS_ARQUITETURA: 'Métricas de Arquitetura',\n TODO_PENDENTE: 'TODOs Pendentes',\n 'padrao-ausente': 'Padrões Ausentes',\n 'estrutura-suspeita': 'Estrutura Suspeita',\n 'estrutura-config': 'Configuração de Estrutura',\n 'estrutura-entrypoints': 'Pontos de Entrada',\n IDENTIFICACAO_PROJETO: 'Identificação do Projeto',\n SUGESTAO_MELHORIA: 'Sugestões de Melhoria',\n EVIDENCIA_CONTEXTO: 'Evidências de Contexto',\n TECNOLOGIAS_ALTERNATIVAS: 'Tecnologias Alternativas'\n };\n return titulos[tipo] || tipo.replace(/_/g, ' ').replace(/\\b\\w/g, linha => linha.toUpperCase());\n}\n\n/**\n * Gera um resumo das ocorrências para exibição\n */\n\nfunction gerarResumoOcorrencias(ocorrencias: Ocorrencia[]): string {\n if (ocorrencias.length === 0) return 'Nenhuma ocorrência';\n const arquivos = new Set(ocorrencias.map(ocorrencia => ocorrencia.relPath).filter(Boolean));\n const niveisFrequentes = {} as Record<OcorrenciaNivel, number>;\n for (const nivel of ocorrencias.map(ocorrencia => ocorrencia.nivel).filter((nivel): nivel is OcorrenciaNivel => Boolean(nivel))) {\n niveisFrequentes[nivel] = (niveisFrequentes[nivel] || 0) + 1;\n }\n const nivelMaisFrequente = Object.entries(niveisFrequentes).sort(([, arquivo], [, base]) => (base ?? 0) - (arquivo ?? 0))[0]?.[0];\n let resumo = `${ocorrencias.length} ocorrências`;\n if (arquivos.size > 1) {\n resumo += ` em ${arquivos.size} arquivos`;\n }\n if (nivelMaisFrequente) {\n resumo += ` (maioria: ${nivelMaisFrequente})`;\n }\n return resumo;\n}\n\n/**\n * Gera relatório Markdown resumido\n */\n\nexport async function gerarRelatorioMarkdownResumo(relatorioResumo: RelatorioResumo, outputCaminho: string): Promise<void> {\n const {\n problemasCriticos,\n problemasAltos,\n problemasOutros,\n estatisticas\n } = relatorioResumo;\n const linhas: string[] = [];\n\n // Cabeçalho usando mensagens centralizadas\n linhas.push(`# ${RelatorioMensagens.resumo.titulo}`);\n linhas.push('');\n linhas.push(`> ${RelatorioMensagens.resumo.introducao}`);\n linhas.push('');\n\n // Estatisticas usando mensagens centralizadas\n linhas.push(`## ${RelatorioMensagens.resumo.secoes.estatisticas.titulo}`);\n linhas.push('');\n linhas.push(`- **${RelatorioMensagens.resumo.secoes.estatisticas.totalOcorrencias}**: ${estatisticas.totalOcorrencias.toLocaleString()}`);\n linhas.push(`- **${RelatorioMensagens.resumo.secoes.estatisticas.arquivosAfetados}**: ${estatisticas.arquivosAfetados.toLocaleString()}`);\n linhas.push(`- **${RelatorioMensagens.resumo.secoes.estatisticas.problemasPrioritarios}**: ${estatisticas.problemasPrioritarios}`);\n linhas.push(`- **${RelatorioMensagens.resumo.secoes.estatisticas.problemasAgrupados}**: ${estatisticas.problemasAgrupados}`);\n linhas.push('');\n\n escreverSecaoProblemasCriticos(linhas, problemasCriticos);\n escreverSecaoProblemasAltos(linhas, problemasAltos);\n escreverSecaoProblemasOutros(linhas, problemasOutros);\n\n // Rodapé\n linhas.push('---');\n linhas.push('');\n linhas.push('?? **Dica**: Para ver todos os detalhes, gere o relatório completo em modo normal.');\n linhas.push('');\n linhas.push(`**Relatório gerado em**: ${new Date().toLocaleString('pt-BR')}`);\n const {\n salvarEstado\n } = await import('@shared/persistence');\n try {\n await salvarEstado(outputCaminho, linhas.join('\\n'));\n } catch (err) {\n const mensagem = err instanceof Error ? err.message : String(err);\n console.error(`Erro ao salvar relatório resumido: ${mensagem}`);\n }\n}\n\nfunction escreverSecaoProblemasCriticos(linhas: string[], problemasCriticos: ProblemaAgrupado[]): void {\n if (problemasCriticos.length === 0) return;\n linhas.push(`## ${RelatorioMensagens.resumo.secoes.criticos.titulo}`);\n linhas.push('');\n for (const problema of problemasCriticos) {\n linhas.push(`### ${problema.icone} ${problema.titulo}`);\n linhas.push('');\n linhas.push(`**${RelatorioMensagens.resumo.labels.quantidade}**: ${problema.quantidade} ocorrências`);\n linhas.push(`**Resumo**: ${problema.resumo}`);\n if (problema.acaoSugerida) {\n linhas.push(`**${RelatorioMensagens.resumo.labels.acaoSugerida}**: ${problema.acaoSugerida}`);\n }\n linhas.push('');\n\n const exemplos = problema.ocorrencias.slice(0, 3);\n if (exemplos.length > 0) {\n linhas.push(`**${RelatorioMensagens.resumo.labels.exemplos}:**`);\n for (const exemplo of exemplos) {\n const arquivo = exemplo.relPath || 'arquivo desconhecido';\n const linha = exemplo.linha ? `:${exemplo.linha}` : '';\n linhas.push(`- \\`${arquivo}${linha}\\`: ${exemplo.mensagem}`);\n }\n if (problema.quantidade > 3) {\n linhas.push(`- ... e mais ${problema.quantidade - 3} ocorrências`);\n }\n linhas.push('');\n }\n }\n}\n\nfunction escreverSecaoProblemasAltos(linhas: string[], problemasAltos: ProblemaAgrupado[]): void {\n if (problemasAltos.length === 0) return;\n linhas.push(`## ${RelatorioMensagens.resumo.secoes.altos.titulo}`);\n linhas.push('');\n for (const problema of problemasAltos) {\n linhas.push(`### ${problema.icone} ${problema.titulo}`);\n linhas.push('');\n linhas.push(`**${RelatorioMensagens.resumo.labels.quantidade}**: ${problema.quantidade} | **Resumo**: ${problema.resumo}`);\n if (problema.acaoSugerida) {\n linhas.push(`**${RelatorioMensagens.resumo.labels.acaoSugerida}**: ${problema.acaoSugerida}`);\n }\n linhas.push('');\n }\n}\n\nfunction escreverSecaoProblemasOutros(linhas: string[], problemasOutros: ProblemaAgrupado[]): void {\n if (problemasOutros.length === 0) return;\n linhas.push(`## ${RelatorioMensagens.resumo.secoes.outros.titulo}`);\n linhas.push('');\n linhas.push('| Categoria | Quantidade | Resumo |');\n linhas.push('|---|---|---|');\n for (const problema of problemasOutros) {\n linhas.push(`| ${problema.icone} ${problema.titulo} | ${problema.quantidade} | ${problema.resumo} |`);\n }\n linhas.push('');\n}\n\n/**\n * Gera resumo executivo mostrando apenas problemas críticos e de alta prioridade\n * Ideal para tomada de decisão e overview rápido\n */\n\nexport function gerarResumoExecutivo(ocorrencias: Ocorrencia[]): {\n problemasCriticos: number;\n problemasAltos: number;\n vulnerabilidades: number;\n quickFixes: number;\n recomendacao: 'verde' | 'amarelo' | 'vermelho';\n mensagem: string;\n detalhes: ProblemaAgrupado[];\n} {\n const relatorio = processarRelatorioResumo(ocorrencias);\n const problemasCriticos = relatorio.problemasCriticos.reduce((sum: number, caminho: ProblemaAgrupado) => sum + caminho.quantidade, 0);\n const problemasAltos = relatorio.problemasAltos.reduce((sum: number, caminho: ProblemaAgrupado) => sum + caminho.quantidade, 0);\n\n // Contadores específicos\n const vulnerabilidades = ocorrencias.filter(ocorrencia => ocorrencia.tipo === 'VULNERABILIDADE_SEGURANCA' || ocorrencia.tipo === 'PROBLEMA_SEGURANCA').length;\n const quickFixes = ocorrencias.filter(ocorrencia => ocorrencia.tipo === 'QUICK_FIX_DISPONIVEL').length;\n\n // Determina recomendação baseada em prioridade\n let recomendacao: 'verde' | 'amarelo' | 'vermelho';\n let mensagem: string;\n if (problemasCriticos > 10) {\n recomendacao = 'vermelho';\n mensagem = `?? CRÍTICO: ${problemasCriticos} problemas de segurança/estabilidade. Ação imediata necessária.`;\n } else if (problemasCriticos > 0 || problemasAltos > 50) {\n recomendacao = 'amarelo';\n mensagem = `?? ATENÇÃO: ${problemasCriticos} críticos, ${problemasAltos} altos. Planeje correções.`;\n } else {\n recomendacao = 'verde';\n mensagem = `? BOM: Apenas problemas menores. ${quickFixes} correções automáticas disponíveis.`;\n }\n return {\n problemasCriticos,\n problemasAltos,\n vulnerabilidades,\n quickFixes,\n recomendacao,\n mensagem,\n detalhes: [...relatorio.problemasCriticos, ...relatorio.problemasAltos]\n };\n}"]}
1
+ {"version":3,"file":"filter-smart.js","sourceRoot":"","sources":["../../src/reports/filter-smart.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n// @tutanus-disable tipo-literal-inline-complexo\n// Justificativa: tipos locais para filtragem de relatórios\n// Sistema inteligente de filtragem e priorização de relatórios\n// Agrupa problemas similares e prioriza por impacto para evitar sobrecarga de informação\n\nimport { getMessages } from '@core/messages';\n\nimport type { Ocorrencia, OcorrenciaNivel, ProblemaAgrupado, RelatorioResumo } from '@';\n\n// Prefixos de diretórios de infraestrutura própria — ocorrências nestes caminhos\n// são inerentemente menos relevantes (complexidade esperada da ferramenta)\nconst INFRA_PREFIXES = ['src/analistas/', 'src/core/messages/', 'src/bin/', 'src/cli/', 'src/shared/', 'extensions/', 'vitest.config.ts', 'THIRD-PARTY'];\n\nconst {\n AGRUPAMENTOS_MENSAGEM,\n PRIORIDADES,\n RelatorioMensagens\n} = getMessages();\n\n/**\n * Processa e filtra ocorrências para gerar um relatório resumido inteligente\n */\n\nexport function processarRelatorioResumo(ocorrencias: Ocorrencia[], limitePrioridade = 30): RelatorioResumo {\n // --- Pré-filtragem: identifica e colapsa ocorrências de infraestrutura própria ---\n // Ex: dezenas de \"ml-alta-probabilidade-bugs\" em src/analistas/ são ruído esperado\n const ocorrenciasFiltradas: Ocorrencia[] = [];\n const contagemInfra = new Map<string, number>();\n\n for (const ocorrencia of ocorrencias) {\n const relPath = ocorrencia.relPath || '';\n const isInfraPath = INFRA_PREFIXES.some(prefix => relPath.startsWith(prefix));\n if (isInfraPath) {\n const chave = `${ocorrencia.tipo}::infra`;\n contagemInfra.set(chave, (contagemInfra.get(chave) || 0) + 1);\n // Só inclui a primeira ocorrência de cada tipo em infraestrutura\n // para evitar poluir o relatório — as demais são colapsadas\n if (contagemInfra.get(chave) === 1) {\n ocorrenciasFiltradas.push(ocorrencia);\n }\n continue;\n }\n ocorrenciasFiltradas.push(ocorrencia);\n }\n\n // Adiciona itens colapsados como ocorrência única agregada\n for (const [chave, total] of contagemInfra) {\n const tipo = chave.split('::')[0];\n if (total > 1) {\n ocorrenciasFiltradas.push({\n tipo,\n nivel: 'info',\n relPath: '(infraestrutura interna)',\n linha: 0,\n mensagem: `ML: ${total} ocorrências do tipo \"${tipo}\" em arquivos de infraestrutura interna foram colapsadas (complexidade esperada)`,\n origem: 'filtro-inteligente',\n });\n } else if (total === 1) {\n // A única ocorrência já foi incluída individualmente\n }\n }\n\n const effectiveOcorrencias = ocorrenciasFiltradas.length > 0 ? ocorrenciasFiltradas : ocorrencias;\n\n const { gruposPorTipo, gruposPorMensagem } = agruparOcorrencias(effectiveOcorrencias);\n\n const problemasAgrupados = converterGruposEmProblemas(gruposPorTipo, gruposPorMensagem);\n\n // Ordenar por prioridade e quantidade\n problemasAgrupados.sort((arquivo, base) => {\n const prioridadeOrdem = {\n critica: 0,\n alta: 1,\n media: 2,\n baixa: 3\n };\n const prioA = prioridadeOrdem[arquivo.prioridade];\n const prioB = prioridadeOrdem[base.prioridade];\n if (prioA !== prioB) return prioA - prioB;\n return base.quantidade - arquivo.quantidade; // Mais ocorrências primeiro\n });\n\n // Separar por níveis de prioridade\n const problemasCriticos = problemasAgrupados.filter(caminho => caminho.prioridade === 'critica');\n const problemasAltos = problemasAgrupados.filter(caminho => caminho.prioridade === 'alta');\n const problemasOutros = problemasAgrupados.filter(caminho => ['media', 'baixa'].includes(caminho.prioridade));\n\n // Calcular estatísticas\n const arquivosAfetados = new Set(effectiveOcorrencias.map(ocorrencia => ocorrencia.relPath).filter(path => path && path !== 'undefined')).size;\n const problemasPrioritarios = problemasCriticos.length + problemasAltos.length;\n return {\n problemasCriticos: problemasCriticos.slice(0, limitePrioridade / 3),\n problemasAltos: problemasAltos.slice(0, limitePrioridade / 3),\n problemasOutros: problemasOutros.slice(0, limitePrioridade / 3),\n estatisticas: {\n totalOcorrencias: effectiveOcorrencias.length,\n arquivosAfetados,\n problemasPrioritarios,\n problemasAgrupados: problemasAgrupados.length\n }\n };\n}\n\nfunction agruparOcorrencias(ocorrencias: Ocorrencia[]): { gruposPorTipo: Map<string, Ocorrencia[]>; gruposPorMensagem: Map<string, Ocorrencia[]> } {\n const gruposPorTipo = new Map<string, Ocorrencia[]>();\n const gruposPorMensagem = new Map<string, Ocorrencia[]>();\n\n for (const ocorrencia of ocorrencias) {\n const tipo = String(ocorrencia.tipo || 'OUTROS');\n if (!gruposPorTipo.has(tipo)) {\n gruposPorTipo.set(tipo, []);\n }\n const grupo = gruposPorTipo.get(tipo);\n if (grupo) {\n grupo.push(ocorrencia);\n }\n }\n\n for (const ocorrencia of ocorrencias) {\n const mensagem = String(ocorrencia.mensagem || '');\n let agrupado = false;\n for (const grupo of AGRUPAMENTOS_MENSAGEM) {\n if (grupo.padrao.test(mensagem)) {\n if (!gruposPorMensagem.has(grupo.categoria)) {\n gruposPorMensagem.set(grupo.categoria, []);\n }\n const categoriaGrupo = gruposPorMensagem.get(grupo.categoria);\n if (categoriaGrupo) {\n categoriaGrupo.push(ocorrencia);\n }\n agrupado = true;\n break;\n }\n }\n if (!agrupado) {\n const tipo = String(ocorrencia.tipo || 'OUTROS');\n if (!gruposPorMensagem.has(tipo)) {\n gruposPorMensagem.set(tipo, []);\n }\n const tipoGrupo = gruposPorMensagem.get(tipo);\n if (tipoGrupo) {\n tipoGrupo.push(ocorrencia);\n }\n }\n }\n\n return { gruposPorTipo, gruposPorMensagem };\n}\n\nfunction converterGruposEmProblemas(gruposPorTipo: Map<string, Ocorrencia[]>, gruposPorMensagem: Map<string, Ocorrencia[]>): ProblemaAgrupado[] {\n const problemasAgrupados: ProblemaAgrupado[] = [];\n\n for (const [tipo, ocorrenciasTipo] of gruposPorTipo) {\n const config = PRIORIDADES[tipo] || {\n prioridade: 'baixa' as const,\n icone: '??'\n };\n\n const jaAgrupado = Array.from(gruposPorMensagem.keys()).some(categoria => {\n const ocorrenciasGrupo = gruposPorMensagem.get(categoria) || [];\n return ocorrenciasGrupo.some(ocorrencia => ocorrencia.tipo === tipo);\n });\n if (!jaAgrupado && ocorrenciasTipo.length > 0) {\n problemasAgrupados.push({\n categoria: tipo,\n prioridade: config.prioridade,\n icone: config.icone,\n titulo: formatarTituloTipo(tipo),\n quantidade: ocorrenciasTipo.length,\n ocorrencias: ocorrenciasTipo,\n resumo: gerarResumoOcorrencias(ocorrenciasTipo)\n });\n }\n }\n\n for (const agrupamento of AGRUPAMENTOS_MENSAGEM) {\n const ocorrenciasGrupo = gruposPorMensagem.get(agrupamento.categoria) || [];\n if (ocorrenciasGrupo.length > 0) {\n problemasAgrupados.push({\n categoria: agrupamento.categoria,\n prioridade: 'critica',\n icone: '??',\n titulo: agrupamento.titulo,\n quantidade: ocorrenciasGrupo.length,\n ocorrencias: ocorrenciasGrupo,\n resumo: `${ocorrenciasGrupo.length} ocorrências detectadas`,\n acaoSugerida: agrupamento.acaoSugerida\n });\n }\n }\n\n return problemasAgrupados;\n}\n\n/**\n * Formata o título do tipo de problema para exibição\n */\n\nfunction formatarTituloTipo(tipo: string): string {\n const titulos: Record<string, string> = {\n PROBLEMA_SEGURANCA: 'Problemas de Segurança',\n VULNERABILIDADE_SEGURANCA: 'Vulnerabilidades de Segurança',\n CODIGO_FRAGIL: 'Código Frágil',\n PROBLEMA_TESTE: 'Problemas de Teste',\n PROBLEMA_DOCUMENTACAO: 'Problemas de Documentação',\n CONSTRUCOES_SINTATICAS: 'Construções Sintáticas',\n ANALISE_ARQUITETURA: 'Análise de Arquitetura',\n CARACTERISTICAS_ARQUITETURA: 'Características de Arquitetura',\n METRICAS_ARQUITETURA: 'Métricas de Arquitetura',\n TODO_PENDENTE: 'TODOs Pendentes',\n 'padrao-ausente': 'Padrões Ausentes',\n 'estrutura-suspeita': 'Estrutura Suspeita',\n 'estrutura-config': 'Configuração de Estrutura',\n 'estrutura-entrypoints': 'Pontos de Entrada',\n IDENTIFICACAO_PROJETO: 'Identificação do Projeto',\n SUGESTAO_MELHORIA: 'Sugestões de Melhoria',\n EVIDENCIA_CONTEXTO: 'Evidências de Contexto',\n TECNOLOGIAS_ALTERNATIVAS: 'Tecnologias Alternativas'\n };\n return titulos[tipo] || tipo.replace(/_/g, ' ').replace(/\\b\\w/g, linha => linha.toUpperCase());\n}\n\n/**\n * Gera um resumo das ocorrências para exibição\n */\n\nfunction gerarResumoOcorrencias(ocorrencias: Ocorrencia[]): string {\n if (ocorrencias.length === 0) return 'Nenhuma ocorrência';\n const arquivos = new Set(ocorrencias.map(ocorrencia => ocorrencia.relPath).filter(Boolean));\n const niveisFrequentes = {} as Record<OcorrenciaNivel, number>;\n for (const nivel of ocorrencias.map(ocorrencia => ocorrencia.nivel).filter((nivel): nivel is OcorrenciaNivel => Boolean(nivel))) {\n niveisFrequentes[nivel] = (niveisFrequentes[nivel] || 0) + 1;\n }\n const nivelMaisFrequente = Object.entries(niveisFrequentes).sort(([, arquivo], [, base]) => (base ?? 0) - (arquivo ?? 0))[0]?.[0];\n let resumo = `${ocorrencias.length} ocorrências`;\n if (arquivos.size > 1) {\n resumo += ` em ${arquivos.size} arquivos`;\n }\n if (nivelMaisFrequente) {\n resumo += ` (maioria: ${nivelMaisFrequente})`;\n }\n return resumo;\n}\n\n/**\n * Gera relatório Markdown resumido\n */\n\nexport async function gerarRelatorioMarkdownResumo(relatorioResumo: RelatorioResumo, outputCaminho: string): Promise<void> {\n const {\n problemasCriticos,\n problemasAltos,\n problemasOutros,\n estatisticas\n } = relatorioResumo;\n const linhas: string[] = [];\n\n // Cabeçalho usando mensagens centralizadas\n linhas.push(`# ${RelatorioMensagens.resumo.titulo}`);\n linhas.push('');\n linhas.push(`> ${RelatorioMensagens.resumo.introducao}`);\n linhas.push('');\n\n // Estatisticas usando mensagens centralizadas\n linhas.push(`## ${RelatorioMensagens.resumo.secoes.estatisticas.titulo}`);\n linhas.push('');\n linhas.push(`- **${RelatorioMensagens.resumo.secoes.estatisticas.totalOcorrencias}**: ${estatisticas.totalOcorrencias.toLocaleString()}`);\n linhas.push(`- **${RelatorioMensagens.resumo.secoes.estatisticas.arquivosAfetados}**: ${estatisticas.arquivosAfetados.toLocaleString()}`);\n linhas.push(`- **${RelatorioMensagens.resumo.secoes.estatisticas.problemasPrioritarios}**: ${estatisticas.problemasPrioritarios}`);\n linhas.push(`- **${RelatorioMensagens.resumo.secoes.estatisticas.problemasAgrupados}**: ${estatisticas.problemasAgrupados}`);\n linhas.push('');\n\n escreverSecaoProblemasCriticos(linhas, problemasCriticos);\n escreverSecaoProblemasAltos(linhas, problemasAltos);\n escreverSecaoProblemasOutros(linhas, problemasOutros);\n\n // Rodapé\n linhas.push('---');\n linhas.push('');\n linhas.push('?? **Dica**: Para ver todos os detalhes, gere o relatório completo em modo normal.');\n linhas.push('');\n linhas.push(`**Relatório gerado em**: ${new Date().toLocaleString('pt-BR')}`);\n const {\n salvarEstado\n } = await import('@shared/persistence');\n try {\n await salvarEstado(outputCaminho, linhas.join('\\n'));\n } catch (err) {\n const mensagem = err instanceof Error ? err.message : String(err);\n console.error(`Erro ao salvar relatório resumido: ${mensagem}`);\n }\n}\n\nfunction escreverSecaoProblemasCriticos(linhas: string[], problemasCriticos: ProblemaAgrupado[]): void {\n if (problemasCriticos.length === 0) return;\n linhas.push(`## ${RelatorioMensagens.resumo.secoes.criticos.titulo}`);\n linhas.push('');\n for (const problema of problemasCriticos) {\n linhas.push(`### ${problema.icone} ${problema.titulo}`);\n linhas.push('');\n linhas.push(`**${RelatorioMensagens.resumo.labels.quantidade}**: ${problema.quantidade} ocorrências`);\n linhas.push(`**Resumo**: ${problema.resumo}`);\n if (problema.acaoSugerida) {\n linhas.push(`**${RelatorioMensagens.resumo.labels.acaoSugerida}**: ${problema.acaoSugerida}`);\n }\n linhas.push('');\n\n const exemplos = problema.ocorrencias.slice(0, 3);\n if (exemplos.length > 0) {\n linhas.push(`**${RelatorioMensagens.resumo.labels.exemplos}:**`);\n for (const exemplo of exemplos) {\n const arquivo = exemplo.relPath || 'arquivo desconhecido';\n const linha = exemplo.linha ? `:${exemplo.linha}` : '';\n linhas.push(`- \\`${arquivo}${linha}\\`: ${exemplo.mensagem}`);\n }\n if (problema.quantidade > 3) {\n linhas.push(`- ... e mais ${problema.quantidade - 3} ocorrências`);\n }\n linhas.push('');\n }\n }\n}\n\nfunction escreverSecaoProblemasAltos(linhas: string[], problemasAltos: ProblemaAgrupado[]): void {\n if (problemasAltos.length === 0) return;\n linhas.push(`## ${RelatorioMensagens.resumo.secoes.altos.titulo}`);\n linhas.push('');\n for (const problema of problemasAltos) {\n linhas.push(`### ${problema.icone} ${problema.titulo}`);\n linhas.push('');\n linhas.push(`**${RelatorioMensagens.resumo.labels.quantidade}**: ${problema.quantidade} | **Resumo**: ${problema.resumo}`);\n if (problema.acaoSugerida) {\n linhas.push(`**${RelatorioMensagens.resumo.labels.acaoSugerida}**: ${problema.acaoSugerida}`);\n }\n linhas.push('');\n }\n}\n\nfunction escreverSecaoProblemasOutros(linhas: string[], problemasOutros: ProblemaAgrupado[]): void {\n if (problemasOutros.length === 0) return;\n linhas.push(`## ${RelatorioMensagens.resumo.secoes.outros.titulo}`);\n linhas.push('');\n linhas.push('| Categoria | Quantidade | Resumo |');\n linhas.push('|---|---|---|');\n for (const problema of problemasOutros) {\n linhas.push(`| ${problema.icone} ${problema.titulo} | ${problema.quantidade} | ${problema.resumo} |`);\n }\n linhas.push('');\n}\n\n/**\n * Gera resumo executivo mostrando apenas problemas críticos e de alta prioridade\n * Ideal para tomada de decisão e overview rápido\n */\n\nexport function gerarResumoExecutivo(ocorrencias: Ocorrencia[]): {\n problemasCriticos: number;\n problemasAltos: number;\n vulnerabilidades: number;\n quickFixes: number;\n recomendacao: 'verde' | 'amarelo' | 'vermelho';\n mensagem: string;\n detalhes: ProblemaAgrupado[];\n} {\n const relatorio = processarRelatorioResumo(ocorrencias);\n const problemasCriticos = relatorio.problemasCriticos.reduce((sum: number, caminho: ProblemaAgrupado) => sum + caminho.quantidade, 0);\n const problemasAltos = relatorio.problemasAltos.reduce((sum: number, caminho: ProblemaAgrupado) => sum + caminho.quantidade, 0);\n\n // Contadores específicos\n const vulnerabilidades = ocorrencias.filter(ocorrencia => ocorrencia.tipo === 'VULNERABILIDADE_SEGURANCA' || ocorrencia.tipo === 'PROBLEMA_SEGURANCA').length;\n const quickFixes = ocorrencias.filter(ocorrencia => ocorrencia.tipo === 'QUICK_FIX_DISPONIVEL').length;\n\n // Determina recomendação baseada em prioridade\n let recomendacao: 'verde' | 'amarelo' | 'vermelho';\n let mensagem: string;\n if (problemasCriticos > 10) {\n recomendacao = 'vermelho';\n mensagem = `?? CRÍTICO: ${problemasCriticos} problemas de segurança/estabilidade. Ação imediata necessária.`;\n } else if (problemasCriticos > 0 || problemasAltos > 50) {\n recomendacao = 'amarelo';\n mensagem = `?? ATENÇÃO: ${problemasCriticos} críticos, ${problemasAltos} altos. Planeje correções.`;\n } else {\n recomendacao = 'verde';\n mensagem = `? BOM: Apenas problemas menores. ${quickFixes} correções automáticas disponíveis.`;\n }\n return {\n problemasCriticos,\n problemasAltos,\n vulnerabilidades,\n quickFixes,\n recomendacao,\n mensagem,\n detalhes: [...relatorio.problemasCriticos, ...relatorio.problemasAltos]\n };\n}"]}
@@ -53,7 +53,7 @@ export function exibirRelatorioZeladorSaude(ocorrencias) {
53
53
  }
54
54
  }
55
55
  function imprimirCabecalhoMoldura() {
56
- const tituloCab = RelatorioMensagens.saude.titulo.replace('🧼 ', '');
56
+ const tituloCab = RelatorioMensagens.saude.titulo.replace('[SOAP] ', '');
57
57
  const linhasCab = [];
58
58
  const logBloco = log;
59
59
  const larguraCab = logBloco.calcularLargura ? logBloco.calcularLargura(tituloCab, linhasCab, config.COMPACT_MODE ? 84 : 96) : undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"report-caretaker-health.js","sourceRoot":"","sources":["../../src/reports/report-caretaker-health.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { estatisticasUsoGlobal } from '@analysts/js-ts/analysts';\nimport { chalk, config } from '@core/config';\nimport { getMessages } from '@core/messages';\n\nimport type { LogComBloco, Ocorrencia } from '@';\n\nconst {\n log,\n logRelatorio,\n RelatorioMensagens,\n RelatorioZeladorSaudeMensagens\n} = getMessages();\n\n/**\n * Emite um relatório sobre a saúde do código com base nas estatísticas gerais.\n */\n\nexport function exibirRelatorioZeladorSaude(ocorrencias: Ocorrencia[]): void {\n // Usa o helper centralizado de molduras, com largura fixa para manter bordas alinhadas\n const constsMap = estatisticasUsoGlobal.consts as Record<string, number> | undefined;\n const requiresMap = estatisticasUsoGlobal.requires as Record<string, number> | undefined;\n const constExcessivas = Object.entries(constsMap || {}).filter(([, node]) => node > 3);\n const requireRepetidos = Object.entries(requiresMap || {}).filter(([, node]) => node > 3);\n\n log.info(`\\n${RelatorioMensagens.saude.titulo}:\\n`);\n\n if (!process.env.VITEST) {\n imprimirCabecalhoMoldura();\n }\n if (ocorrencias.length > 0) {\n const logAviso = (log as LogComBloco).aviso;\n if (typeof logAviso === 'function') logAviso('[AVISO] Funções longas encontradas:');else logRelatorio.funcoesLongas();\n const { porArquivo, totalOcorrencias, arquivosAfetados, maiorPorArquivo } = agregarOcorrenciasPorArquivo(ocorrencias);\n const mostrarTabela = config.RELATORIO_SAUDE_TABELA_ENABLED && !config.VERBOSE;\n const temImprimirBloco = typeof (log as LogComBloco).imprimirBloco === 'function';\n if (mostrarTabela && temImprimirBloco) {\n exibirTabelaComMoldura(totalOcorrencias, arquivosAfetados, maiorPorArquivo);\n } else if (mostrarTabela) {\n exibirTabelaSimples(totalOcorrencias, arquivosAfetados, maiorPorArquivo);\n } else {\n exibirModoVerboso(porArquivo);\n }\n } else {\n log.sucesso(RelatorioMensagens.saude.secoes.funcoesLongas.vazio);\n }\n if (constExcessivas.length > 0) {\n log.info(RelatorioMensagens.saude.secoes.constantesDuplicadas.titulo);\n for (const [nome, qtd] of constExcessivas) {\n log.info(RelatorioZeladorSaudeMensagens.itemLista.replace('{nome}', nome).replace('{qtd}', String(qtd)));\n }\n log.info('');\n }\n if (requireRepetidos.length > 0) {\n log.info(RelatorioMensagens.saude.secoes.modulosRequire.titulo);\n for (const [nome, qtd] of requireRepetidos) {\n log.info(RelatorioZeladorSaudeMensagens.itemLista.replace('{nome}', nome).replace('{qtd}', String(qtd)));\n }\n log.info('');\n }\n\n // Rodapé usando mensagens centralizadas\n log.sucesso(RelatorioMensagens.saude.secoes.fim.titulo);\n if (!process.env.VITEST) {\n imprimirRodapeMoldura();\n }\n}\n\nfunction imprimirCabecalhoMoldura(): void {\n const tituloCab = RelatorioMensagens.saude.titulo.replace('🧼 ', '');\n const linhasCab: string[] = [];\n const logBloco = log as LogComBloco;\n const larguraCab = logBloco.calcularLargura ? logBloco.calcularLargura(tituloCab, linhasCab, config.COMPACT_MODE ? 84 : 96) : undefined;\n logBloco.imprimirBloco(tituloCab, linhasCab, chalk.cyan.bold, typeof larguraCab === 'number' ? larguraCab : config.COMPACT_MODE ? 84 : 96);\n}\n\nfunction agregarOcorrenciasPorArquivo(ocorrencias: Ocorrencia[]): {\n porArquivo: Map<string, number>;\n totalOcorrencias: number;\n arquivosAfetados: number;\n maiorPorArquivo: number;\n} {\n const porArquivo = new Map<string, number>();\n for (const ocorrencia of ocorrencias) {\n const key = ocorrencia.relPath || ocorrencia.arquivo || '[desconhecido]';\n porArquivo.set(key, (porArquivo.get(key) || 0) + 1);\n }\n const totalOcorrencias = ocorrencias.length;\n const arquivosAfetados = porArquivo.size;\n const maiorPorArquivo = Math.max(...Array.from(porArquivo.values()));\n return { porArquivo, totalOcorrencias, arquivosAfetados, maiorPorArquivo };\n}\n\nfunction exibirTabelaComMoldura(totalOcorrencias: number, arquivosAfetados: number, maiorPorArquivo: number): void {\n const logBloco = log as LogComBloco;\n const header1 = RelatorioZeladorSaudeMensagens.headerArquivos;\n const header2 = RelatorioZeladorSaudeMensagens.headerQuantidade;\n const linhas: string[] = [];\n const col1Width = Math.max(header1.length, RelatorioZeladorSaudeMensagens.comFuncaoLonga.length, RelatorioZeladorSaudeMensagens.funcoesLongasTotal.length, RelatorioZeladorSaudeMensagens.maiorPorArquivo.length);\n const col2Width = Math.max(header2.length, String(totalOcorrencias).length, String(arquivosAfetados).length, String(maiorPorArquivo).length);\n const pinta = (node: number) => chalk.yellow(String(node).padStart(col2Width));\n linhas.push(\n `${header1.padEnd(col1Width)} ${header2.padStart(col2Width)}`,\n `${'-'.repeat(col1Width)} ${'-'.repeat(col2Width)}`,\n `${RelatorioZeladorSaudeMensagens.comFuncaoLonga.padEnd(col1Width)} ${pinta(arquivosAfetados)}`,\n `${RelatorioZeladorSaudeMensagens.funcoesLongasTotal.padEnd(col1Width)} ${pinta(totalOcorrencias)}`,\n `${RelatorioZeladorSaudeMensagens.maiorPorArquivo.padEnd(col1Width)} ${pinta(maiorPorArquivo)}`,\n ''.padEnd(col1Width + col2Width + 2, ' '),\n `${RelatorioZeladorSaudeMensagens.modoResumido.padStart(Math.floor(col1Width / 2) + 4).padEnd(col1Width + col2Width + 2)}`\n );\n logBloco.imprimirBloco(RelatorioZeladorSaudeMensagens.funcoesLongasLabel, linhas, chalk.cyan.bold, logBloco.calcularLargura ? logBloco.calcularLargura(RelatorioZeladorSaudeMensagens.funcoesLongasLabel, linhas, config.COMPACT_MODE ? 84 : 96) : 84);\n log.info(RelatorioMensagens.saude.instrucoes.diagnosticoDetalhado);\n log.info(RelatorioMensagens.saude.instrucoes.tabelasVerbosas);\n log.info('');\n}\n\nfunction exibirTabelaSimples(totalOcorrencias: number, arquivosAfetados: number, maiorPorArquivo: number): void {\n const header1 = RelatorioZeladorSaudeMensagens.headerArquivos;\n const header2 = RelatorioZeladorSaudeMensagens.headerQuantidade;\n const col1Width = Math.max(header1.length, RelatorioZeladorSaudeMensagens.comFuncaoLonga.length, RelatorioZeladorSaudeMensagens.funcoesLongasTotal.length, RelatorioZeladorSaudeMensagens.maiorPorArquivo.length);\n const col2Width = Math.max(header2.length, String(totalOcorrencias).length, String(arquivosAfetados).length, String(maiorPorArquivo).length);\n log.info(`${header1.padEnd(col1Width)} ${header2.padStart(col2Width)}`);\n log.info(`${'-'.repeat(col1Width)} ${'-'.repeat(col2Width)}`);\n log.info(`${RelatorioZeladorSaudeMensagens.comFuncaoLonga.padEnd(col1Width)} ${chalk.yellow(String(arquivosAfetados).padStart(col2Width))}`);\n log.info(`${RelatorioZeladorSaudeMensagens.funcoesLongasTotal.padEnd(col1Width)} ${chalk.yellow(String(totalOcorrencias).padStart(col2Width))}`);\n log.info(`${RelatorioZeladorSaudeMensagens.maiorPorArquivo.padEnd(col1Width)} ${chalk.yellow(String(maiorPorArquivo).padStart(col2Width))}`);\n log.info('');\n log.info(RelatorioMensagens.saude.instrucoes.diagnosticoDetalhado);\n log.info(RelatorioMensagens.saude.instrucoes.tabelasVerbosas);\n log.info('');\n}\n\nfunction exibirModoVerboso(porArquivo: Map<string, number>): void {\n const logInfoRaw = ((log as unknown as { infoSemSanitizar: Function }).infoSemSanitizar || log.info).bind(log) as (msg: string) => void;\n const titulo = chalk.bold(RelatorioMensagens.saude.secoes.funcoesLongas.titulo);\n log.info(titulo);\n const colLeft = 50;\n const linhasDetalhe: string[] = [];\n const ordenar = Array.from(porArquivo.entries()).sort((a, b) => b[1] - a[1]);\n for (const [arquivo, qtd] of ordenar) {\n const left = arquivo.length > colLeft ? `...${arquivo.slice(-colLeft + 1)}` : arquivo;\n const numero = chalk.yellow(String(qtd).padStart(3));\n linhasDetalhe.push(`${left.padEnd(colLeft)} ${numero}`);\n }\n for (const linha of linhasDetalhe) logInfoRaw(linha);\n log.info('');\n}\n\nfunction imprimirRodapeMoldura(): void {\n const logBloco = log as LogComBloco;\n const tituloFim = RelatorioMensagens.saude.secoes.fim.titulo;\n const linhasFim: string[] = [RelatorioZeladorSaudeMensagens.mandouBem];\n const larguraFim = logBloco.calcularLargura ? logBloco.calcularLargura(tituloFim, linhasFim, config.COMPACT_MODE ? 84 : 96) : undefined;\n logBloco.imprimirBloco(tituloFim, linhasFim, chalk.green.bold, typeof larguraFim === 'number' ? larguraFim : config.COMPACT_MODE ? 84 : 96);\n}"]}
1
+ {"version":3,"file":"report-caretaker-health.js","sourceRoot":"","sources":["../../src/reports/report-caretaker-health.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { estatisticasUsoGlobal } from '@analysts/js-ts/analysts';\nimport { chalk, config } from '@core/config';\nimport { getMessages } from '@core/messages';\n\nimport type { LogComBloco, Ocorrencia } from '@';\n\nconst {\n log,\n logRelatorio,\n RelatorioMensagens,\n RelatorioZeladorSaudeMensagens\n} = getMessages();\n\n/**\n * Emite um relatório sobre a saúde do código com base nas estatísticas gerais.\n */\n\nexport function exibirRelatorioZeladorSaude(ocorrencias: Ocorrencia[]): void {\n // Usa o helper centralizado de molduras, com largura fixa para manter bordas alinhadas\n const constsMap = estatisticasUsoGlobal.consts as Record<string, number> | undefined;\n const requiresMap = estatisticasUsoGlobal.requires as Record<string, number> | undefined;\n const constExcessivas = Object.entries(constsMap || {}).filter(([, node]) => node > 3);\n const requireRepetidos = Object.entries(requiresMap || {}).filter(([, node]) => node > 3);\n\n log.info(`\\n${RelatorioMensagens.saude.titulo}:\\n`);\n\n if (!process.env.VITEST) {\n imprimirCabecalhoMoldura();\n }\n if (ocorrencias.length > 0) {\n const logAviso = (log as LogComBloco).aviso;\n if (typeof logAviso === 'function') logAviso('[AVISO] Funções longas encontradas:');else logRelatorio.funcoesLongas();\n const { porArquivo, totalOcorrencias, arquivosAfetados, maiorPorArquivo } = agregarOcorrenciasPorArquivo(ocorrencias);\n const mostrarTabela = config.RELATORIO_SAUDE_TABELA_ENABLED && !config.VERBOSE;\n const temImprimirBloco = typeof (log as LogComBloco).imprimirBloco === 'function';\n if (mostrarTabela && temImprimirBloco) {\n exibirTabelaComMoldura(totalOcorrencias, arquivosAfetados, maiorPorArquivo);\n } else if (mostrarTabela) {\n exibirTabelaSimples(totalOcorrencias, arquivosAfetados, maiorPorArquivo);\n } else {\n exibirModoVerboso(porArquivo);\n }\n } else {\n log.sucesso(RelatorioMensagens.saude.secoes.funcoesLongas.vazio);\n }\n if (constExcessivas.length > 0) {\n log.info(RelatorioMensagens.saude.secoes.constantesDuplicadas.titulo);\n for (const [nome, qtd] of constExcessivas) {\n log.info(RelatorioZeladorSaudeMensagens.itemLista.replace('{nome}', nome).replace('{qtd}', String(qtd)));\n }\n log.info('');\n }\n if (requireRepetidos.length > 0) {\n log.info(RelatorioMensagens.saude.secoes.modulosRequire.titulo);\n for (const [nome, qtd] of requireRepetidos) {\n log.info(RelatorioZeladorSaudeMensagens.itemLista.replace('{nome}', nome).replace('{qtd}', String(qtd)));\n }\n log.info('');\n }\n\n // Rodapé usando mensagens centralizadas\n log.sucesso(RelatorioMensagens.saude.secoes.fim.titulo);\n if (!process.env.VITEST) {\n imprimirRodapeMoldura();\n }\n}\n\nfunction imprimirCabecalhoMoldura(): void {\n const tituloCab = RelatorioMensagens.saude.titulo.replace('[SOAP] ', '');\n const linhasCab: string[] = [];\n const logBloco = log as LogComBloco;\n const larguraCab = logBloco.calcularLargura ? logBloco.calcularLargura(tituloCab, linhasCab, config.COMPACT_MODE ? 84 : 96) : undefined;\n logBloco.imprimirBloco(tituloCab, linhasCab, chalk.cyan.bold, typeof larguraCab === 'number' ? larguraCab : config.COMPACT_MODE ? 84 : 96);\n}\n\nfunction agregarOcorrenciasPorArquivo(ocorrencias: Ocorrencia[]): {\n porArquivo: Map<string, number>;\n totalOcorrencias: number;\n arquivosAfetados: number;\n maiorPorArquivo: number;\n} {\n const porArquivo = new Map<string, number>();\n for (const ocorrencia of ocorrencias) {\n const key = ocorrencia.relPath || ocorrencia.arquivo || '[desconhecido]';\n porArquivo.set(key, (porArquivo.get(key) || 0) + 1);\n }\n const totalOcorrencias = ocorrencias.length;\n const arquivosAfetados = porArquivo.size;\n const maiorPorArquivo = Math.max(...Array.from(porArquivo.values()));\n return { porArquivo, totalOcorrencias, arquivosAfetados, maiorPorArquivo };\n}\n\nfunction exibirTabelaComMoldura(totalOcorrencias: number, arquivosAfetados: number, maiorPorArquivo: number): void {\n const logBloco = log as LogComBloco;\n const header1 = RelatorioZeladorSaudeMensagens.headerArquivos;\n const header2 = RelatorioZeladorSaudeMensagens.headerQuantidade;\n const linhas: string[] = [];\n const col1Width = Math.max(header1.length, RelatorioZeladorSaudeMensagens.comFuncaoLonga.length, RelatorioZeladorSaudeMensagens.funcoesLongasTotal.length, RelatorioZeladorSaudeMensagens.maiorPorArquivo.length);\n const col2Width = Math.max(header2.length, String(totalOcorrencias).length, String(arquivosAfetados).length, String(maiorPorArquivo).length);\n const pinta = (node: number) => chalk.yellow(String(node).padStart(col2Width));\n linhas.push(\n `${header1.padEnd(col1Width)} ${header2.padStart(col2Width)}`,\n `${'-'.repeat(col1Width)} ${'-'.repeat(col2Width)}`,\n `${RelatorioZeladorSaudeMensagens.comFuncaoLonga.padEnd(col1Width)} ${pinta(arquivosAfetados)}`,\n `${RelatorioZeladorSaudeMensagens.funcoesLongasTotal.padEnd(col1Width)} ${pinta(totalOcorrencias)}`,\n `${RelatorioZeladorSaudeMensagens.maiorPorArquivo.padEnd(col1Width)} ${pinta(maiorPorArquivo)}`,\n ''.padEnd(col1Width + col2Width + 2, ' '),\n `${RelatorioZeladorSaudeMensagens.modoResumido.padStart(Math.floor(col1Width / 2) + 4).padEnd(col1Width + col2Width + 2)}`\n );\n logBloco.imprimirBloco(RelatorioZeladorSaudeMensagens.funcoesLongasLabel, linhas, chalk.cyan.bold, logBloco.calcularLargura ? logBloco.calcularLargura(RelatorioZeladorSaudeMensagens.funcoesLongasLabel, linhas, config.COMPACT_MODE ? 84 : 96) : 84);\n log.info(RelatorioMensagens.saude.instrucoes.diagnosticoDetalhado);\n log.info(RelatorioMensagens.saude.instrucoes.tabelasVerbosas);\n log.info('');\n}\n\nfunction exibirTabelaSimples(totalOcorrencias: number, arquivosAfetados: number, maiorPorArquivo: number): void {\n const header1 = RelatorioZeladorSaudeMensagens.headerArquivos;\n const header2 = RelatorioZeladorSaudeMensagens.headerQuantidade;\n const col1Width = Math.max(header1.length, RelatorioZeladorSaudeMensagens.comFuncaoLonga.length, RelatorioZeladorSaudeMensagens.funcoesLongasTotal.length, RelatorioZeladorSaudeMensagens.maiorPorArquivo.length);\n const col2Width = Math.max(header2.length, String(totalOcorrencias).length, String(arquivosAfetados).length, String(maiorPorArquivo).length);\n log.info(`${header1.padEnd(col1Width)} ${header2.padStart(col2Width)}`);\n log.info(`${'-'.repeat(col1Width)} ${'-'.repeat(col2Width)}`);\n log.info(`${RelatorioZeladorSaudeMensagens.comFuncaoLonga.padEnd(col1Width)} ${chalk.yellow(String(arquivosAfetados).padStart(col2Width))}`);\n log.info(`${RelatorioZeladorSaudeMensagens.funcoesLongasTotal.padEnd(col1Width)} ${chalk.yellow(String(totalOcorrencias).padStart(col2Width))}`);\n log.info(`${RelatorioZeladorSaudeMensagens.maiorPorArquivo.padEnd(col1Width)} ${chalk.yellow(String(maiorPorArquivo).padStart(col2Width))}`);\n log.info('');\n log.info(RelatorioMensagens.saude.instrucoes.diagnosticoDetalhado);\n log.info(RelatorioMensagens.saude.instrucoes.tabelasVerbosas);\n log.info('');\n}\n\nfunction exibirModoVerboso(porArquivo: Map<string, number>): void {\n const logInfoRaw = ((log as unknown as { infoSemSanitizar: Function }).infoSemSanitizar || log.info).bind(log) as (msg: string) => void;\n const titulo = chalk.bold(RelatorioMensagens.saude.secoes.funcoesLongas.titulo);\n log.info(titulo);\n const colLeft = 50;\n const linhasDetalhe: string[] = [];\n const ordenar = Array.from(porArquivo.entries()).sort((a, b) => b[1] - a[1]);\n for (const [arquivo, qtd] of ordenar) {\n const left = arquivo.length > colLeft ? `...${arquivo.slice(-colLeft + 1)}` : arquivo;\n const numero = chalk.yellow(String(qtd).padStart(3));\n linhasDetalhe.push(`${left.padEnd(colLeft)} ${numero}`);\n }\n for (const linha of linhasDetalhe) logInfoRaw(linha);\n log.info('');\n}\n\nfunction imprimirRodapeMoldura(): void {\n const logBloco = log as LogComBloco;\n const tituloFim = RelatorioMensagens.saude.secoes.fim.titulo;\n const linhasFim: string[] = [RelatorioZeladorSaudeMensagens.mandouBem];\n const larguraFim = logBloco.calcularLargura ? logBloco.calcularLargura(tituloFim, linhasFim, config.COMPACT_MODE ? 84 : 96) : undefined;\n logBloco.imprimirBloco(tituloFim, linhasFim, chalk.green.bold, typeof larguraFim === 'number' ? larguraFim : config.COMPACT_MODE ? 84 : 96);\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/shared/plugins/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAOlD,MAAM,UAAU,wBAAwB;IACtC,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IAGrC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACtC,CAAC;AAMD,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAKD,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,OAAO,EAAE,CAAC,MAAM,CAAC;IACjB,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,kBAAkB;CAC7B,CAAC;AAKF,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,UAAU,EAAE;QACV,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QAC3C,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC;KACnC;IACD,UAAU,EAAE;QACV,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;QAC3B,QAAQ,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,YAAY,CAAC;KAC9C;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;QAC7B,QAAQ,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;KAC3B;IACD,GAAG,EAAE;QACH,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,CAAC,MAAM,CAAC;QACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;KAC1B;IACD,GAAG,EAAE;QACH,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,CAAC,MAAM,CAAC;QACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC;KAChC;IACD,GAAG,EAAE;QACH,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,CAAC,MAAM,CAAC;QACpB,QAAQ,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC;KAChD;IACD,MAAM,EAAE;QACN,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,CAAC,KAAK,CAAC;QACnB,QAAQ,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC;KAChD;CACF,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { corePlugin } from './core-plugin.js';\nimport { getGlobalRegistry } from './registry.js';\n\n/**\n * Inicializa plugins padr�o do Or�culo\n * Registra todos os plugins internos no registry global\n */\n\nexport function initializeDefaultPlugins(): void {\n const registry = getGlobalRegistry();\n\n // Registra plugin core (JS/TS/HTML/CSS/XML)\n registry.registerPlugin(corePlugin);\n}\n\n/**\n * Obtém todos os plugins disponíveis (útil para listagem)\n */\n\nexport function getAvailablePlugins(): string[] {\n return ['core'];\n}\n\n/**\n * Configuração padrão de plugins para o Tutanus\n */\nexport const PADRAO_PLUGIN_CONFIGURACAO = {\n enabled: ['core'],\n autoload: true,\n registry: '@tutanus/plugins'\n};\n\n/**\n * Configuração padrão de suporte a linguagens\n */\nexport const PADRAO_LANGUAGE_SUPORTE = {\n javascript: {\n enabled: true,\n parser: 'core',\n extensions: ['.js', '.jsx', '.mjs', '.cjs'],\n features: ['babel', 'flow', 'jsx']\n },\n typescript: {\n enabled: true,\n parser: 'core',\n extensions: ['.ts', '.tsx'],\n features: ['typescript', 'jsx', 'decorators']\n },\n html: {\n enabled: true,\n parser: 'core',\n extensions: ['.html', '.htm'],\n features: ['html5', 'dom']\n },\n css: {\n enabled: true,\n parser: 'core',\n extensions: ['.css'],\n features: ['css3', 'ast']\n },\n xml: {\n enabled: true,\n parser: 'core',\n extensions: ['.xml'],\n features: ['xml', 'attributes']\n },\n php: {\n enabled: true,\n parser: 'core',\n extensions: ['.php'],\n features: ['heuristic', 'classes', 'functions']\n },\n python: {\n enabled: true,\n parser: 'core',\n extensions: ['.py'],\n features: ['heuristic', 'classes', 'functions']\n }\n};\n"]}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/shared/plugins/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAOlD,MAAM,UAAU,wBAAwB;IACtC,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IAGrC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACtC,CAAC;AAMD,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAKD,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,OAAO,EAAE,CAAC,MAAM,CAAC;IACjB,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,kBAAkB;CAC7B,CAAC;AAKF,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,UAAU,EAAE;QACV,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QAC3C,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC;KACnC;IACD,UAAU,EAAE;QACV,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;QAC3B,QAAQ,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,YAAY,CAAC;KAC9C;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;QAC7B,QAAQ,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;KAC3B;IACD,GAAG,EAAE;QACH,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,CAAC,MAAM,CAAC;QACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;KAC1B;IACD,GAAG,EAAE;QACH,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,CAAC,MAAM,CAAC;QACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC;KAChC;IACD,GAAG,EAAE;QACH,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,CAAC,MAAM,CAAC;QACpB,QAAQ,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC;KAChD;IACD,MAAM,EAAE;QACN,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,CAAC,KAAK,CAAC;QACnB,QAAQ,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC;KAChD;CACF,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { corePlugin } from './core-plugin.js';\nimport { getGlobalRegistry } from './registry.js';\n\n/**\n * Inicializa plugins padrão do Oráculo\n * Registra todos os plugins internos no registry global\n */\n\nexport function initializeDefaultPlugins(): void {\n const registry = getGlobalRegistry();\n\n // Registra plugin core (JS/TS/HTML/CSS/XML)\n registry.registerPlugin(corePlugin);\n}\n\n/**\n * Obtém todos os plugins disponíveis (útil para listagem)\n */\n\nexport function getAvailablePlugins(): string[] {\n return ['core'];\n}\n\n/**\n * Configuração padrão de plugins para o Tutanus\n */\nexport const PADRAO_PLUGIN_CONFIGURACAO = {\n enabled: ['core'],\n autoload: true,\n registry: '@tutanus/plugins'\n};\n\n/**\n * Configuração padrão de suporte a linguagens\n */\nexport const PADRAO_LANGUAGE_SUPORTE = {\n javascript: {\n enabled: true,\n parser: 'core',\n extensions: ['.js', '.jsx', '.mjs', '.cjs'],\n features: ['babel', 'flow', 'jsx']\n },\n typescript: {\n enabled: true,\n parser: 'core',\n extensions: ['.ts', '.tsx'],\n features: ['typescript', 'jsx', 'decorators']\n },\n html: {\n enabled: true,\n parser: 'core',\n extensions: ['.html', '.htm'],\n features: ['html5', 'dom']\n },\n css: {\n enabled: true,\n parser: 'core',\n extensions: ['.css'],\n features: ['css3', 'ast']\n },\n xml: {\n enabled: true,\n parser: 'core',\n extensions: ['.xml'],\n features: ['xml', 'attributes']\n },\n php: {\n enabled: true,\n parser: 'core',\n extensions: ['.php'],\n features: ['heuristic', 'classes', 'functions']\n },\n python: {\n enabled: true,\n parser: 'core',\n extensions: ['.py'],\n features: ['heuristic', 'classes', 'functions']\n }\n};\n"]}