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
package/README.md CHANGED
@@ -309,7 +309,7 @@ O Tutanus lê um arquivo `tutanus.config.json` na raiz do seu projeto. Se não e
309
309
  | `GITHUB_PRIVATE_KEY` | Chave RSA do GitHub App | — |
310
310
  | `GITHUB_WEBHOOK_SECRET` | Webhook secret | — |
311
311
 
312
- > 📖 [Guia de Configuração Completo →](./docs/guias/GUIA-CONFIGURACAO.md)
312
+ > [BOOK] [Guia de Configuração Completo →](./docs/guias/GUIA-CONFIGURACAO.md)
313
313
 
314
314
  ---
315
315
 
@@ -430,7 +430,7 @@ tutanus convert # converter projeto
430
430
  tutanus imports --scan # gerenciar imports
431
431
  ```
432
432
 
433
- > 📖 [Guia de Comandos Completo →](./docs/guias/GUIA-COMANDOS.md)
433
+ > [BOOK] [Guia de Comandos Completo →](./docs/guias/GUIA-COMANDOS.md)
434
434
 
435
435
  ---
436
436
 
@@ -470,7 +470,7 @@ curl -X POST http://localhost:3100/api/v1/diagnosticar \
470
470
  -d '{"async": true, "fast": true}'
471
471
  ```
472
472
 
473
- > 📖 [Documentação da API →](./docs/api/REST-API.md)
473
+ > [BOOK] [Documentação da API →](./docs/api/REST-API.md)
474
474
 
475
475
  ---
476
476
 
@@ -545,7 +545,7 @@ tutanus github-actions gate --threshold 80 # quality gate
545
545
  tutanus github-actions app --port 3000 # iniciar servidor
546
546
  ```
547
547
 
548
- > 📖 [Guia do GitHub App →](./docs/guias/GITHUB-APP.md)
548
+ > [BOOK] [Guia do GitHub App →](./docs/guias/GITHUB-APP.md)
549
549
 
550
550
  ---
551
551
 
@@ -567,7 +567,7 @@ Uma extensão VSCode está disponível em `extensions/vscode/` com:
567
567
  - Painel de resultados
568
568
  - Comandos: Analyze File, Analyze Project, Show Panel, Clear Diagnostics
569
569
 
570
- > 📖 [Guia VSCode →](./docs/guias/GUIA-VSCODE.md)
570
+ > [BOOK] [Guia VSCode →](./docs/guias/GUIA-VSCODE.md)
571
571
 
572
572
  ---
573
573
 
@@ -708,7 +708,7 @@ npm run diagnosticar # auto-análise
708
708
  - **Testes** — aumentar cobertura
709
709
  - **Analisadores** — criar detectores e plugins
710
710
 
711
- > 📖 [Guia: Como Criar Analistas →](./docs/desenvolvimento/analistas/CRIAR-ANALISTA.md)
711
+ > [BOOK] [Guia: Como Criar Analistas →](./docs/desenvolvimento/analistas/CRIAR-ANALISTA.md)
712
712
 
713
713
  ---
714
714
 
@@ -734,5 +734,5 @@ Dependências de terceiros listadas em [THIRD-PARTY-NOTICES.txt](./THIRD-PARTY-N
734
734
  **Feito para os iniciantes** — [Voltar ao topo](#tutanus)
735
735
 
736
736
  </div>
737
- # prometeus
737
+ # tutanus
738
738
 
@@ -1 +1 @@
1
- {"version":3,"file":"converter-base.js","sourceRoot":"","sources":["../../../src/analysts/converters/converter-base.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAgB,aAAa;IAMvB,cAAc,CAAC,QAAgB,EAAE,SAAmB,EAAE,EAAE,QAAkB,EAAE;QACpF,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC;YAC3B,QAAQ;YACR,MAAM;YACN,KAAK;SACN,CAAC;IACJ,CAAC;CACF","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * 🔄 Contrato Base para Conversores de Templates\n */\n\nexport interface ResultadoConversao {\n sucesso: boolean;\n conteudo: string;\n avisos: string[];\n erros: string[];\n}\n\nexport interface Conversor {\n readonly de: string;\n readonly para: string;\n converter(conteudo: string): Promise<ResultadoConversao>;\n}\n\nexport abstract class ConversorBase implements Conversor {\n public abstract readonly de: string;\n public abstract readonly para: string;\n\n public abstract converter(conteudo: string): Promise<ResultadoConversao>;\n\n protected criarResultado(conteudo: string, avisos: string[] = [], erros: string[] = []): ResultadoConversao {\n return {\n sucesso: erros.length === 0,\n conteudo,\n avisos,\n erros\n };\n }\n}\n"]}
1
+ {"version":3,"file":"converter-base.js","sourceRoot":"","sources":["../../../src/analysts/converters/converter-base.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAgB,aAAa;IAMvB,cAAc,CAAC,QAAgB,EAAE,SAAmB,EAAE,EAAE,QAAkB,EAAE;QACpF,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC;YAC3B,QAAQ;YACR,MAAM;YACN,KAAK;SACN,CAAC;IACJ,CAAC;CACF","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * [REFRESH] Contrato Base para Conversores de Templates\n */\n\nexport interface ResultadoConversao {\n sucesso: boolean;\n conteudo: string;\n avisos: string[];\n erros: string[];\n}\n\nexport interface Conversor {\n readonly de: string;\n readonly para: string;\n converter(conteudo: string): Promise<ResultadoConversao>;\n}\n\nexport abstract class ConversorBase implements Conversor {\n public abstract readonly de: string;\n public abstract readonly para: string;\n\n public abstract converter(conteudo: string): Promise<ResultadoConversao>;\n\n protected criarResultado(conteudo: string, avisos: string[] = [], erros: string[] = []): ResultadoConversao {\n return {\n sucesso: erros.length === 0,\n conteudo,\n avisos,\n erros\n };\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"converter-gha-to-gitlab.js","sourceRoot":"","sources":["../../../../src/analysts/converters/engines/converter-gha-to-gitlab.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * [LANCAMENTO] Conversor: GitHub Actions GitLab CI\n *\n * Realiza o mapeamento best-effort de workflows GHA para pipelines GitLab.\n */\n\nimport { Document, parseDocument } from 'yaml';\n\nimport type { ResultadoConversao } from '../converter-base.js';\nimport { ConversorBase } from '../converter-base.js';\n\ninterface JobData {\n name?: string;\n 'runs-on'?: string;\n steps?: Array<{ run?: string; uses?: string }>;\n needs?: string | string[];\n [key: string]: unknown;\n}\n\nexport class ConversorGhaToGitlab extends ConversorBase {\n public readonly de = 'github-actions';\n public readonly para = 'gitlab-ci';\n\n public async converter(conteudo: string): Promise<ResultadoConversao> {\n const avisos: string[] = [];\n const erros: string[] = [];\n\n try {\n const doc = parseDocument(conteudo);\n if (doc.errors.length > 0) {\n throw new Error(doc.errors[0].message);\n }\n\n const gha = doc.toJS() as Record<string, unknown>;\n\n // Estrutura inicial do GitLab CI\n const gitlab: Record<string, unknown> = {\n stages: [] as string[]\n };\n\n // 1. Mapear variáveis globais\n if (gha.env) {\n gitlab.variables = gha.env;\n }\n\n // 2. Mapear Jobs\n if (gha.jobs) {\n const jobs = gha.jobs as Record<string, JobData>;\n const jobsEntries = Object.entries(jobs);\n const stagesSet = new Set<string>();\n\n for (const [jobId, jobData] of jobsEntries) {\n const job = jobData as JobData;\n const gitlabJob: Record<string, unknown> = {\n stage: (job.name ?? jobId).toLowerCase(),\n script: [] as string[]\n };\n\n stagesSet.add(gitlabJob.stage as string);\n\n // Mapear Image (executors)\n if (job['runs-on']) {\n avisos.push(`Job '${jobId}': Mapeamento de 'runs-on: ${job['runs-on']}' para image do GitLab pode exigir ajuste manual.`);\n if (String(job['runs-on']).includes('ubuntu')) {\n gitlabJob.image = 'ubuntu:latest';\n }\n }\n\n // Mapear Steps\n if (job.steps && Array.isArray(job.steps)) {\n const steps = job.steps as Array<{ run?: string; uses?: string }>;\n for (const step of steps) {\n if (step.run) {\n // Limpar comandos de run (remover multi-line pipe se necessário)\n const cmd = String(step.run).trim();\n (gitlabJob.script as string[]).push(cmd);\n } else if (step.uses) {\n // Tratamento especial para checkout\n if (step.uses.includes('actions/checkout')) {\n (gitlabJob.script as string[]).push('# Checkout automático pelo GitLab Runner');\n } else {\n avisos.push(`Job '${jobId}': Action '${step.uses}' detectada. Considere usar um componente equivalente do GitLab ou um script customizado.`);\n (gitlabJob.script as string[]).push(`# TODO: Implementar lógica da action: ${step.uses}`);\n }\n }\n }\n }\n\n // Mapear dependências (needs)\n if (job.needs) {\n gitlabJob.needs = Array.isArray(job.needs) ? job.needs : [job.needs];\n }\n\n // Adicionar o job ao root\n gitlab[jobId] = gitlabJob;\n }\n\n gitlab.stages = Array.from(stagesSet);\n }\n\n // Gerar YAML final\n const outputDoc = new Document(gitlab);\n return this.criarResultado(outputDoc.toString(), avisos, erros);\n\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n return this.criarResultado('', [], [`Falha na conversão: ${msg}`]);\n }\n }\n}"]}
1
+ {"version":3,"file":"converter-gha-to-gitlab.js","sourceRoot":"","sources":["../../../../src/analysts/converters/engines/converter-gha-to-gitlab.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * [LANCAMENTO] Conversor: GitHub Actions [->] GitLab CI\n *\n * Realiza o mapeamento best-effort de workflows GHA para pipelines GitLab.\n */\n\nimport { Document, parseDocument } from 'yaml';\n\nimport type { ResultadoConversao } from '../converter-base.js';\nimport { ConversorBase } from '../converter-base.js';\n\ninterface JobData {\n name?: string;\n 'runs-on'?: string;\n steps?: Array<{ run?: string; uses?: string }>;\n needs?: string | string[];\n [key: string]: unknown;\n}\n\nexport class ConversorGhaToGitlab extends ConversorBase {\n public readonly de = 'github-actions';\n public readonly para = 'gitlab-ci';\n\n public async converter(conteudo: string): Promise<ResultadoConversao> {\n const avisos: string[] = [];\n const erros: string[] = [];\n\n try {\n const doc = parseDocument(conteudo);\n if (doc.errors.length > 0) {\n throw new Error(doc.errors[0].message);\n }\n\n const gha = doc.toJS() as Record<string, unknown>;\n\n // Estrutura inicial do GitLab CI\n const gitlab: Record<string, unknown> = {\n stages: [] as string[]\n };\n\n // 1. Mapear variáveis globais\n if (gha.env) {\n gitlab.variables = gha.env;\n }\n\n // 2. Mapear Jobs\n if (gha.jobs) {\n const jobs = gha.jobs as Record<string, JobData>;\n const jobsEntries = Object.entries(jobs);\n const stagesSet = new Set<string>();\n\n for (const [jobId, jobData] of jobsEntries) {\n const job = jobData as JobData;\n const gitlabJob: Record<string, unknown> = {\n stage: (job.name ?? jobId).toLowerCase(),\n script: [] as string[]\n };\n\n stagesSet.add(gitlabJob.stage as string);\n\n // Mapear Image (executors)\n if (job['runs-on']) {\n avisos.push(`Job '${jobId}': Mapeamento de 'runs-on: ${job['runs-on']}' para image do GitLab pode exigir ajuste manual.`);\n if (String(job['runs-on']).includes('ubuntu')) {\n gitlabJob.image = 'ubuntu:latest';\n }\n }\n\n // Mapear Steps\n if (job.steps && Array.isArray(job.steps)) {\n const steps = job.steps as Array<{ run?: string; uses?: string }>;\n for (const step of steps) {\n if (step.run) {\n // Limpar comandos de run (remover multi-line pipe se necessário)\n const cmd = String(step.run).trim();\n (gitlabJob.script as string[]).push(cmd);\n } else if (step.uses) {\n // Tratamento especial para checkout\n if (step.uses.includes('actions/checkout')) {\n (gitlabJob.script as string[]).push('# Checkout automático pelo GitLab Runner');\n } else {\n avisos.push(`Job '${jobId}': Action '${step.uses}' detectada. Considere usar um componente equivalente do GitLab ou um script customizado.`);\n (gitlabJob.script as string[]).push(`# TODO: Implementar lógica da action: ${step.uses}`);\n }\n }\n }\n }\n\n // Mapear dependências (needs)\n if (job.needs) {\n gitlabJob.needs = Array.isArray(job.needs) ? job.needs : [job.needs];\n }\n\n // Adicionar o job ao root\n gitlab[jobId] = gitlabJob;\n }\n\n gitlab.stages = Array.from(stagesSet);\n }\n\n // Gerar YAML final\n const outputDoc = new Document(gitlab);\n return this.criarResultado(outputDoc.toString(), avisos, erros);\n\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n return this.criarResultado('', [], [`Falha na conversão: ${msg}`]);\n }\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analysts/converters/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAE5E,cAAc,qBAAqB,CAAC;AACpC,cAAc,sCAAsC,CAAC;AACrD,MAAM,CAAC,MAAM,mBAAmB,GAAgB,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;AAK7E,MAAM,UAAU,cAAc,CAAC,EAAU,EAAE,IAAY;IACrD,OAAO,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAC3I,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * 🔄 Registro Central de Conversores\n */\n\nimport type { Conversor } from './converter-base.js';\nimport { ConversorGhaToGitlab } from './engines/converter-gha-to-gitlab.js';\n\nexport * from './converter-base.js';\nexport * from './engines/converter-gha-to-gitlab.js';\nexport const registroConversores: Conversor[] = [new ConversorGhaToGitlab()];\n\n/**\n * Busca um conversor compatível com as plataformas de origem e destino.\n */\nexport function obterConversor(de: string, para: string): Conversor | undefined {\n return registroConversores?.find(elem => elem.de?.toLowerCase() === de.toLowerCase() && elem.para?.toLowerCase() === para.toLowerCase());\n}"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analysts/converters/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAE5E,cAAc,qBAAqB,CAAC;AACpC,cAAc,sCAAsC,CAAC;AACrD,MAAM,CAAC,MAAM,mBAAmB,GAAgB,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;AAK7E,MAAM,UAAU,cAAc,CAAC,EAAU,EAAE,IAAY;IACrD,OAAO,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAC3I,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * [REFRESH] Registro Central de Conversores\n */\n\nimport type { Conversor } from './converter-base.js';\nimport { ConversorGhaToGitlab } from './engines/converter-gha-to-gitlab.js';\n\nexport * from './converter-base.js';\nexport * from './engines/converter-gha-to-gitlab.js';\nexport const registroConversores: Conversor[] = [new ConversorGhaToGitlab()];\n\n/**\n * Busca um conversor compatível com as plataformas de origem e destino.\n */\nexport function obterConversor(de: string, para: string): Conversor | undefined {\n return registroConversores?.find(elem => elem.de?.toLowerCase() === de.toLowerCase() && elem.para?.toLowerCase() === para.toLowerCase());\n}"]}
@@ -225,8 +225,8 @@ export class GerenciadorMapaReversao {
225
225
  const dataFormatada = new Date(move.timestamp).toLocaleString('pt-BR');
226
226
  const reescritos = move.importsReescritos ? ' (imports reescritos)' : '';
227
227
  resultado += `${move.id}:\n`;
228
- resultado += ` 📅 ${dataFormatada}\n`;
229
- resultado += ` 📁 ${move.origem} → ${move.destino}\n`;
228
+ resultado += ` [DATE] ${dataFormatada}\n`;
229
+ resultado += ` [FOLDER] ${move.origem} → ${move.destino}\n`;
230
230
  resultado += ` [COMENTARIO] ${move.motivo}${reescritos}\n\n`;
231
231
  }
232
232
  return resultado;
@@ -1 +1 @@
1
- {"version":3,"file":"map-reversion.js","sourceRoot":"","sources":["../../../src/analysts/corrections/map-reversion.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAI9D,MAAM,EACJ,GAAG,EACH,OAAO,EACP,0BAA0B,EAC3B,GAAG,QAAQ,CAAC;AACb,MAAM,eAAe,GAAG;IACtB,MAAM,EAAE,OAAO;IACf,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,CAAC;IACZ,QAAQ,EAAE,EAAE;CACJ,CAAC;AACX,MAAM,OAAO,uBAAuB;IACjB,QAAQ,CAAS;IAC1B,IAAI,CAAe;IAC3B,YAAY,IAEX;QACC,IAAI,CAAC,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,gBAAgB,CAAC,aAAa,CAAC;QACjE,IAAI,CAAC,IAAI,GAAG;YACV,MAAM,EAAE,eAAe,CAAC,MAAM;YAC9B,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE;gBACR,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,EAAE;gBACd,YAAY,EAAE,IAAI;aACnB;SACF,CAAC;IACJ,CAAC;IAKD,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,SAAS,CAAsB,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI;gBACzE,MAAM,EAAE,eAAe,CAAC,MAAM;gBAC9B,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE;oBACR,UAAU,EAAE,CAAC;oBACb,UAAU,EAAE,EAAE;oBACd,YAAY,EAAE,IAAI;iBACnB;aACF,CAAC;YAGF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxD,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;YACrE,CAAC;YACD,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAGvD,OAAO,CAAC,4BAA4B,EAAE,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,wBAAwB,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;gBAE3D,IAAI,CAAC,IAAI,GAAG;oBACV,MAAM,EAAE,eAAe,CAAC,MAAM;oBAC9B,KAAK,EAAE,EAAE;oBACT,QAAQ,EAAE;wBACR,UAAU,EAAE,CAAC;wBACb,UAAU,EAAE,EAAE;wBACd,YAAY,EAAE,IAAI;qBACnB;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAKD,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAC1C,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YACH,MAAM,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7C,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,sBAAsB,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAKD,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,OAAe,EAAE,MAAc,EAAE,gBAAyB,EAAE,aAAsB,EAEtH,UAAoB;QAClB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;YACjJ,MAAM,IAAI,GAAiB;gBACzB,EAAE;gBACF,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,MAAM;gBACN,OAAO;gBACP,MAAM;gBAGN,iBAAiB,EAAE,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,aAAa,IAAI,gBAAgB,KAAK,aAAa;gBAC9F,gBAAgB;gBAChB,aAAa;aACd,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;YAG/C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YAC1I,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,sBAAsB,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;YACvD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAKD,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAkB,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACjF,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;gBAClB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YACvD,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,sBAAsB,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;YACvD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAKD,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAKD,oBAAoB,CAAC,OAAe;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAkB,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IAC7G,CAAC;IAKD,mBAAmB,CAAC,OAAe;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,CAAC;IAKD,KAAK,CAAC,YAAY,CAAC,EAAU,EAAE,UAAkB,OAAO,CAAC,GAAG,EAAE;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAqB,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC;YAC1C,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACxD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACtD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;gBAC1C,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YAGH,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAGpD,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,gBAAgB,EAAE;wBACvD,QAAQ,EAAE,OAAO;wBACjB,IAAI,EAAE,IAAI;qBACX,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;oBACjD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACtB,OAAO,CAAC,+BAA+B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACrD,OAAO,KAAK,CAAC;oBACf,CAAC;oBACD,IAAK,GAA6B,EAAE,IAAI,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC7F,OAAO,CAAC,wBAAwB,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;wBACzD,OAAO,KAAK,CAAC;oBACf,CAAC;oBACD,MAAM,GAAG,CAAC;gBACZ,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;gBAClC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAK,GAA6B,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACtD,OAAO,CAAC,uCAAuC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBAC9D,OAAO,KAAK,CAAC;oBACf,CAAC;oBACD,MAAM,GAAG,CAAC;gBACZ,CAAC;gBACD,GAAG,CAAC,OAAO,CAAC,0BAA0B,CAAC,wBAAwB,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACvI,CAAC;iBAAM,CAAC;gBAEN,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;gBACjD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;oBACjD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACtB,OAAO,CAAC,uCAAuC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBAC9D,OAAO,KAAK,CAAC;oBACf,CAAC;oBACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACtB,OAAO,CAAC,+BAA+B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACrD,OAAO,KAAK,CAAC;oBACf,CAAC;oBACD,MAAM,GAAG,CAAC;gBACZ,CAAC;gBACD,GAAG,CAAC,OAAO,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/H,CAAC;YAGD,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,wBAAwB,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YAC3D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAKD,KAAK,CAAC,eAAe,CAAC,OAAe,EAAE,UAAkB,OAAO,CAAC,GAAG,EAAE;QACpE,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;QAGD,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAGjI,IAAI,gBAAgB,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC;YACH,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;gBAClC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC5D,IAAI,SAAS;oBAAE,gBAAgB,IAAI,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,wBAAwB,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YAC3D,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,gBAAgB,GAAG,CAAC,CAAC;IAC9B,CAAC;IAKD,WAAW;QACT,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,0BAA0B,CAAC,oBAAoB,CAAC;QACzD,CAAC;QACD,IAAI,SAAS,GAAG,0BAA0B,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAGzG,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAChJ,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;YAClC,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACvE,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,SAAS,IAAI,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC;YAC7B,SAAS,IAAI,QAAQ,aAAa,IAAI,CAAC;YACvC,SAAS,IAAI,QAAQ,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,OAAO,IAAI,CAAC;YACvD,SAAS,IAAI,kBAAkB,IAAI,CAAC,MAAM,GAAG,UAAU,MAAM,CAAC;QAChE,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAKD,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,sBAAsB,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;CACF;AAGD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,uBAAuB,EAAE,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nimport { messages } from '@core/messages';\nimport { TUTANUS_ARQUIVOS } from '@core/registry';\nimport { lerEstado, salvarEstado } from '@shared/persistence';\n\nimport type { MapaReversao, MoveReversao } from '@';\n\nconst {\n log,\n logAuto,\n MapaReversaoExtraMensagens\n} = messages;\nconst CONSTANTES_MAPA = {\n VERSAO: '1.0.0',\n ID_LENGTH: 9,\n ID_OFFSET: 2,\n RADIX_36: 36\n} as const;\nexport class GerenciadorMapaReversao {\n private readonly mapaPath: string;\n private mapa: MapaReversao;\n constructor(opts?: {\n mapaPath?: string;\n }) {\n this.mapaPath = opts?.mapaPath ?? TUTANUS_ARQUIVOS.MAPA_REVERSAO;\n this.mapa = {\n versao: CONSTANTES_MAPA.VERSAO,\n moves: [],\n metadata: {\n totalMoves: 0,\n ultimoMove: '',\n podeReverter: true\n }\n };\n }\n\n /**\n * Carrega o mapa de reversão do disco\n */\n async carregar(): Promise<void> {\n try {\n this.mapa = (await lerEstado<MapaReversao | null>(this.mapaPath, null)) ?? {\n versao: CONSTANTES_MAPA.VERSAO,\n moves: [],\n metadata: {\n totalMoves: 0,\n ultimoMove: '',\n podeReverter: true\n }\n };\n\n // Validação básica\n if (!this.mapa.moves || !Array.isArray(this.mapa.moves)) {\n throw new Error(messages.ExcecoesMensagens.mapaReversaoCorrompido);\n }\n logAuto.mapaReversaoCarregado(this.mapa.moves.length);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n // Não persistimos automaticamente um mapa vazio ao carregar: evitar efeitos colaterais\n // (ex.: chamada a fs.mkdir) durante operações que apenas consultam o mapa.\n logAuto.mapaReversaoNenhumEncontrado();\n } else {\n logAuto.mapaReversaoErroCarregar((error as Error).message);\n // Reinicia com mapa vazio em caso de erro\n this.mapa = {\n versao: CONSTANTES_MAPA.VERSAO,\n moves: [],\n metadata: {\n totalMoves: 0,\n ultimoMove: '',\n podeReverter: true\n }\n };\n }\n }\n }\n\n /**\n * Salva o mapa de reversão no disco\n */\n async salvar(): Promise<void> {\n try {\n await fs.mkdir(path.dirname(this.mapaPath), {\n recursive: true\n });\n await salvarEstado(this.mapaPath, this.mapa);\n log.info(MapaReversaoExtraMensagens.mapaSalvo.replace('{total}', String(this.mapa.moves.length)));\n } catch (error) {\n logAuto.mapaReversaoErroSalvar((error as Error).message);\n }\n }\n\n /**\n * Registra um novo move no mapa de reversão\n */\n async registrarMove(origem: string, destino: string, motivo: string, conteudoOriginal?: string, conteudoFinal?: string,\n // quando true, evita persistir o mapa no disco imediatamente (útil para chamadas em massa/tests)\n skipSalvar?: boolean): Promise<string> {\n try {\n const id = `move_${Date.now()}_${Math.random().toString(CONSTANTES_MAPA.RADIX_36).substr(CONSTANTES_MAPA.ID_OFFSET, CONSTANTES_MAPA.ID_LENGTH)}`;\n const move: MoveReversao = {\n id,\n timestamp: new Date().toISOString(),\n origem,\n destino,\n motivo,\n // Considera que imports foram reescritos se houver conteúdo original\n // fornecido (testes esperam que passar conteudoOriginal permita restauração)\n importsReescritos: !!conteudoOriginal || !!conteudoFinal && conteudoOriginal !== conteudoFinal,\n conteudoOriginal,\n conteudoFinal\n };\n this.mapa.moves.push(move);\n this.mapa.metadata.totalMoves = this.mapa.moves.length;\n this.mapa.metadata.ultimoMove = move.timestamp;\n\n // Persiste no disco por padrão; caller pode optar por adiar a persistência\n if (!skipSalvar) {\n await this.salvar();\n }\n log.info(MapaReversaoExtraMensagens.moveRegistrado.replace('{origem}', origem).replace('{destino}', destino).replace('{motivo}', motivo));\n return id;\n } catch (err) {\n logAuto.mapaReversaoErroSalvar((err as Error).message);\n throw err;\n }\n }\n\n /**\n * Remove um move do mapa de reversão\n */\n async removerMove(id: string): Promise<boolean> {\n try {\n const indice = this.mapa.moves.findIndex((move: MoveReversao) => move.id === id);\n if (indice === -1) {\n return false;\n }\n this.mapa.moves.splice(indice, 1);\n this.mapa.metadata.totalMoves = this.mapa.moves.length;\n await this.salvar();\n logAuto.moveRemovido(id);\n return true;\n } catch (err) {\n logAuto.mapaReversaoErroSalvar((err as Error).message);\n return false;\n }\n }\n\n /**\n * Obtém todos os moves registrados\n */\n obterMoves(): MoveReversao[] {\n return [...this.mapa.moves];\n }\n\n /**\n * Obtém moves por arquivo\n */\n obterMovesPorArquivo(arquivo: string): MoveReversao[] {\n return this.mapa.moves.filter((move: MoveReversao) => move.origem === arquivo || move.destino === arquivo);\n }\n\n /**\n * Verifica se um arquivo pode ser revertido\n */\n podeReverterArquivo(arquivo: string): boolean {\n const moves = this.obterMovesPorArquivo(arquivo);\n return moves.length > 0;\n }\n\n /**\n * Reverte um move específico\n */\n async reverterMove(id: string, baseDir: string = process.cwd()): Promise<boolean> {\n const move = this.mapa.moves.find((metrica: MoveReversao) => metrica.id === id);\n if (!move) {\n logAuto.mapaReversaoMoveNaoEncontrado(id);\n return false;\n }\n try {\n const destinoCaminho = path.join(baseDir, move.destino);\n const origemCaminho = path.join(baseDir, move.origem);\n await fs.mkdir(path.dirname(origemCaminho), {\n recursive: true\n });\n\n // Move o arquivo de volta\n if (move.importsReescritos && move.conteudoOriginal) {\n // Usa flag 'wx' para escrita exclusiva - falha se o arquivo já existir,\n // eliminando a condição de corrida TOCTOU entre stat e write\n try {\n await fs.writeFile(origemCaminho, move.conteudoOriginal, {\n encoding: 'utf-8',\n flag: 'wx'\n });\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'EEXIST') {\n logAuto.mapaReversaoArquivoExisteOrigem(move.origem);\n return false;\n }\n if ((err as NodeJS.ErrnoException)?.code && (err as NodeJS.ErrnoException).code !== 'ENOENT') {\n logAuto.mapaReversaoErroReverter((err as Error).message);\n return false;\n }\n throw err;\n }\n try {\n await fs.unlink(destinoCaminho);\n } catch (err) {\n if ((err as NodeJS.ErrnoException)?.code === 'ENOENT') {\n logAuto.mapaReversaoArquivoDestinoNaoEncontrado(move.destino);\n return false;\n }\n throw err;\n }\n log.sucesso(MapaReversaoExtraMensagens.arquivoRevertidoConteudo.replace('{destino}', move.destino).replace('{origem}', move.origem));\n } else {\n // Usa rename atômico - se destino não existir, falha com ENOENT\n try {\n await fs.rename(destinoCaminho, origemCaminho);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n logAuto.mapaReversaoArquivoDestinoNaoEncontrado(move.destino);\n return false;\n }\n if (code === 'EEXIST') {\n logAuto.mapaReversaoArquivoExisteOrigem(move.origem);\n return false;\n }\n throw err;\n }\n log.sucesso(MapaReversaoExtraMensagens.arquivoRevertido.replace('{destino}', move.destino).replace('{origem}', move.origem));\n }\n\n // Remove o move do mapa\n await this.removerMove(id);\n return true;\n } catch (error) {\n logAuto.mapaReversaoErroReverter((error as Error).message);\n return false;\n }\n }\n\n /**\n * Reverte todos os moves de um arquivo\n */\n async reverterArquivo(arquivo: string, baseDir: string = process.cwd()): Promise<boolean> {\n const moves = this.obterMovesPorArquivo(arquivo);\n if (moves.length === 0) {\n logAuto.mapaReversaoNenhumMove(arquivo);\n return false;\n }\n\n // Reverte do mais recente para o mais antigo\n const movesOrdenados = moves.sort((arquivo, base) => new Date(base.timestamp).getTime() - new Date(arquivo.timestamp).getTime());\n\n // Retorna true se pelo menos um move foi revertido com sucesso\n let revertedContagem = 0;\n try {\n for (const move of movesOrdenados) {\n const resultado = await this.reverterMove(move.id, baseDir);\n if (resultado) revertedContagem += 1;\n }\n } catch (error) {\n logAuto.mapaReversaoErroReverter((error as Error).message);\n return false;\n }\n return revertedContagem > 0;\n }\n\n /**\n * Lista moves em formato legível\n */\n listarMoves(): string {\n if (this.mapa.moves.length === 0) {\n return MapaReversaoExtraMensagens.nenhumMoveRegistrado;\n }\n let resultado = MapaReversaoExtraMensagens.tituloMapa.replace('{total}', String(this.mapa.moves.length));\n\n // Ordena por timestamp (mais recente primeiro)\n const movesOrdenados = [...this.mapa.moves].sort((arquivo, base) => new Date(base.timestamp).getTime() - new Date(arquivo.timestamp).getTime());\n for (const move of movesOrdenados) {\n const dataFormatada = new Date(move.timestamp).toLocaleString('pt-BR');\n const reescritos = move.importsReescritos ? ' (imports reescritos)' : '';\n resultado += `${move.id}:\\n`;\n resultado += ` 📅 ${dataFormatada}\\n`;\n resultado += ` 📁 ${move.origem} → ${move.destino}\\n`;\n resultado += ` [COMENTARIO] ${move.motivo}${reescritos}\\n\\n`;\n }\n return resultado;\n }\n\n /**\n * Limpa o mapa de reversão\n */\n async limpar(): Promise<void> {\n try {\n this.mapa.moves = [];\n this.mapa.metadata.totalMoves = 0;\n this.mapa.metadata.ultimoMove = '';\n await this.salvar();\n log.info(MapaReversaoExtraMensagens.mapaLimpo);\n } catch (err) {\n logAuto.mapaReversaoErroSalvar((err as Error).message);\n }\n }\n}\n\n// Instância global\nexport const mapaReversao = new GerenciadorMapaReversao();"]}
1
+ {"version":3,"file":"map-reversion.js","sourceRoot":"","sources":["../../../src/analysts/corrections/map-reversion.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nimport { messages } from '@core/messages';\nimport { TUTANUS_ARQUIVOS } from '@core/registry';\nimport { lerEstado, salvarEstado } from '@shared/persistence';\n\nimport type { MapaReversao, MoveReversao } from '@';\n\nconst {\n log,\n logAuto,\n MapaReversaoExtraMensagens\n} = messages;\nconst CONSTANTES_MAPA = {\n VERSAO: '1.0.0',\n ID_LENGTH: 9,\n ID_OFFSET: 2,\n RADIX_36: 36\n} as const;\nexport class GerenciadorMapaReversao {\n private readonly mapaPath: string;\n private mapa: MapaReversao;\n constructor(opts?: {\n mapaPath?: string;\n }) {\n this.mapaPath = opts?.mapaPath ?? TUTANUS_ARQUIVOS.MAPA_REVERSAO;\n this.mapa = {\n versao: CONSTANTES_MAPA.VERSAO,\n moves: [],\n metadata: {\n totalMoves: 0,\n ultimoMove: '',\n podeReverter: true\n }\n };\n }\n\n /**\n * Carrega o mapa de reversão do disco\n */\n async carregar(): Promise<void> {\n try {\n this.mapa = (await lerEstado<MapaReversao | null>(this.mapaPath, null)) ?? {\n versao: CONSTANTES_MAPA.VERSAO,\n moves: [],\n metadata: {\n totalMoves: 0,\n ultimoMove: '',\n podeReverter: true\n }\n };\n\n // Validação básica\n if (!this.mapa.moves || !Array.isArray(this.mapa.moves)) {\n throw new Error(messages.ExcecoesMensagens.mapaReversaoCorrompido);\n }\n logAuto.mapaReversaoCarregado(this.mapa.moves.length);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n // Não persistimos automaticamente um mapa vazio ao carregar: evitar efeitos colaterais\n // (ex.: chamada a fs.mkdir) durante operações que apenas consultam o mapa.\n logAuto.mapaReversaoNenhumEncontrado();\n } else {\n logAuto.mapaReversaoErroCarregar((error as Error).message);\n // Reinicia com mapa vazio em caso de erro\n this.mapa = {\n versao: CONSTANTES_MAPA.VERSAO,\n moves: [],\n metadata: {\n totalMoves: 0,\n ultimoMove: '',\n podeReverter: true\n }\n };\n }\n }\n }\n\n /**\n * Salva o mapa de reversão no disco\n */\n async salvar(): Promise<void> {\n try {\n await fs.mkdir(path.dirname(this.mapaPath), {\n recursive: true\n });\n await salvarEstado(this.mapaPath, this.mapa);\n log.info(MapaReversaoExtraMensagens.mapaSalvo.replace('{total}', String(this.mapa.moves.length)));\n } catch (error) {\n logAuto.mapaReversaoErroSalvar((error as Error).message);\n }\n }\n\n /**\n * Registra um novo move no mapa de reversão\n */\n async registrarMove(origem: string, destino: string, motivo: string, conteudoOriginal?: string, conteudoFinal?: string,\n // quando true, evita persistir o mapa no disco imediatamente (útil para chamadas em massa/tests)\n skipSalvar?: boolean): Promise<string> {\n try {\n const id = `move_${Date.now()}_${Math.random().toString(CONSTANTES_MAPA.RADIX_36).substr(CONSTANTES_MAPA.ID_OFFSET, CONSTANTES_MAPA.ID_LENGTH)}`;\n const move: MoveReversao = {\n id,\n timestamp: new Date().toISOString(),\n origem,\n destino,\n motivo,\n // Considera que imports foram reescritos se houver conteúdo original\n // fornecido (testes esperam que passar conteudoOriginal permita restauração)\n importsReescritos: !!conteudoOriginal || !!conteudoFinal && conteudoOriginal !== conteudoFinal,\n conteudoOriginal,\n conteudoFinal\n };\n this.mapa.moves.push(move);\n this.mapa.metadata.totalMoves = this.mapa.moves.length;\n this.mapa.metadata.ultimoMove = move.timestamp;\n\n // Persiste no disco por padrão; caller pode optar por adiar a persistência\n if (!skipSalvar) {\n await this.salvar();\n }\n log.info(MapaReversaoExtraMensagens.moveRegistrado.replace('{origem}', origem).replace('{destino}', destino).replace('{motivo}', motivo));\n return id;\n } catch (err) {\n logAuto.mapaReversaoErroSalvar((err as Error).message);\n throw err;\n }\n }\n\n /**\n * Remove um move do mapa de reversão\n */\n async removerMove(id: string): Promise<boolean> {\n try {\n const indice = this.mapa.moves.findIndex((move: MoveReversao) => move.id === id);\n if (indice === -1) {\n return false;\n }\n this.mapa.moves.splice(indice, 1);\n this.mapa.metadata.totalMoves = this.mapa.moves.length;\n await this.salvar();\n logAuto.moveRemovido(id);\n return true;\n } catch (err) {\n logAuto.mapaReversaoErroSalvar((err as Error).message);\n return false;\n }\n }\n\n /**\n * Obtém todos os moves registrados\n */\n obterMoves(): MoveReversao[] {\n return [...this.mapa.moves];\n }\n\n /**\n * Obtém moves por arquivo\n */\n obterMovesPorArquivo(arquivo: string): MoveReversao[] {\n return this.mapa.moves.filter((move: MoveReversao) => move.origem === arquivo || move.destino === arquivo);\n }\n\n /**\n * Verifica se um arquivo pode ser revertido\n */\n podeReverterArquivo(arquivo: string): boolean {\n const moves = this.obterMovesPorArquivo(arquivo);\n return moves.length > 0;\n }\n\n /**\n * Reverte um move específico\n */\n async reverterMove(id: string, baseDir: string = process.cwd()): Promise<boolean> {\n const move = this.mapa.moves.find((metrica: MoveReversao) => metrica.id === id);\n if (!move) {\n logAuto.mapaReversaoMoveNaoEncontrado(id);\n return false;\n }\n try {\n const destinoCaminho = path.join(baseDir, move.destino);\n const origemCaminho = path.join(baseDir, move.origem);\n await fs.mkdir(path.dirname(origemCaminho), {\n recursive: true\n });\n\n // Move o arquivo de volta\n if (move.importsReescritos && move.conteudoOriginal) {\n // Usa flag 'wx' para escrita exclusiva - falha se o arquivo já existir,\n // eliminando a condição de corrida TOCTOU entre stat e write\n try {\n await fs.writeFile(origemCaminho, move.conteudoOriginal, {\n encoding: 'utf-8',\n flag: 'wx'\n });\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'EEXIST') {\n logAuto.mapaReversaoArquivoExisteOrigem(move.origem);\n return false;\n }\n if ((err as NodeJS.ErrnoException)?.code && (err as NodeJS.ErrnoException).code !== 'ENOENT') {\n logAuto.mapaReversaoErroReverter((err as Error).message);\n return false;\n }\n throw err;\n }\n try {\n await fs.unlink(destinoCaminho);\n } catch (err) {\n if ((err as NodeJS.ErrnoException)?.code === 'ENOENT') {\n logAuto.mapaReversaoArquivoDestinoNaoEncontrado(move.destino);\n return false;\n }\n throw err;\n }\n log.sucesso(MapaReversaoExtraMensagens.arquivoRevertidoConteudo.replace('{destino}', move.destino).replace('{origem}', move.origem));\n } else {\n // Usa rename atômico - se destino não existir, falha com ENOENT\n try {\n await fs.rename(destinoCaminho, origemCaminho);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n logAuto.mapaReversaoArquivoDestinoNaoEncontrado(move.destino);\n return false;\n }\n if (code === 'EEXIST') {\n logAuto.mapaReversaoArquivoExisteOrigem(move.origem);\n return false;\n }\n throw err;\n }\n log.sucesso(MapaReversaoExtraMensagens.arquivoRevertido.replace('{destino}', move.destino).replace('{origem}', move.origem));\n }\n\n // Remove o move do mapa\n await this.removerMove(id);\n return true;\n } catch (error) {\n logAuto.mapaReversaoErroReverter((error as Error).message);\n return false;\n }\n }\n\n /**\n * Reverte todos os moves de um arquivo\n */\n async reverterArquivo(arquivo: string, baseDir: string = process.cwd()): Promise<boolean> {\n const moves = this.obterMovesPorArquivo(arquivo);\n if (moves.length === 0) {\n logAuto.mapaReversaoNenhumMove(arquivo);\n return false;\n }\n\n // Reverte do mais recente para o mais antigo\n const movesOrdenados = moves.sort((arquivo, base) => new Date(base.timestamp).getTime() - new Date(arquivo.timestamp).getTime());\n\n // Retorna true se pelo menos um move foi revertido com sucesso\n let revertedContagem = 0;\n try {\n for (const move of movesOrdenados) {\n const resultado = await this.reverterMove(move.id, baseDir);\n if (resultado) revertedContagem += 1;\n }\n } catch (error) {\n logAuto.mapaReversaoErroReverter((error as Error).message);\n return false;\n }\n return revertedContagem > 0;\n }\n\n /**\n * Lista moves em formato legível\n */\n listarMoves(): string {\n if (this.mapa.moves.length === 0) {\n return MapaReversaoExtraMensagens.nenhumMoveRegistrado;\n }\n let resultado = MapaReversaoExtraMensagens.tituloMapa.replace('{total}', String(this.mapa.moves.length));\n\n // Ordena por timestamp (mais recente primeiro)\n const movesOrdenados = [...this.mapa.moves].sort((arquivo, base) => new Date(base.timestamp).getTime() - new Date(arquivo.timestamp).getTime());\n for (const move of movesOrdenados) {\n const dataFormatada = new Date(move.timestamp).toLocaleString('pt-BR');\n const reescritos = move.importsReescritos ? ' (imports reescritos)' : '';\n resultado += `${move.id}:\\n`;\n resultado += ` [DATE] ${dataFormatada}\\n`;\n resultado += ` [FOLDER] ${move.origem} → ${move.destino}\\n`;\n resultado += ` [COMENTARIO] ${move.motivo}${reescritos}\\n\\n`;\n }\n return resultado;\n }\n\n /**\n * Limpa o mapa de reversão\n */\n async limpar(): Promise<void> {\n try {\n this.mapa.moves = [];\n this.mapa.metadata.totalMoves = 0;\n this.mapa.metadata.ultimoMove = '';\n await this.salvar();\n log.info(MapaReversaoExtraMensagens.mapaLimpo);\n } catch (err) {\n logAuto.mapaReversaoErroSalvar((err as Error).message);\n }\n }\n}\n\n// Instância global\nexport const mapaReversao = new GerenciadorMapaReversao();"]}
@@ -45,9 +45,9 @@ function dividirPendencias(pendencias, reativar, _agora) {
45
45
  }
46
46
  const { AUTOANALISE_CONCURRENCY: CONCORRENCIA = 5, ZELADOR_ABANDONED_DIR: DIR_ABANDONADOS, ZELADOR_PENDING_PATH: PATH_PENDENTES, ZELADOR_REACTIVATE_PATH: PATH_REATIVAR, ZELADOR_HISTORY_PATH: PATH_HISTORICO, ZELADOR_REPORT_PATH: PATH_RELATORIO } = config;
47
47
  export async function executarPodaCiclica(executarRealmente = false) {
48
- log.info('\n🌿 Iniciando poda automática...\n');
48
+ log.info('\n[HERB] Iniciando poda automática...\n');
49
49
  if (!executarRealmente) {
50
- log.aviso('🧪 Modo de simulação ativado (SIMULADO). Nenhum arquivo será movido.\n');
50
+ log.aviso('[TEST] Modo de simulação ativado (SIMULADO). Nenhum arquivo será movido.\n');
51
51
  }
52
52
  const base = process.cwd();
53
53
  const agora = Date.now();
@@ -69,7 +69,7 @@ export async function executarPodaCiclica(executarRealmente = false) {
69
69
  await moverArquivos(aPodar, base, historico);
70
70
  await salvarEstado(PATH_PENDENTES, aManter);
71
71
  await salvarEstado(PATH_HISTORICO, historico);
72
- log.sucesso('🧹 Podagem concluída.');
72
+ log.sucesso('[BROOM] Podagem concluída.');
73
73
  }
74
74
  else {
75
75
  logAuto.podaPodandoSimulado(aPodar.length);
@@ -1 +1 @@
1
- {"version":3,"file":"pruning.js","sourceRoot":"","sources":["../../../src/analysts/corrections/pruning.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport path from 'node:path';\n\nimport { detectarFantasmas } from '@analysts/detectors';\nimport { config } from '@core/config';\nimport { getMessages } from '@core/messages';\nimport { gerarRelatorioPodaJson, gerarRelatorioPodaMarkdown } from '@reports';\nimport { ensureDir } from '@shared/helpers';\nimport { lerEstado, salvarEstado } from '@shared/persistence';\nimport pLimit from 'p-limit';\n\nimport type { FileEntryWithAst, HistoricoItem, Pendencia, ResultadoPoda } from '@';\n\nconst {\n log,\n logAuto\n} = getMessages();\nexport async function removerArquivosOrfaos(_fileEntries: FileEntryWithAst[] /*executarRealmente = false*/): Promise<ResultadoPoda> {\n const {\n fantasmas\n } = await detectarFantasmas();\n return {\n arquivosOrfaos: fantasmas\n };\n}\nfunction gerarPendencias(fantasmas: {\n arquivo: string;\n referenciado?: boolean;\n}[], agora: number): Pendencia[] {\n return fantasmas.map(arquivo => ({\n arquivo: arquivo.arquivo,\n motivo: arquivo.referenciado ? 'inativo' : 'órfão',\n detectedAt: agora,\n scheduleAt: agora\n }));\n}\nfunction mesclarPendencias(anteriores: Pendencia[], novos: Pendencia[]): Pendencia[] {\n const mapa = new Map<string, Pendencia>();\n for (const caminho of anteriores) mapa.set(caminho.arquivo, caminho);\n for (const caminho of novos) mapa.set(caminho.arquivo, caminho);\n return Array.from(mapa.values());\n}\nfunction dividirPendencias(pendencias: Pendencia[], reativar: string[], _agora: number): [Pendencia[], Pendencia[]] {\n const aManter: Pendencia[] = [];\n const aPodar: Pendencia[] = [];\n const reativarSet = new Set(reativar);\n for (const caminho of pendencias) {\n if (reativarSet.has(caminho.arquivo)) {\n aManter.push(caminho);\n } else {\n aPodar.push(caminho);\n }\n }\n return [aManter, aPodar];\n}\nconst {\n AUTOANALISE_CONCURRENCY: CONCORRENCIA = 5,\n ZELADOR_ABANDONED_DIR: DIR_ABANDONADOS,\n ZELADOR_PENDING_PATH: PATH_PENDENTES,\n ZELADOR_REACTIVATE_PATH: PATH_REATIVAR,\n ZELADOR_HISTORY_PATH: PATH_HISTORICO,\n ZELADOR_REPORT_PATH: PATH_RELATORIO\n} = config;\nexport async function executarPodaCiclica(executarRealmente = false): Promise<void> {\n log.info('\\n🌿 Iniciando poda automática...\\n');\n if (!executarRealmente) {\n log.aviso('🧪 Modo de simulação ativado (SIMULADO). Nenhum arquivo será movido.\\n');\n }\n const base = process.cwd();\n const agora = Date.now();\n const [anteriores, reativar, historico] = await Promise.all([lerEstado<Pendencia[]>(PATH_PENDENTES), lerEstado<string[]>(PATH_REATIVAR), lerEstado<HistoricoItem[]>(PATH_HISTORICO)]);\n const {\n fantasmas\n } = await detectarFantasmas();\n const novos = gerarPendencias(fantasmas, agora);\n const unicos = mesclarPendencias(anteriores, novos);\n const [aManter, aPodar] = dividirPendencias(unicos, reativar, agora);\n if (!aPodar.length) {\n logAuto.podaNenhumArquivo();\n await gerarRelatorioPodaMarkdown(PATH_RELATORIO.replace(/\\.json$/, '.md'), aPodar, aManter, {\n simulado: !executarRealmente\n });\n await gerarRelatorioPodaJson(PATH_RELATORIO, aPodar, aManter);\n return;\n }\n if (executarRealmente) {\n logAuto.podaPodando(aPodar.length);\n await moverArquivos(aPodar, base, historico);\n await salvarEstado(PATH_PENDENTES, aManter);\n await salvarEstado(PATH_HISTORICO, historico);\n log.sucesso('🧹 Podagem concluída.');\n } else {\n // Mesmo em simulação, mostramos contagem para cobrir mensagem esperada\n logAuto.podaPodandoSimulado(aPodar.length);\n moverArquivosSimulado(aPodar, base);\n }\n}\nfunction moverArquivosSimulado(lista: Pendencia[], base: string): void {\n log.info(`Simulando movimentação para ${DIR_ABANDONADOS}:\\n`);\n for (const pendencia of lista) {\n const destino = path.join(base, DIR_ABANDONADOS, pendencia.arquivo);\n log.info(` → SIMULADO: '${pendencia.arquivo}' → '${path.relative(base, destino)}'`);\n }\n log.info('');\n}\nasync function moverArquivos(lista: Pendencia[], base: string, historico: HistoricoItem[]): Promise<void> {\n const limitar = pLimit(CONCORRENCIA);\n await Promise.all(lista.map(pend => limitar(async () => {\n const src = path.join(base, pend.arquivo);\n const dest = path.join(base, DIR_ABANDONADOS, pend.arquivo);\n try {\n const fs = await import('node:fs');\n await ensureDir(dest);\n await fs.promises.rename(src, dest);\n historico.push({\n arquivo: pend.arquivo,\n movidoEm: new Date().toISOString(),\n motivo: pend.motivo\n });\n logAuto.podaArquivoMovido(pend.arquivo);\n } catch (err) {\n log.erro(`[ERRO] Falha ao mover ${pend.arquivo}: ${typeof err === 'object' && err && 'message' in err ? (err as {\n message: string;\n }).message : String(err)}`);\n }\n })));\n}"]}
1
+ {"version":3,"file":"pruning.js","sourceRoot":"","sources":["../../../src/analysts/corrections/pruning.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport path from 'node:path';\n\nimport { detectarFantasmas } from '@analysts/detectors';\nimport { config } from '@core/config';\nimport { getMessages } from '@core/messages';\nimport { gerarRelatorioPodaJson, gerarRelatorioPodaMarkdown } from '@reports';\nimport { ensureDir } from '@shared/helpers';\nimport { lerEstado, salvarEstado } from '@shared/persistence';\nimport pLimit from 'p-limit';\n\nimport type { FileEntryWithAst, HistoricoItem, Pendencia, ResultadoPoda } from '@';\n\nconst {\n log,\n logAuto\n} = getMessages();\nexport async function removerArquivosOrfaos(_fileEntries: FileEntryWithAst[] /*executarRealmente = false*/): Promise<ResultadoPoda> {\n const {\n fantasmas\n } = await detectarFantasmas();\n return {\n arquivosOrfaos: fantasmas\n };\n}\nfunction gerarPendencias(fantasmas: {\n arquivo: string;\n referenciado?: boolean;\n}[], agora: number): Pendencia[] {\n return fantasmas.map(arquivo => ({\n arquivo: arquivo.arquivo,\n motivo: arquivo.referenciado ? 'inativo' : 'órfão',\n detectedAt: agora,\n scheduleAt: agora\n }));\n}\nfunction mesclarPendencias(anteriores: Pendencia[], novos: Pendencia[]): Pendencia[] {\n const mapa = new Map<string, Pendencia>();\n for (const caminho of anteriores) mapa.set(caminho.arquivo, caminho);\n for (const caminho of novos) mapa.set(caminho.arquivo, caminho);\n return Array.from(mapa.values());\n}\nfunction dividirPendencias(pendencias: Pendencia[], reativar: string[], _agora: number): [Pendencia[], Pendencia[]] {\n const aManter: Pendencia[] = [];\n const aPodar: Pendencia[] = [];\n const reativarSet = new Set(reativar);\n for (const caminho of pendencias) {\n if (reativarSet.has(caminho.arquivo)) {\n aManter.push(caminho);\n } else {\n aPodar.push(caminho);\n }\n }\n return [aManter, aPodar];\n}\nconst {\n AUTOANALISE_CONCURRENCY: CONCORRENCIA = 5,\n ZELADOR_ABANDONED_DIR: DIR_ABANDONADOS,\n ZELADOR_PENDING_PATH: PATH_PENDENTES,\n ZELADOR_REACTIVATE_PATH: PATH_REATIVAR,\n ZELADOR_HISTORY_PATH: PATH_HISTORICO,\n ZELADOR_REPORT_PATH: PATH_RELATORIO\n} = config;\nexport async function executarPodaCiclica(executarRealmente = false): Promise<void> {\n log.info('\\n[HERB] Iniciando poda automática...\\n');\n if (!executarRealmente) {\n log.aviso('[TEST] Modo de simulação ativado (SIMULADO). Nenhum arquivo será movido.\\n');\n }\n const base = process.cwd();\n const agora = Date.now();\n const [anteriores, reativar, historico] = await Promise.all([lerEstado<Pendencia[]>(PATH_PENDENTES), lerEstado<string[]>(PATH_REATIVAR), lerEstado<HistoricoItem[]>(PATH_HISTORICO)]);\n const {\n fantasmas\n } = await detectarFantasmas();\n const novos = gerarPendencias(fantasmas, agora);\n const unicos = mesclarPendencias(anteriores, novos);\n const [aManter, aPodar] = dividirPendencias(unicos, reativar, agora);\n if (!aPodar.length) {\n logAuto.podaNenhumArquivo();\n await gerarRelatorioPodaMarkdown(PATH_RELATORIO.replace(/\\.json$/, '.md'), aPodar, aManter, {\n simulado: !executarRealmente\n });\n await gerarRelatorioPodaJson(PATH_RELATORIO, aPodar, aManter);\n return;\n }\n if (executarRealmente) {\n logAuto.podaPodando(aPodar.length);\n await moverArquivos(aPodar, base, historico);\n await salvarEstado(PATH_PENDENTES, aManter);\n await salvarEstado(PATH_HISTORICO, historico);\n log.sucesso('[BROOM] Podagem concluída.');\n } else {\n // Mesmo em simulação, mostramos contagem para cobrir mensagem esperada\n logAuto.podaPodandoSimulado(aPodar.length);\n moverArquivosSimulado(aPodar, base);\n }\n}\nfunction moverArquivosSimulado(lista: Pendencia[], base: string): void {\n log.info(`Simulando movimentação para ${DIR_ABANDONADOS}:\\n`);\n for (const pendencia of lista) {\n const destino = path.join(base, DIR_ABANDONADOS, pendencia.arquivo);\n log.info(` → SIMULADO: '${pendencia.arquivo}' → '${path.relative(base, destino)}'`);\n }\n log.info('');\n}\nasync function moverArquivos(lista: Pendencia[], base: string, historico: HistoricoItem[]): Promise<void> {\n const limitar = pLimit(CONCORRENCIA);\n await Promise.all(lista.map(pend => limitar(async () => {\n const src = path.join(base, pend.arquivo);\n const dest = path.join(base, DIR_ABANDONADOS, pend.arquivo);\n try {\n const fs = await import('node:fs');\n await ensureDir(dest);\n await fs.promises.rename(src, dest);\n historico.push({\n arquivo: pend.arquivo,\n movidoEm: new Date().toISOString(),\n motivo: pend.motivo\n });\n logAuto.podaArquivoMovido(pend.arquivo);\n } catch (err) {\n log.erro(`[ERRO] Falha ao mover ${pend.arquivo}: ${typeof err === 'object' && err && 'message' in err ? (err as {\n message: string;\n }).message : String(err)}`);\n }\n })));\n}"]}
@@ -214,7 +214,7 @@ export const analistaRecomendacaoArquitetura = {
214
214
  nivel: 'info',
215
215
  relPath: _relPath,
216
216
  linha: 1,
217
- mensagem: `🎯 Arquitetura recomendada: ${arquiteturaRecomendada} (${confianca}% confiança)`
217
+ mensagem: `[TARGET] Arquitetura recomendada: ${arquiteturaRecomendada} (${confianca}% confiança)`
218
218
  }));
219
219
  if (sinaisCleanArch.length > 0) {
220
220
  ocorrencias.push(criarOcorrencia({
@@ -240,7 +240,7 @@ export const analistaRecomendacaoArquitetura = {
240
240
  nivel: 'info',
241
241
  relPath: _relPath,
242
242
  linha: 1,
243
- mensagem: `💡 ${rec}`
243
+ mensagem: `[IDEA] ${rec}`
244
244
  }));
245
245
  }
246
246
  return ocorrencias;
@@ -1 +1 @@
1
- {"version":3,"file":"detector-recommendation-architecture.js","sourceRoot":"","sources":["../../../src/analysts/detectors/detector-recommendation-architecture.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport type { Analista, ContextoExecucao, Ocorrencia } from '@';\nimport { criarOcorrencia } from '@';\n\n/**\n * Analista global que analisa o projeto completo e recomenda\n * a melhor arquitetura (Clean Architecture, Microsserviços, MVC, etc.)\n */\nexport const analistaRecomendacaoArquitetura: Analista = {\n nome: 'recomendacao-arquitetura',\n categoria: 'arquitetura',\n descricao: 'Analisa o projeto e recomenda a melhor arquitetura a ser aplicada',\n global: true,\n test: () => true,\n aplicar: async (_src: string, _relPath: string, _ast: unknown, _fullCaminho?: string, contexto?: ContextoExecucao): Promise<Ocorrencia[]> => {\n if (!contexto) return [];\n\n const ocorrencias: Ocorrencia[] = [];\n const caminhos = contexto.arquivos.map(a => a.relPath.toLowerCase());\n const conteudos = contexto.arquivos.map(a => a.content?.toLowerCase() || '');\n\n // === SINAIS PARA CLEAN ARCHITECTURE ===\n let scoreCleanArch = 0;\n const sinaisCleanArch: string[] = [];\n\n // Domain layer\n const temEntities = caminhos.some(c => c.includes('/entities/') || c.endsWith('entity.ts') || c.endsWith('entity.js'));\n const temValueObjects = caminhos.some(c => c.includes('value-object') || c.includes('value_object'));\n const temDomainServices = caminhos.some(c => c.includes('/domain/') && c.includes('service'));\n const temDomainEvents = caminhos.some(c => c.includes('domain-event') || c.includes('domain_events'));\n\n if (temEntities) { scoreCleanArch += 15; sinaisCleanArch.push('Entidades de domínio'); }\n if (temValueObjects) { scoreCleanArch += 10; sinaisCleanArch.push('Value Objects'); }\n if (temDomainServices) { scoreCleanArch += 10; sinaisCleanArch.push('Serviços de domínio'); }\n if (temDomainEvents) { scoreCleanArch += 10; sinaisCleanArch.push('Eventos de domínio'); }\n\n // Application layer\n const temUseCases = caminhos.some(c => c.includes('/use-cases') || c.includes('/usecases') || c.includes('/application/'));\n const temPorts = caminhos.some(c => c.includes('/ports/') || c.includes('/application/port'));\n const temDtos = caminhos.some(c => c.includes('/dto/') || c.endsWith('.dto.ts') || c.endsWith('.dto.js'));\n\n if (temUseCases) { scoreCleanArch += 15; sinaisCleanArch.push('Casos de uso (use-cases)'); }\n if (temPorts) { scoreCleanArch += 10; sinaisCleanArch.push('Ports'); }\n if (temDtos) { scoreCleanArch += 10; sinaisCleanArch.push('DTOs'); }\n\n // Infrastructure layer\n const temInfra = caminhos.some(c => c.includes('/infrastructure/') || c.includes('/infra/'));\n const temRepositories = caminhos.some(c => c.includes('/repositories/') || c.endsWith('.repository.ts'));\n const temGateways = caminhos.some(c => c.includes('/gateways/'));\n\n if (temInfra) { scoreCleanArch += 10; sinaisCleanArch.push('Camada de infraestrutura'); }\n if (temRepositories) { scoreCleanArch += 10; sinaisCleanArch.push('Implementações de repositório'); }\n if (temGateways) { scoreCleanArch += 5; sinaisCleanArch.push('Gateways'); }\n\n // Presentation layer\n const temControllers = caminhos.some(c => c.includes('/controllers/') || c.endsWith('.controller.ts'));\n const temPresenters = caminhos.some(c => c.includes('/presenters/') || c.endsWith('.presenter.ts'));\n\n if (temControllers) { scoreCleanArch += 10; sinaisCleanArch.push('Controllers'); }\n if (temPresenters) { scoreCleanArch += 5; sinaisCleanArch.push('Presenters'); }\n\n // DI Container\n const temDI = conteudos.some(c => c.includes('tsyringe') || c.includes('inversify') || c.includes('awilix') || c.includes('typedi'));\n if (temDI) { scoreCleanArch += 5; sinaisCleanArch.push('Container DI'); }\n\n // === SINAIS PARA ARQUITETURA DISTRIBUÍDA ===\n let scoreDistributed = 0;\n const sinaisDistributed: string[] = [];\n\n // Múltiplos serviços\n const servicosSet = new Set<string>();\n for (const c of caminhos) {\n const match = c.match(/services\\/([^/]+)/);\n if (match) servicosSet.add(match[1]);\n }\n\n if (servicosSet.size >= 2) { scoreDistributed += 20; sinaisDistributed.push(`${servicosSet.size} boundaries de serviço`); }\n else if (servicosSet.size === 1) { scoreDistributed += 10; sinaisDistributed.push('1 boundary de serviço'); }\n\n // Mensageria\n const temMensageria = caminhos.some(c =>\n c.includes('/events/') || c.includes('/messaging') || c.includes('/queues') ||\n c.includes('/consumers') || c.includes('/producers')\n );\n const temMensageriaDeps = conteudos.some(c =>\n c.includes('kafkajs') || c.includes('amqplib') || c.includes('ioredis') ||\n c.includes('bull') || c.includes('bullmq') || c.includes('nats')\n );\n\n if (temMensageria || temMensageriaDeps) { scoreDistributed += 15; sinaisDistributed.push('Mensageria'); }\n\n // API Gateway\n const temGateway = caminhos.some(c => c.includes('/gateway') || c.includes('/api-gateway'));\n if (temGateway) { scoreDistributed += 15; sinaisDistributed.push('API Gateway'); }\n\n // Service Discovery\n const temDiscovery = caminhos.some(c => c.includes('/discovery') || c.includes('consul') || c.includes('eureka'));\n if (temDiscovery) { scoreDistributed += 10; sinaisDistributed.push('Service Discovery'); }\n\n // Docker/Container\n const temDocker = caminhos.some(c => c.endsWith('dockerfile') || c.includes('docker-compose'));\n if (temDocker) { scoreDistributed += 10; sinaisDistributed.push('Docker'); }\n\n // K8s\n const temK8s = caminhos.some(c => c.includes('kubernetes') || c.includes('k8s/'));\n if (temK8s) { scoreDistributed += 10; sinaisDistributed.push('Kubernetes'); }\n\n // Event-driven patterns\n const temEventDriven = conteudos.filter(c =>\n c.includes('eventemitter') || c.includes('publish') || c.includes('subscribe') ||\n c.includes('webhook') || c.includes('observable')\n ).length > 3;\n if (temEventDriven) { scoreDistributed += 10; sinaisDistributed.push('Padrões event-driven'); }\n\n // Monitoring\n const temMonitoring = caminhos.some(c => c.includes('/health') || c.includes('/monitoring') || c.includes('/metrics'));\n if (temMonitoring) { scoreDistributed += 10; sinaisDistributed.push('Monitoramento'); }\n\n // Shared lib\n const temShared = caminhos.some(c => c.includes('/shared/') || c.includes('/common/'));\n if (temShared) { scoreDistributed += 5; sinaisDistributed.push('Biblioteca compartilhada'); }\n\n // === DECISÃO DA ARQUITETURA ===\n const totalArquivos = contexto.arquivos.length;\n const complexidadeBaixa = totalArquivos < 30;\n const temFrontend = caminhos.some(c => c.includes('/pages/') || c.includes('/components/') || c.includes('/views/'));\n\n let arquiteturaRecomendada = 'Arquitetura Simples / Monolítica';\n let melhorScore = 0;\n let confianca = 0;\n const recomendacoes: string[] = [];\n\n // Clean Architecture é recomendada para projetos com regras de negócio complexas\n if (scoreCleanArch >= 40 || (temEntities && temUseCases)) {\n if (scoreCleanArch > melhorScore) {\n arquiteturaRecomendada = 'Clean Architecture (Arquitetura Limpa)';\n melhorScore = scoreCleanArch;\n confianca = Math.min(95, scoreCleanArch + (temDI ? 10 : 0));\n }\n if (!temEntities) recomendacoes.push('Crie entidades de domínio para encapsular regras de negócio');\n if (!temUseCases) recomendacoes.push('Organize a lógica da aplicação em casos de uso (use-cases)');\n if (!temPorts) recomendacoes.push('Defina portas (ports) na camada de aplicação para inversão de dependência');\n if (!temRepositories) recomendacoes.push('Implemente o padrão Repository para abstrair persistência');\n }\n\n // Arquitetura Distribuída é recomendada para projetos com múltiplos serviços\n if (scoreDistributed >= 35 && servicosSet.size >= 1) {\n if (scoreDistributed > melhorScore) {\n arquiteturaRecomendada = 'Arquitetura Distribuída / Microsserviços';\n melhorScore = scoreDistributed;\n confianca = Math.min(95, scoreDistributed);\n }\n if (!temMensageria && !temMensageriaDeps) {\n recomendacoes.push('Adicione mensageria (Kafka, RabbitMQ) para comunicação assíncrona entre serviços');\n }\n if (!temGateway && servicosSet.size > 1) {\n recomendacoes.push('Implemente um API Gateway para rotear requisições aos serviços');\n }\n if (!temDocker) recomendacoes.push('Conteinerize os serviços com Docker');\n if (!temMonitoring) recomendacoes.push('Adicione health checks e monitoramento centralizado');\n }\n\n // MVC para projetos web tradicionais\n if (temFrontend && temControllers && !temEntities) {\n const scoreMvc = (temControllers ? 15 : 0) + (temFrontend ? 15 : 0);\n if (scoreMvc > melhorScore && !complexidadeBaixa) {\n arquiteturaRecomendada = 'MVC (Model-View-Controller)';\n melhorScore = scoreMvc;\n confianca = Math.min(80, scoreMvc + 30);\n }\n }\n\n // Se ainda não há recomendação clara, sugerir a mais adequada\n if (melhorScore === 0) {\n if (complexidadeBaixa) {\n arquiteturaRecomendada = 'Arquitetura Simples / Monolítica';\n confianca = 60;\n recomendacoes.push('Projeto de baixa complexidade - comece com uma estrutura simples');\n recomendacoes.push('Considere evoluir para Clean Architecture conforme o projeto crescer');\n } else if (temFrontend) {\n arquiteturaRecomendada = 'Arquitetura Modular';\n confianca = 50;\n recomendacoes.push('Organize o projeto em módulos por funcionalidade');\n } else {\n arquiteturaRecomendada = 'Arquitetura em Camadas';\n confianca = 50;\n recomendacoes.push('Organize o código em camadas (controllers, services, repositories)');\n }\n }\n\n // Adicionar recomendações gerais\n if (scoreCleanArch >= 20 && scoreDistributed >= 20) {\n recomendacoes.push('Projeto apresenta características híbridas - considere Clean Architecture com boundaries de microsserviços');\n }\n if (totalArquivos > 100 && servicosSet.size === 0) {\n recomendacoes.push('Projeto grande e monolítico - considere dividir em serviços menores');\n }\n\n ocorrencias.push(criarOcorrencia({\n tipo: 'recomendacao-arquitetura',\n nivel: 'info',\n relPath: _relPath,\n linha: 1,\n mensagem: `🎯 Arquitetura recomendada: ${arquiteturaRecomendada} (${confianca}% confiança)`\n }));\n\n if (sinaisCleanArch.length > 0) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'sinais-clean-arch',\n nivel: 'info',\n relPath: _relPath,\n linha: 1,\n mensagem: `Sinais de Clean Architecture: ${sinaisCleanArch.join(', ')}`\n }));\n }\n\n if (sinaisDistributed.length > 0) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'sinais-distributed-arch',\n nivel: 'info',\n relPath: _relPath,\n linha: 1,\n mensagem: `Sinais de Arquitetura Distribuída: ${sinaisDistributed.join(', ')}`\n }));\n }\n\n for (const rec of recomendacoes.slice(0, 5)) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'recomendacao-arquitetura-item',\n nivel: 'info',\n relPath: _relPath,\n linha: 1,\n mensagem: `💡 ${rec}`\n }));\n }\n\n return ocorrencias;\n }\n};\n"]}
1
+ {"version":3,"file":"detector-recommendation-architecture.js","sourceRoot":"","sources":["../../../src/analysts/detectors/detector-recommendation-architecture.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport type { Analista, ContextoExecucao, Ocorrencia } from '@';\nimport { criarOcorrencia } from '@';\n\n/**\n * Analista global que analisa o projeto completo e recomenda\n * a melhor arquitetura (Clean Architecture, Microsserviços, MVC, etc.)\n */\nexport const analistaRecomendacaoArquitetura: Analista = {\n nome: 'recomendacao-arquitetura',\n categoria: 'arquitetura',\n descricao: 'Analisa o projeto e recomenda a melhor arquitetura a ser aplicada',\n global: true,\n test: () => true,\n aplicar: async (_src: string, _relPath: string, _ast: unknown, _fullCaminho?: string, contexto?: ContextoExecucao): Promise<Ocorrencia[]> => {\n if (!contexto) return [];\n\n const ocorrencias: Ocorrencia[] = [];\n const caminhos = contexto.arquivos.map(a => a.relPath.toLowerCase());\n const conteudos = contexto.arquivos.map(a => a.content?.toLowerCase() || '');\n\n // === SINAIS PARA CLEAN ARCHITECTURE ===\n let scoreCleanArch = 0;\n const sinaisCleanArch: string[] = [];\n\n // Domain layer\n const temEntities = caminhos.some(c => c.includes('/entities/') || c.endsWith('entity.ts') || c.endsWith('entity.js'));\n const temValueObjects = caminhos.some(c => c.includes('value-object') || c.includes('value_object'));\n const temDomainServices = caminhos.some(c => c.includes('/domain/') && c.includes('service'));\n const temDomainEvents = caminhos.some(c => c.includes('domain-event') || c.includes('domain_events'));\n\n if (temEntities) { scoreCleanArch += 15; sinaisCleanArch.push('Entidades de domínio'); }\n if (temValueObjects) { scoreCleanArch += 10; sinaisCleanArch.push('Value Objects'); }\n if (temDomainServices) { scoreCleanArch += 10; sinaisCleanArch.push('Serviços de domínio'); }\n if (temDomainEvents) { scoreCleanArch += 10; sinaisCleanArch.push('Eventos de domínio'); }\n\n // Application layer\n const temUseCases = caminhos.some(c => c.includes('/use-cases') || c.includes('/usecases') || c.includes('/application/'));\n const temPorts = caminhos.some(c => c.includes('/ports/') || c.includes('/application/port'));\n const temDtos = caminhos.some(c => c.includes('/dto/') || c.endsWith('.dto.ts') || c.endsWith('.dto.js'));\n\n if (temUseCases) { scoreCleanArch += 15; sinaisCleanArch.push('Casos de uso (use-cases)'); }\n if (temPorts) { scoreCleanArch += 10; sinaisCleanArch.push('Ports'); }\n if (temDtos) { scoreCleanArch += 10; sinaisCleanArch.push('DTOs'); }\n\n // Infrastructure layer\n const temInfra = caminhos.some(c => c.includes('/infrastructure/') || c.includes('/infra/'));\n const temRepositories = caminhos.some(c => c.includes('/repositories/') || c.endsWith('.repository.ts'));\n const temGateways = caminhos.some(c => c.includes('/gateways/'));\n\n if (temInfra) { scoreCleanArch += 10; sinaisCleanArch.push('Camada de infraestrutura'); }\n if (temRepositories) { scoreCleanArch += 10; sinaisCleanArch.push('Implementações de repositório'); }\n if (temGateways) { scoreCleanArch += 5; sinaisCleanArch.push('Gateways'); }\n\n // Presentation layer\n const temControllers = caminhos.some(c => c.includes('/controllers/') || c.endsWith('.controller.ts'));\n const temPresenters = caminhos.some(c => c.includes('/presenters/') || c.endsWith('.presenter.ts'));\n\n if (temControllers) { scoreCleanArch += 10; sinaisCleanArch.push('Controllers'); }\n if (temPresenters) { scoreCleanArch += 5; sinaisCleanArch.push('Presenters'); }\n\n // DI Container\n const temDI = conteudos.some(c => c.includes('tsyringe') || c.includes('inversify') || c.includes('awilix') || c.includes('typedi'));\n if (temDI) { scoreCleanArch += 5; sinaisCleanArch.push('Container DI'); }\n\n // === SINAIS PARA ARQUITETURA DISTRIBUÍDA ===\n let scoreDistributed = 0;\n const sinaisDistributed: string[] = [];\n\n // Múltiplos serviços\n const servicosSet = new Set<string>();\n for (const c of caminhos) {\n const match = c.match(/services\\/([^/]+)/);\n if (match) servicosSet.add(match[1]);\n }\n\n if (servicosSet.size >= 2) { scoreDistributed += 20; sinaisDistributed.push(`${servicosSet.size} boundaries de serviço`); }\n else if (servicosSet.size === 1) { scoreDistributed += 10; sinaisDistributed.push('1 boundary de serviço'); }\n\n // Mensageria\n const temMensageria = caminhos.some(c =>\n c.includes('/events/') || c.includes('/messaging') || c.includes('/queues') ||\n c.includes('/consumers') || c.includes('/producers')\n );\n const temMensageriaDeps = conteudos.some(c =>\n c.includes('kafkajs') || c.includes('amqplib') || c.includes('ioredis') ||\n c.includes('bull') || c.includes('bullmq') || c.includes('nats')\n );\n\n if (temMensageria || temMensageriaDeps) { scoreDistributed += 15; sinaisDistributed.push('Mensageria'); }\n\n // API Gateway\n const temGateway = caminhos.some(c => c.includes('/gateway') || c.includes('/api-gateway'));\n if (temGateway) { scoreDistributed += 15; sinaisDistributed.push('API Gateway'); }\n\n // Service Discovery\n const temDiscovery = caminhos.some(c => c.includes('/discovery') || c.includes('consul') || c.includes('eureka'));\n if (temDiscovery) { scoreDistributed += 10; sinaisDistributed.push('Service Discovery'); }\n\n // Docker/Container\n const temDocker = caminhos.some(c => c.endsWith('dockerfile') || c.includes('docker-compose'));\n if (temDocker) { scoreDistributed += 10; sinaisDistributed.push('Docker'); }\n\n // K8s\n const temK8s = caminhos.some(c => c.includes('kubernetes') || c.includes('k8s/'));\n if (temK8s) { scoreDistributed += 10; sinaisDistributed.push('Kubernetes'); }\n\n // Event-driven patterns\n const temEventDriven = conteudos.filter(c =>\n c.includes('eventemitter') || c.includes('publish') || c.includes('subscribe') ||\n c.includes('webhook') || c.includes('observable')\n ).length > 3;\n if (temEventDriven) { scoreDistributed += 10; sinaisDistributed.push('Padrões event-driven'); }\n\n // Monitoring\n const temMonitoring = caminhos.some(c => c.includes('/health') || c.includes('/monitoring') || c.includes('/metrics'));\n if (temMonitoring) { scoreDistributed += 10; sinaisDistributed.push('Monitoramento'); }\n\n // Shared lib\n const temShared = caminhos.some(c => c.includes('/shared/') || c.includes('/common/'));\n if (temShared) { scoreDistributed += 5; sinaisDistributed.push('Biblioteca compartilhada'); }\n\n // === DECISÃO DA ARQUITETURA ===\n const totalArquivos = contexto.arquivos.length;\n const complexidadeBaixa = totalArquivos < 30;\n const temFrontend = caminhos.some(c => c.includes('/pages/') || c.includes('/components/') || c.includes('/views/'));\n\n let arquiteturaRecomendada = 'Arquitetura Simples / Monolítica';\n let melhorScore = 0;\n let confianca = 0;\n const recomendacoes: string[] = [];\n\n // Clean Architecture é recomendada para projetos com regras de negócio complexas\n if (scoreCleanArch >= 40 || (temEntities && temUseCases)) {\n if (scoreCleanArch > melhorScore) {\n arquiteturaRecomendada = 'Clean Architecture (Arquitetura Limpa)';\n melhorScore = scoreCleanArch;\n confianca = Math.min(95, scoreCleanArch + (temDI ? 10 : 0));\n }\n if (!temEntities) recomendacoes.push('Crie entidades de domínio para encapsular regras de negócio');\n if (!temUseCases) recomendacoes.push('Organize a lógica da aplicação em casos de uso (use-cases)');\n if (!temPorts) recomendacoes.push('Defina portas (ports) na camada de aplicação para inversão de dependência');\n if (!temRepositories) recomendacoes.push('Implemente o padrão Repository para abstrair persistência');\n }\n\n // Arquitetura Distribuída é recomendada para projetos com múltiplos serviços\n if (scoreDistributed >= 35 && servicosSet.size >= 1) {\n if (scoreDistributed > melhorScore) {\n arquiteturaRecomendada = 'Arquitetura Distribuída / Microsserviços';\n melhorScore = scoreDistributed;\n confianca = Math.min(95, scoreDistributed);\n }\n if (!temMensageria && !temMensageriaDeps) {\n recomendacoes.push('Adicione mensageria (Kafka, RabbitMQ) para comunicação assíncrona entre serviços');\n }\n if (!temGateway && servicosSet.size > 1) {\n recomendacoes.push('Implemente um API Gateway para rotear requisições aos serviços');\n }\n if (!temDocker) recomendacoes.push('Conteinerize os serviços com Docker');\n if (!temMonitoring) recomendacoes.push('Adicione health checks e monitoramento centralizado');\n }\n\n // MVC para projetos web tradicionais\n if (temFrontend && temControllers && !temEntities) {\n const scoreMvc = (temControllers ? 15 : 0) + (temFrontend ? 15 : 0);\n if (scoreMvc > melhorScore && !complexidadeBaixa) {\n arquiteturaRecomendada = 'MVC (Model-View-Controller)';\n melhorScore = scoreMvc;\n confianca = Math.min(80, scoreMvc + 30);\n }\n }\n\n // Se ainda não há recomendação clara, sugerir a mais adequada\n if (melhorScore === 0) {\n if (complexidadeBaixa) {\n arquiteturaRecomendada = 'Arquitetura Simples / Monolítica';\n confianca = 60;\n recomendacoes.push('Projeto de baixa complexidade - comece com uma estrutura simples');\n recomendacoes.push('Considere evoluir para Clean Architecture conforme o projeto crescer');\n } else if (temFrontend) {\n arquiteturaRecomendada = 'Arquitetura Modular';\n confianca = 50;\n recomendacoes.push('Organize o projeto em módulos por funcionalidade');\n } else {\n arquiteturaRecomendada = 'Arquitetura em Camadas';\n confianca = 50;\n recomendacoes.push('Organize o código em camadas (controllers, services, repositories)');\n }\n }\n\n // Adicionar recomendações gerais\n if (scoreCleanArch >= 20 && scoreDistributed >= 20) {\n recomendacoes.push('Projeto apresenta características híbridas - considere Clean Architecture com boundaries de microsserviços');\n }\n if (totalArquivos > 100 && servicosSet.size === 0) {\n recomendacoes.push('Projeto grande e monolítico - considere dividir em serviços menores');\n }\n\n ocorrencias.push(criarOcorrencia({\n tipo: 'recomendacao-arquitetura',\n nivel: 'info',\n relPath: _relPath,\n linha: 1,\n mensagem: `[TARGET] Arquitetura recomendada: ${arquiteturaRecomendada} (${confianca}% confiança)`\n }));\n\n if (sinaisCleanArch.length > 0) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'sinais-clean-arch',\n nivel: 'info',\n relPath: _relPath,\n linha: 1,\n mensagem: `Sinais de Clean Architecture: ${sinaisCleanArch.join(', ')}`\n }));\n }\n\n if (sinaisDistributed.length > 0) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'sinais-distributed-arch',\n nivel: 'info',\n relPath: _relPath,\n linha: 1,\n mensagem: `Sinais de Arquitetura Distribuída: ${sinaisDistributed.join(', ')}`\n }));\n }\n\n for (const rec of recomendacoes.slice(0, 5)) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'recomendacao-arquitetura-item',\n nivel: 'info',\n relPath: _relPath,\n linha: 1,\n mensagem: `[IDEA] ${rec}`\n }));\n }\n\n return ocorrencias;\n }\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"org-verified.js","sourceRoot":"","sources":["../../../../src/analysts/github-actions/detectors/org-verified.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IACrC,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,QAAQ;IACR,YAAY;IACZ,SAAS;IACT,cAAc;IACd,cAAc;IACd,MAAM;IACN,eAAe;IACf,WAAW;IACX,eAAe;IACf,MAAM;IACN,YAAY;IACZ,SAAS;IACT,WAAW;CACZ,CAAC,CAAC;AAMH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * 🛡️ Organizações/donos verificados de GitHub Actions\n *\n * Actions destes donos são consideradas confiáveis.\n * SHA pinning nestas actions é boa prática de segurança, não suspeito.\n */\n\nexport const ORG_VERIFICADAS = new Set([\n 'actions', // GitHub official actions\n 'github', // GitHub organization\n 'dependabot', // GitHub Dependabot\n 'docker', // Docker official actions\n 'peterevans', // Peter Evans (verified creator)\n 'anchore', // Anchore (security scanning)\n 'aquasecurity', // Aqua Security (trivy)\n 'bridgecrewio', // Bridgecrew (checkov)\n 'ossf', // Open Source Security Foundation\n 'step-security', // StepSecurity\n 'reviewdog', // Reviewdog\n 'julia-actions', // Julia language\n 'ruby', // Ruby language\n 'actions-rs', // Rust actions\n 'dtolnay', // David Tolnay (verified Rust tooling)\n 'softprops', // softprops/action-gh-release (popular release action)\n]);\n\n/**\n * Verifica se uma action pertence a uma organização verificada\n * @param actionRef Ex: \"actions/checkout\", \"dependabot/fetch-metadata\"\n */\nexport function isOrgVerificada(actionRef: string): boolean {\n const owner = actionRef.split('/')[0];\n return ORG_VERIFICADAS.has(owner);\n}\n"]}
1
+ {"version":3,"file":"org-verified.js","sourceRoot":"","sources":["../../../../src/analysts/github-actions/detectors/org-verified.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IACrC,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,QAAQ;IACR,YAAY;IACZ,SAAS;IACT,cAAc;IACd,cAAc;IACd,MAAM;IACN,eAAe;IACf,WAAW;IACX,eAAe;IACf,MAAM;IACN,YAAY;IACZ,SAAS;IACT,WAAW;CACZ,CAAC,CAAC;AAMH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * [SHIELD] Organizações/donos verificados de GitHub Actions\n *\n * Actions destes donos são consideradas confiáveis.\n * SHA pinning nestas actions é boa prática de segurança, não suspeito.\n */\n\nexport const ORG_VERIFICADAS = new Set([\n 'actions', // GitHub official actions\n 'github', // GitHub organization\n 'dependabot', // GitHub Dependabot\n 'docker', // Docker official actions\n 'peterevans', // Peter Evans (verified creator)\n 'anchore', // Anchore (security scanning)\n 'aquasecurity', // Aqua Security (trivy)\n 'bridgecrewio', // Bridgecrew (checkov)\n 'ossf', // Open Source Security Foundation\n 'step-security', // StepSecurity\n 'reviewdog', // Reviewdog\n 'julia-actions', // Julia language\n 'ruby', // Ruby language\n 'actions-rs', // Rust actions\n 'dtolnay', // David Tolnay (verified Rust tooling)\n 'softprops', // softprops/action-gh-release (popular release action)\n]);\n\n/**\n * Verifica se uma action pertence a uma organização verificada\n * @param actionRef Ex: \"actions/checkout\", \"dependabot/fetch-metadata\"\n */\nexport function isOrgVerificada(actionRef: string): boolean {\n const owner = actionRef.split('/')[0];\n return ORG_VERIFICADAS.has(owner);\n}\n"]}
@@ -27,16 +27,16 @@ export function gerarRelatorioMarkdown(dados, opcoes) {
27
27
  linhas.push(`| Total de Workflows | ${dados.totalWorkflows} |`);
28
28
  linhas.push(`| Total de Ocorrências | ${dados.ocorrencias.length} |`);
29
29
  linhas.push('');
30
- linhas.push('## 🔴 Severidade');
30
+ linhas.push('## [RED] Severidade');
31
31
  linhas.push('');
32
32
  linhas.push(`| Severidade | Quantidade |`);
33
33
  linhas.push(`|---|---|`);
34
34
  for (const [sev, count] of Object.entries(dados.resumoPorSeveridade)) {
35
- const icon = sev === 'erro' ? '🔴' : sev === 'aviso' ? '🟡' : '🔵';
35
+ const icon = sev === 'erro' ? '[RED]' : sev === 'aviso' ? '[YELLOW]' : '[BLUE]';
36
36
  linhas.push(`| ${icon} ${sev} | ${count} |`);
37
37
  }
38
38
  linhas.push('');
39
- linhas.push('## 📋 Workflows Analisados');
39
+ linhas.push('## [LIST] Workflows Analisados');
40
40
  linhas.push('');
41
41
  linhas.push(`| Workflow | Score | Ocorrências |`);
42
42
  linhas.push(`|---|---|---|`);
@@ -133,7 +133,7 @@ export function gerarRelatorioHtml(dados, opcoes) {
133
133
  </div>`).join('')}
134
134
  </div>
135
135
 
136
- <h2>📋 Workflows</h2>
136
+ <h2>[LIST] Workflows</h2>
137
137
  <table>
138
138
  <thead><tr><th>Workflow</th><th>Score</th><th>Ocorrências</th></tr></thead>
139
139
  <tbody>
@@ -1 +1 @@
1
- {"version":3,"file":"generator-report-github-actions.js","sourceRoot":"","sources":["../../../../src/analysts/github-actions/reports/generator-report-github-actions.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * [GRAFICO] Gerador de Relatórios Multi-Formato para GitHub Actions\n *\n * Suporta: JSON, Markdown, HTML, CSV\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport { messages } from '@core/messages';\n\nimport type { Ocorrencia } from '@';\n\nexport type FormatoRelatorio = 'json' | 'markdown' | 'html' | 'csv';\nexport interface DadosRelatorioGithubActions {\n nomeRepositorio: string;\n dataAnalise: string;\n totalWorkflows: number;\n scoreGeral: number;\n ocorrencias: Ocorrencia[];\n resumoPorSeveridade: Record<string, number>;\n resumoPorTipo: Record<string, number>;\n workflows: Array<{\n nome: string;\n score: number;\n ocorrencias: number;\n }>;\n tempoAnaliseMs: number;\n}\nexport interface OpcoesRelatorio {\n formato: FormatoRelatorio;\n output: string;\n titulo?: string;\n incluirDetalhes?: boolean;\n filtrarSeveridade?: string[];\n}\nexport function gerarRelatorioJson(dados: DadosRelatorioGithubActions): string {\n const relatorio = {\n $schema: 'tutanus://schemas/github-actions-report/v1',\n geradoEm: new Date().toISOString(),\n versao: '0.6.0',\n ...dados\n };\n return JSON.stringify(relatorio, null, 2);\n}\nexport function gerarRelatorioMarkdown(dados: DadosRelatorioGithubActions, opcoes?: {\n titulo?: string;\n incluirDetalhes?: boolean;\n}): string {\n const linhas: string[] = [];\n const titulo = opcoes?.titulo || 'Relatório de Análise - GitHub Actions';\n linhas.push(`# ${titulo}`);\n linhas.push('');\n linhas.push(`**Repositório:** ${dados.nomeRepositorio}`);\n linhas.push(`**Data:** ${dados.dataAnalise}`);\n linhas.push(`**Tempo de Análise:** ${dados.tempoAnaliseMs}ms`);\n linhas.push('');\n linhas.push('## [GRAFICO] Resumo Geral');\n linhas.push('');\n linhas.push(`| Métrica | Valor |`);\n linhas.push(`|---|---|`);\n linhas.push(`| Score Geral | ${dados.scoreGeral}/100 |`);\n linhas.push(`| Total de Workflows | ${dados.totalWorkflows} |`);\n linhas.push(`| Total de Ocorrências | ${dados.ocorrencias.length} |`);\n linhas.push('');\n linhas.push('## 🔴 Severidade');\n linhas.push('');\n linhas.push(`| Severidade | Quantidade |`);\n linhas.push(`|---|---|`);\n for (const [sev, count] of Object.entries(dados.resumoPorSeveridade)) {\n const icon = sev === 'erro' ? '🔴' : sev === 'aviso' ? '🟡' : '🔵';\n linhas.push(`| ${icon} ${sev} | ${count} |`);\n }\n linhas.push('');\n linhas.push('## 📋 Workflows Analisados');\n linhas.push('');\n linhas.push(`| Workflow | Score | Ocorrências |`);\n linhas.push(`|---|---|---|`);\n for (const wf of dados.workflows) {\n const scoreIcon = wf.score >= 80 ? '[OK]' : wf.score >= 50 ? '[AVISO]' : '[ERRO]';\n linhas.push(`| ${scoreIcon} ${wf.nome} | ${wf.score}/100 | ${wf.ocorrencias} |`);\n }\n linhas.push('');\n if (opcoes?.incluirDetalhes !== false && dados.ocorrencias.length > 0) {\n linhas.push('## [BUSCA] Ocorrências Detalhadas');\n linhas.push('');\n linhas.push(`| Arquivo | Linha | Severidade | Tipo | Mensagem |`);\n linhas.push(`|---|---|---|---|---|`);\n for (const ocorrencia of dados.ocorrencias.slice(0, 200)) {\n const nivel = ocorrencia.nivel || 'info';\n const tipo = ocorrencia.tipo || 'desconhecido';\n const msg = (ocorrencia.mensagem || '').replace(/\\\\/g, '\\\\\\\\').replace(/\\|/g, '\\\\|').replace(/\\n/g, ' ').replace(/\\r/g, ' ').replace(/\\*/g, '\\\\*').replace(/_/g, '\\\\_').replace(/\\[/g, '\\\\[').replace(/\\]/g, '\\\\]').replace(/</g, '\\\\<').replace(/>/g, '\\\\>');\n const linha = ocorrencia.linha || '-';\n linhas.push(`| \\`${ocorrencia.relPath}\\` | ${linha} | ${nivel} | ${tipo} | ${msg} |`);\n }\n if (dados.ocorrencias.length > 200) {\n linhas.push('');\n linhas.push(`> Mostrando 200 de ${dados.ocorrencias.length} ocorrências.`);\n }\n linhas.push('');\n }\n linhas.push('---');\n linhas.push('');\n linhas.push(`*Gerado por Tutanus v0.6.0 em ${new Date().toISOString()}*`);\n return linhas.join('\\n');\n}\nexport function gerarRelatorioHtml(dados: DadosRelatorioGithubActions, opcoes?: {\n titulo?: string;\n}): string {\n const titulo = opcoes?.titulo || 'Relatório de Análise - GitHub Actions';\n const scoreColor = dados.scoreGeral >= 80 ? '#10b981' : dados.scoreGeral >= 50 ? '#f59e0b' : '#ef4444';\n return `<!DOCTYPE html>\n<html lang=\"pt-BR\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${escapeHtml(titulo)}</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #0d1117; color: #c9d1d9; padding: 2rem; }\n .container { max-width: 1200px; margin: 0 auto; }\n h1 { color: #58a6ff; margin-bottom: 0.5rem; }\n h2 { color: #58a6ff; margin: 2rem 0 1rem; border-bottom: 1px solid #21262d; padding-bottom: 0.5rem; }\n .meta { color: #8b949e; margin-bottom: 2rem; }\n .score-card { background: #161b22; border: 1px solid #30363d; border-radius: 12px; padding: 2rem; text-align: center; margin-bottom: 2rem; }\n .score-value { font-size: 4rem; font-weight: bold; color: ${scoreColor}; }\n .score-label { color: #8b949e; font-size: 1.2rem; }\n table { width: 100%; border-collapse: collapse; margin: 1rem 0; }\n th { background: #161b22; color: #58a6ff; padding: 0.75rem 1rem; text-align: left; border-bottom: 2px solid #30363d; }\n td { padding: 0.75rem 1rem; border-bottom: 1px solid #21262d; }\n tr:hover { background: #161b22; }\n .badge { padding: 0.25rem 0.5rem; border-radius: 12px; font-size: 0.85rem; font-weight: 600; }\n .badge-erro { background: rgba(239,68,68,0.2); color: #ef4444; }\n .badge-aviso { background: rgba(245,158,11,0.2); color: #f59e0b; }\n .badge-info { background: rgba(56,139,253,0.2); color: #388bfd; }\n .badge-sucesso { background: rgba(16,185,129,0.2); color: #10b981; }\n .summary-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; margin: 1rem 0; }\n .summary-item { background: #161b22; border: 1px solid #30363d; border-radius: 8px; padding: 1rem; }\n .summary-item .label { color: #8b949e; font-size: 0.85rem; }\n .summary-item .value { font-size: 1.5rem; font-weight: bold; color: #58a6ff; }\n .footer { margin-top: 3rem; padding-top: 1rem; border-top: 1px solid #21262d; color: #8b949e; font-size: 0.85rem; text-align: center; }\n code { background: #161b22; padding: 0.2rem 0.4rem; border-radius: 4px; font-family: 'JetBrains Mono', monospace; font-size: 0.9em; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>[FOGO] ${escapeHtml(titulo)}</h1>\n <div class=\"meta\">\n <p><strong>Repositório:</strong> ${escapeHtml(dados.nomeRepositorio)} | <strong>Data:</strong> ${escapeHtml(dados.dataAnalise)} | <strong>Tempo:</strong> ${escapeHtml(String(dados.tempoAnaliseMs))}ms</p>\n </div>\n\n <div class=\"score-card\">\n <div class=\"score-value\">${dados.scoreGeral}</div>\n <div class=\"score-label\">Score Geral (0-100)</div>\n </div>\n\n <h2>[GRAFICO] Resumo</h2>\n <div class=\"summary-grid\">\n <div class=\"summary-item\">\n <div class=\"label\">Workflows</div>\n <div class=\"value\">${dados.totalWorkflows}</div>\n </div>\n <div class=\"summary-item\">\n <div class=\"label\">Ocorrências</div>\n <div class=\"value\">${dados.ocorrencias.length}</div>\n </div>\n ${Object.entries(dados.resumoPorSeveridade).map(([sev, count]) => `\n <div class=\"summary-item\">\n <div class=\"label\">${escapeHtml(sev)}</div>\n <div class=\"value\">${count}</div>\n </div>`).join('')}\n </div>\n\n <h2>📋 Workflows</h2>\n <table>\n <thead><tr><th>Workflow</th><th>Score</th><th>Ocorrências</th></tr></thead>\n <tbody>\n ${dados.workflows.map(wf => {\n const scoreColor2 = wf.score >= 80 ? '#10b981' : wf.score >= 50 ? '#f59e0b' : '#ef4444';\n return `<tr><td>${escapeHtml(wf.nome)}</td><td style=\"color:${scoreColor2};font-weight:bold\">${wf.score}/100</td><td>${wf.ocorrencias}</td></tr>`;\n }).join('')}\n </tbody>\n </table>\n\n <h2>[BUSCA] Ocorrências</h2>\n <table>\n <thead><tr><th>Arquivo</th><th>Linha</th><th>Severidade</th><th>Tipo</th><th>Mensagem</th></tr></thead>\n <tbody>\n ${dados.ocorrencias.slice(0, 200).map(ocorrencia => `\n <tr>\n <td><code>${escapeHtml(ocorrencia.relPath)}</code></td>\n <td>${ocorrencia.linha || '-'}</td>\n <td><span class=\"badge badge-${ocorrencia.nivel || 'info'}\">${escapeHtml(String(ocorrencia.nivel || 'info'))}</span></td>\n <td>${escapeHtml(ocorrencia.tipo || '')}</td>\n <td>${escapeHtml(ocorrencia.mensagem || '')}</td>\n </tr>`).join('')}\n </tbody>\n </table>\n ${dados.ocorrencias.length > 200 ? `<p style=\"color:#8b949e;margin-top:1rem\">Mostrando 200 de ${dados.ocorrencias.length} ocorrências.</p>` : ''}\n\n <div class=\"footer\">\n <p>Gerado por Tutanus v0.6.0 em ${new Date().toISOString()}</p>\n </div>\n </div>\n</body>\n</html>`;\n}\nexport function gerarRelatorioCsv(dados: DadosRelatorioGithubActions): string {\n const linhas: string[] = [];\n linhas.push('Arquivo,Linha,Severidade,Tipo,Mensagem,Sugestao');\n for (const ocorrencia of dados.ocorrencias) {\n const campos = [csvEscape(ocorrencia.relPath), csvEscape(String(ocorrencia.linha || '')), csvEscape(String(ocorrencia.nivel || 'info')), csvEscape(ocorrencia.tipo || ''), csvEscape(ocorrencia.mensagem || ''), csvEscape(ocorrencia.sugestao || '')];\n linhas.push(campos.join(','));\n }\n return linhas.join('\\n');\n}\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#039;');\n}\nfunction csvEscape(str: string): string {\n if (str.includes(',') || str.includes('\"') || str.includes('\\n')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n}\nexport async function gerarRelatorio(dados: DadosRelatorioGithubActions, opcoes: OpcoesRelatorio): Promise<string> {\n const conteudo = (() => {\n switch (opcoes.formato) {\n case 'json':\n return gerarRelatorioJson(dados);\n case 'markdown':\n return gerarRelatorioMarkdown(dados, {\n titulo: opcoes.titulo,\n incluirDetalhes: opcoes.incluirDetalhes\n });\n case 'html':\n return gerarRelatorioHtml(dados, {\n titulo: opcoes.titulo\n });\n case 'csv':\n return gerarRelatorioCsv(dados);\n default:\n throw new Error(messages.ExcecoesMensagens.formatoNaoSuportado(opcoes.formato));\n }\n })();\n const dir = path.dirname(opcoes.output);\n fs.mkdirSync(dir, {\n recursive: true\n });\n fs.writeFileSync(opcoes.output, conteudo, 'utf-8');\n return opcoes.output;\n}\nexport function calcularResumoPorSeveridade(ocorrencias: Ocorrencia[]): Record<string, number> {\n const resumo: Record<string, number> = {};\n for (const ocorrencia of ocorrencias) {\n const nivel = String(ocorrencia.nivel || 'info');\n resumo[nivel] = (resumo[nivel] || 0) + 1;\n }\n return resumo;\n}\nexport function calcularResumoPorTipo(ocorrencias: Ocorrencia[]): Record<string, number> {\n const resumo: Record<string, number> = {};\n for (const ocorrencia of ocorrencias) {\n const tipo = ocorrencia.tipo || 'desconhecido';\n resumo[tipo] = (resumo[tipo] || 0) + 1;\n }\n return resumo;\n}\nexport function prepararDadosRelatorio(ocorrencias: Ocorrencia[], nomeRepositorio: string, tempoAnaliseMs: number, workflows?: Array<{\n nome: string;\n score: number;\n ocorrencias: number;\n}>): DadosRelatorioGithubActions {\n const wfList = workflows || [];\n const totalWorkflows = wfList.length || 1;\n const scoreGeral = wfList.length > 0 ? Math.round(wfList.reduce((sum, dimensaoLargura) => sum + dimensaoLargura.score, 0) / wfList.length) : Math.max(0, 100 - ocorrencias.length * 5);\n return {\n nomeRepositorio,\n dataAnalise: new Date().toISOString(),\n totalWorkflows,\n scoreGeral,\n ocorrencias,\n resumoPorSeveridade: calcularResumoPorSeveridade(ocorrencias),\n resumoPorTipo: calcularResumoPorTipo(ocorrencias),\n workflows: wfList,\n tempoAnaliseMs\n };\n}"]}
1
+ {"version":3,"file":"generator-report-github-actions.js","sourceRoot":"","sources":["../../../../src/analysts/github-actions/reports/generator-report-github-actions.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * [GRAFICO] Gerador de Relatórios Multi-Formato para GitHub Actions\n *\n * Suporta: JSON, Markdown, HTML, CSV\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport { messages } from '@core/messages';\n\nimport type { Ocorrencia } from '@';\n\nexport type FormatoRelatorio = 'json' | 'markdown' | 'html' | 'csv';\nexport interface DadosRelatorioGithubActions {\n nomeRepositorio: string;\n dataAnalise: string;\n totalWorkflows: number;\n scoreGeral: number;\n ocorrencias: Ocorrencia[];\n resumoPorSeveridade: Record<string, number>;\n resumoPorTipo: Record<string, number>;\n workflows: Array<{\n nome: string;\n score: number;\n ocorrencias: number;\n }>;\n tempoAnaliseMs: number;\n}\nexport interface OpcoesRelatorio {\n formato: FormatoRelatorio;\n output: string;\n titulo?: string;\n incluirDetalhes?: boolean;\n filtrarSeveridade?: string[];\n}\nexport function gerarRelatorioJson(dados: DadosRelatorioGithubActions): string {\n const relatorio = {\n $schema: 'tutanus://schemas/github-actions-report/v1',\n geradoEm: new Date().toISOString(),\n versao: '0.6.0',\n ...dados\n };\n return JSON.stringify(relatorio, null, 2);\n}\nexport function gerarRelatorioMarkdown(dados: DadosRelatorioGithubActions, opcoes?: {\n titulo?: string;\n incluirDetalhes?: boolean;\n}): string {\n const linhas: string[] = [];\n const titulo = opcoes?.titulo || 'Relatório de Análise - GitHub Actions';\n linhas.push(`# ${titulo}`);\n linhas.push('');\n linhas.push(`**Repositório:** ${dados.nomeRepositorio}`);\n linhas.push(`**Data:** ${dados.dataAnalise}`);\n linhas.push(`**Tempo de Análise:** ${dados.tempoAnaliseMs}ms`);\n linhas.push('');\n linhas.push('## [GRAFICO] Resumo Geral');\n linhas.push('');\n linhas.push(`| Métrica | Valor |`);\n linhas.push(`|---|---|`);\n linhas.push(`| Score Geral | ${dados.scoreGeral}/100 |`);\n linhas.push(`| Total de Workflows | ${dados.totalWorkflows} |`);\n linhas.push(`| Total de Ocorrências | ${dados.ocorrencias.length} |`);\n linhas.push('');\n linhas.push('## [RED] Severidade');\n linhas.push('');\n linhas.push(`| Severidade | Quantidade |`);\n linhas.push(`|---|---|`);\n for (const [sev, count] of Object.entries(dados.resumoPorSeveridade)) {\n const icon = sev === 'erro' ? '[RED]' : sev === 'aviso' ? '[YELLOW]' : '[BLUE]';\n linhas.push(`| ${icon} ${sev} | ${count} |`);\n }\n linhas.push('');\n linhas.push('## [LIST] Workflows Analisados');\n linhas.push('');\n linhas.push(`| Workflow | Score | Ocorrências |`);\n linhas.push(`|---|---|---|`);\n for (const wf of dados.workflows) {\n const scoreIcon = wf.score >= 80 ? '[OK]' : wf.score >= 50 ? '[AVISO]' : '[ERRO]';\n linhas.push(`| ${scoreIcon} ${wf.nome} | ${wf.score}/100 | ${wf.ocorrencias} |`);\n }\n linhas.push('');\n if (opcoes?.incluirDetalhes !== false && dados.ocorrencias.length > 0) {\n linhas.push('## [BUSCA] Ocorrências Detalhadas');\n linhas.push('');\n linhas.push(`| Arquivo | Linha | Severidade | Tipo | Mensagem |`);\n linhas.push(`|---|---|---|---|---|`);\n for (const ocorrencia of dados.ocorrencias.slice(0, 200)) {\n const nivel = ocorrencia.nivel || 'info';\n const tipo = ocorrencia.tipo || 'desconhecido';\n const msg = (ocorrencia.mensagem || '').replace(/\\\\/g, '\\\\\\\\').replace(/\\|/g, '\\\\|').replace(/\\n/g, ' ').replace(/\\r/g, ' ').replace(/\\*/g, '\\\\*').replace(/_/g, '\\\\_').replace(/\\[/g, '\\\\[').replace(/\\]/g, '\\\\]').replace(/</g, '\\\\<').replace(/>/g, '\\\\>');\n const linha = ocorrencia.linha || '-';\n linhas.push(`| \\`${ocorrencia.relPath}\\` | ${linha} | ${nivel} | ${tipo} | ${msg} |`);\n }\n if (dados.ocorrencias.length > 200) {\n linhas.push('');\n linhas.push(`> Mostrando 200 de ${dados.ocorrencias.length} ocorrências.`);\n }\n linhas.push('');\n }\n linhas.push('---');\n linhas.push('');\n linhas.push(`*Gerado por Tutanus v0.6.0 em ${new Date().toISOString()}*`);\n return linhas.join('\\n');\n}\nexport function gerarRelatorioHtml(dados: DadosRelatorioGithubActions, opcoes?: {\n titulo?: string;\n}): string {\n const titulo = opcoes?.titulo || 'Relatório de Análise - GitHub Actions';\n const scoreColor = dados.scoreGeral >= 80 ? '#10b981' : dados.scoreGeral >= 50 ? '#f59e0b' : '#ef4444';\n return `<!DOCTYPE html>\n<html lang=\"pt-BR\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${escapeHtml(titulo)}</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #0d1117; color: #c9d1d9; padding: 2rem; }\n .container { max-width: 1200px; margin: 0 auto; }\n h1 { color: #58a6ff; margin-bottom: 0.5rem; }\n h2 { color: #58a6ff; margin: 2rem 0 1rem; border-bottom: 1px solid #21262d; padding-bottom: 0.5rem; }\n .meta { color: #8b949e; margin-bottom: 2rem; }\n .score-card { background: #161b22; border: 1px solid #30363d; border-radius: 12px; padding: 2rem; text-align: center; margin-bottom: 2rem; }\n .score-value { font-size: 4rem; font-weight: bold; color: ${scoreColor}; }\n .score-label { color: #8b949e; font-size: 1.2rem; }\n table { width: 100%; border-collapse: collapse; margin: 1rem 0; }\n th { background: #161b22; color: #58a6ff; padding: 0.75rem 1rem; text-align: left; border-bottom: 2px solid #30363d; }\n td { padding: 0.75rem 1rem; border-bottom: 1px solid #21262d; }\n tr:hover { background: #161b22; }\n .badge { padding: 0.25rem 0.5rem; border-radius: 12px; font-size: 0.85rem; font-weight: 600; }\n .badge-erro { background: rgba(239,68,68,0.2); color: #ef4444; }\n .badge-aviso { background: rgba(245,158,11,0.2); color: #f59e0b; }\n .badge-info { background: rgba(56,139,253,0.2); color: #388bfd; }\n .badge-sucesso { background: rgba(16,185,129,0.2); color: #10b981; }\n .summary-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; margin: 1rem 0; }\n .summary-item { background: #161b22; border: 1px solid #30363d; border-radius: 8px; padding: 1rem; }\n .summary-item .label { color: #8b949e; font-size: 0.85rem; }\n .summary-item .value { font-size: 1.5rem; font-weight: bold; color: #58a6ff; }\n .footer { margin-top: 3rem; padding-top: 1rem; border-top: 1px solid #21262d; color: #8b949e; font-size: 0.85rem; text-align: center; }\n code { background: #161b22; padding: 0.2rem 0.4rem; border-radius: 4px; font-family: 'JetBrains Mono', monospace; font-size: 0.9em; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>[FOGO] ${escapeHtml(titulo)}</h1>\n <div class=\"meta\">\n <p><strong>Repositório:</strong> ${escapeHtml(dados.nomeRepositorio)} | <strong>Data:</strong> ${escapeHtml(dados.dataAnalise)} | <strong>Tempo:</strong> ${escapeHtml(String(dados.tempoAnaliseMs))}ms</p>\n </div>\n\n <div class=\"score-card\">\n <div class=\"score-value\">${dados.scoreGeral}</div>\n <div class=\"score-label\">Score Geral (0-100)</div>\n </div>\n\n <h2>[GRAFICO] Resumo</h2>\n <div class=\"summary-grid\">\n <div class=\"summary-item\">\n <div class=\"label\">Workflows</div>\n <div class=\"value\">${dados.totalWorkflows}</div>\n </div>\n <div class=\"summary-item\">\n <div class=\"label\">Ocorrências</div>\n <div class=\"value\">${dados.ocorrencias.length}</div>\n </div>\n ${Object.entries(dados.resumoPorSeveridade).map(([sev, count]) => `\n <div class=\"summary-item\">\n <div class=\"label\">${escapeHtml(sev)}</div>\n <div class=\"value\">${count}</div>\n </div>`).join('')}\n </div>\n\n <h2>[LIST] Workflows</h2>\n <table>\n <thead><tr><th>Workflow</th><th>Score</th><th>Ocorrências</th></tr></thead>\n <tbody>\n ${dados.workflows.map(wf => {\n const scoreColor2 = wf.score >= 80 ? '#10b981' : wf.score >= 50 ? '#f59e0b' : '#ef4444';\n return `<tr><td>${escapeHtml(wf.nome)}</td><td style=\"color:${scoreColor2};font-weight:bold\">${wf.score}/100</td><td>${wf.ocorrencias}</td></tr>`;\n }).join('')}\n </tbody>\n </table>\n\n <h2>[BUSCA] Ocorrências</h2>\n <table>\n <thead><tr><th>Arquivo</th><th>Linha</th><th>Severidade</th><th>Tipo</th><th>Mensagem</th></tr></thead>\n <tbody>\n ${dados.ocorrencias.slice(0, 200).map(ocorrencia => `\n <tr>\n <td><code>${escapeHtml(ocorrencia.relPath)}</code></td>\n <td>${ocorrencia.linha || '-'}</td>\n <td><span class=\"badge badge-${ocorrencia.nivel || 'info'}\">${escapeHtml(String(ocorrencia.nivel || 'info'))}</span></td>\n <td>${escapeHtml(ocorrencia.tipo || '')}</td>\n <td>${escapeHtml(ocorrencia.mensagem || '')}</td>\n </tr>`).join('')}\n </tbody>\n </table>\n ${dados.ocorrencias.length > 200 ? `<p style=\"color:#8b949e;margin-top:1rem\">Mostrando 200 de ${dados.ocorrencias.length} ocorrências.</p>` : ''}\n\n <div class=\"footer\">\n <p>Gerado por Tutanus v0.6.0 em ${new Date().toISOString()}</p>\n </div>\n </div>\n</body>\n</html>`;\n}\nexport function gerarRelatorioCsv(dados: DadosRelatorioGithubActions): string {\n const linhas: string[] = [];\n linhas.push('Arquivo,Linha,Severidade,Tipo,Mensagem,Sugestao');\n for (const ocorrencia of dados.ocorrencias) {\n const campos = [csvEscape(ocorrencia.relPath), csvEscape(String(ocorrencia.linha || '')), csvEscape(String(ocorrencia.nivel || 'info')), csvEscape(ocorrencia.tipo || ''), csvEscape(ocorrencia.mensagem || ''), csvEscape(ocorrencia.sugestao || '')];\n linhas.push(campos.join(','));\n }\n return linhas.join('\\n');\n}\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#039;');\n}\nfunction csvEscape(str: string): string {\n if (str.includes(',') || str.includes('\"') || str.includes('\\n')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n}\nexport async function gerarRelatorio(dados: DadosRelatorioGithubActions, opcoes: OpcoesRelatorio): Promise<string> {\n const conteudo = (() => {\n switch (opcoes.formato) {\n case 'json':\n return gerarRelatorioJson(dados);\n case 'markdown':\n return gerarRelatorioMarkdown(dados, {\n titulo: opcoes.titulo,\n incluirDetalhes: opcoes.incluirDetalhes\n });\n case 'html':\n return gerarRelatorioHtml(dados, {\n titulo: opcoes.titulo\n });\n case 'csv':\n return gerarRelatorioCsv(dados);\n default:\n throw new Error(messages.ExcecoesMensagens.formatoNaoSuportado(opcoes.formato));\n }\n })();\n const dir = path.dirname(opcoes.output);\n fs.mkdirSync(dir, {\n recursive: true\n });\n fs.writeFileSync(opcoes.output, conteudo, 'utf-8');\n return opcoes.output;\n}\nexport function calcularResumoPorSeveridade(ocorrencias: Ocorrencia[]): Record<string, number> {\n const resumo: Record<string, number> = {};\n for (const ocorrencia of ocorrencias) {\n const nivel = String(ocorrencia.nivel || 'info');\n resumo[nivel] = (resumo[nivel] || 0) + 1;\n }\n return resumo;\n}\nexport function calcularResumoPorTipo(ocorrencias: Ocorrencia[]): Record<string, number> {\n const resumo: Record<string, number> = {};\n for (const ocorrencia of ocorrencias) {\n const tipo = ocorrencia.tipo || 'desconhecido';\n resumo[tipo] = (resumo[tipo] || 0) + 1;\n }\n return resumo;\n}\nexport function prepararDadosRelatorio(ocorrencias: Ocorrencia[], nomeRepositorio: string, tempoAnaliseMs: number, workflows?: Array<{\n nome: string;\n score: number;\n ocorrencias: number;\n}>): DadosRelatorioGithubActions {\n const wfList = workflows || [];\n const totalWorkflows = wfList.length || 1;\n const scoreGeral = wfList.length > 0 ? Math.round(wfList.reduce((sum, dimensaoLargura) => sum + dimensaoLargura.score, 0) / wfList.length) : Math.max(0, 100 - ocorrencias.length * 5);\n return {\n nomeRepositorio,\n dataAnalise: new Date().toISOString(),\n totalWorkflows,\n scoreGeral,\n ocorrencias,\n resumoPorSeveridade: calcularResumoPorSeveridade(ocorrencias),\n resumoPorTipo: calcularResumoPorTipo(ocorrencias),\n workflows: wfList,\n tempoAnaliseMs\n };\n}"]}