tutanus 0.12.3 → 0.12.5

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 (726) hide show
  1. package/README.md +6 -6
  2. package/dist/analysts/azure-pipelines/corrections/correction-azure.d.ts.map +1 -1
  3. package/dist/analysts/azure-pipelines/corrections/correction-azure.js +2 -1
  4. package/dist/analysts/azure-pipelines/corrections/correction-azure.js.map +1 -1
  5. package/dist/analysts/circleci/corrections/correction-circleci.d.ts.map +1 -1
  6. package/dist/analysts/circleci/corrections/correction-circleci.js +2 -1
  7. package/dist/analysts/circleci/corrections/correction-circleci.js.map +1 -1
  8. package/dist/analysts/converters/converter-base.js.map +1 -1
  9. package/dist/analysts/converters/engines/converter-gha-to-gitlab.js.map +1 -1
  10. package/dist/analysts/converters/index.js.map +1 -1
  11. package/dist/analysts/corrections/analyst-quick-fixes.d.ts.map +1 -1
  12. package/dist/analysts/corrections/analyst-quick-fixes.js +1 -0
  13. package/dist/analysts/corrections/analyst-quick-fixes.js.map +1 -1
  14. package/dist/analysts/corrections/analyst-scoring.d.ts.map +1 -1
  15. package/dist/analysts/corrections/analyst-scoring.js +1 -0
  16. package/dist/analysts/corrections/analyst-scoring.js.map +1 -1
  17. package/dist/analysts/corrections/map-reversion.js +2 -2
  18. package/dist/analysts/corrections/map-reversion.js.map +1 -1
  19. package/dist/analysts/corrections/pruning.js +3 -3
  20. package/dist/analysts/corrections/pruning.js.map +1 -1
  21. package/dist/analysts/css/corrections/correction-css.d.ts.map +1 -1
  22. package/dist/analysts/css/corrections/correction-css.js +2 -1
  23. package/dist/analysts/css/corrections/correction-css.js.map +1 -1
  24. package/dist/analysts/css/detectors/detector-css-best-practices.d.ts.map +1 -1
  25. package/dist/analysts/css/detectors/detector-css-best-practices.js +11 -10
  26. package/dist/analysts/css/detectors/detector-css-best-practices.js.map +1 -1
  27. package/dist/analysts/detectors/detector-recommendation-architecture.js +2 -2
  28. package/dist/analysts/detectors/detector-recommendation-architecture.js.map +1 -1
  29. package/dist/analysts/github-actions/analysts/analyst-github-actions.d.ts.map +1 -1
  30. package/dist/analysts/github-actions/analysts/analyst-github-actions.js +10 -9
  31. package/dist/analysts/github-actions/analysts/analyst-github-actions.js.map +1 -1
  32. package/dist/analysts/github-actions/corrections/autofix-engine.d.ts.map +1 -1
  33. package/dist/analysts/github-actions/corrections/autofix-engine.js +3 -1
  34. package/dist/analysts/github-actions/corrections/autofix-engine.js.map +1 -1
  35. package/dist/analysts/github-actions/corrections/correction-workflow.d.ts.map +1 -1
  36. package/dist/analysts/github-actions/corrections/correction-workflow.js +2 -1
  37. package/dist/analysts/github-actions/corrections/correction-workflow.js.map +1 -1
  38. package/dist/analysts/github-actions/detectors/detector-dependencies-vulnerable.d.ts.map +1 -1
  39. package/dist/analysts/github-actions/detectors/detector-dependencies-vulnerable.js +8 -7
  40. package/dist/analysts/github-actions/detectors/detector-dependencies-vulnerable.js.map +1 -1
  41. package/dist/analysts/github-actions/detectors/detector-workflow-accessibility.d.ts.map +1 -1
  42. package/dist/analysts/github-actions/detectors/detector-workflow-accessibility.js +5 -4
  43. package/dist/analysts/github-actions/detectors/detector-workflow-accessibility.js.map +1 -1
  44. package/dist/analysts/github-actions/detectors/detector-workflow-security.d.ts.map +1 -1
  45. package/dist/analysts/github-actions/detectors/detector-workflow-security.js +21 -20
  46. package/dist/analysts/github-actions/detectors/detector-workflow-security.js.map +1 -1
  47. package/dist/analysts/github-actions/detectors/detector-workflow-trigger-unsafe.d.ts.map +1 -1
  48. package/dist/analysts/github-actions/detectors/detector-workflow-trigger-unsafe.js +9 -8
  49. package/dist/analysts/github-actions/detectors/detector-workflow-trigger-unsafe.js.map +1 -1
  50. package/dist/analysts/github-actions/detectors/org-verified.js.map +1 -1
  51. package/dist/analysts/github-actions/reports/generator-report-github-actions.js +4 -4
  52. package/dist/analysts/github-actions/reports/generator-report-github-actions.js.map +1 -1
  53. package/dist/analysts/gitlab-ci/analysts/analyst-gitlab-ci.d.ts.map +1 -1
  54. package/dist/analysts/gitlab-ci/analysts/analyst-gitlab-ci.js +2 -1
  55. package/dist/analysts/gitlab-ci/analysts/analyst-gitlab-ci.js.map +1 -1
  56. package/dist/analysts/gitlab-ci/corrections/correction-gitlab-ci.d.ts.map +1 -1
  57. package/dist/analysts/gitlab-ci/corrections/correction-gitlab-ci.js +2 -1
  58. package/dist/analysts/gitlab-ci/corrections/correction-gitlab-ci.js.map +1 -1
  59. package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-performance.d.ts.map +1 -1
  60. package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-performance.js +4 -3
  61. package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-performance.js.map +1 -1
  62. package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-security.d.ts.map +1 -1
  63. package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-security.js +4 -3
  64. package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-security.js.map +1 -1
  65. package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-structure.d.ts.map +1 -1
  66. package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-structure.js +3 -2
  67. package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-structure.js.map +1 -1
  68. package/dist/analysts/go/detectors/detector-conventions.js +4 -4
  69. package/dist/analysts/go/detectors/detector-conventions.js.map +1 -1
  70. package/dist/analysts/go/detectors/detector-errors-un-handled.js +1 -1
  71. package/dist/analysts/go/detectors/detector-errors-un-handled.js.map +1 -1
  72. package/dist/analysts/go/detectors/detector-vulnerabilities.js +3 -3
  73. package/dist/analysts/go/detectors/detector-vulnerabilities.js.map +1 -1
  74. package/dist/analysts/html/corrections/correction-html.d.ts.map +1 -1
  75. package/dist/analysts/html/corrections/correction-html.js +2 -1
  76. package/dist/analysts/html/corrections/correction-html.js.map +1 -1
  77. package/dist/analysts/jenkins/corrections/correction-jenkins.d.ts.map +1 -1
  78. package/dist/analysts/jenkins/corrections/correction-jenkins.js +2 -1
  79. package/dist/analysts/jenkins/corrections/correction-jenkins.js.map +1 -1
  80. package/dist/analysts/js-ts/analysts/analyst-todo-comments.d.ts.map +1 -1
  81. package/dist/analysts/js-ts/analysts/analyst-todo-comments.js +2 -1
  82. package/dist/analysts/js-ts/analysts/analyst-todo-comments.js.map +1 -1
  83. package/dist/analysts/js-ts/detectors/detector-anti-patterns-async.d.ts.map +1 -1
  84. package/dist/analysts/js-ts/detectors/detector-anti-patterns-async.js +3 -2
  85. package/dist/analysts/js-ts/detectors/detector-anti-patterns-async.js.map +1 -1
  86. package/dist/analysts/js-ts/detectors/detector-context-smart.js +10 -10
  87. package/dist/analysts/js-ts/detectors/detector-context-smart.js.map +1 -1
  88. package/dist/analysts/js-ts/detectors/detector-leaks-memory.d.ts.map +1 -1
  89. package/dist/analysts/js-ts/detectors/detector-leaks-memory.js +4 -3
  90. package/dist/analysts/js-ts/detectors/detector-leaks-memory.js.map +1 -1
  91. package/dist/analysts/js-ts/detectors/detector-types-unsafe.d.ts.map +1 -1
  92. package/dist/analysts/js-ts/detectors/detector-types-unsafe.js +35 -34
  93. package/dist/analysts/js-ts/detectors/detector-types-unsafe.js.map +1 -1
  94. package/dist/analysts/plugins/detector-documentation.js.map +1 -1
  95. package/dist/analysts/plugins/index.js.map +1 -1
  96. package/dist/analysts/python/corrections/correction-python.d.ts.map +1 -1
  97. package/dist/analysts/python/corrections/correction-python.js +2 -1
  98. package/dist/analysts/python/corrections/correction-python.js.map +1 -1
  99. package/dist/analysts/react/corrections/correction-react.d.ts.map +1 -1
  100. package/dist/analysts/react/corrections/correction-react.js +2 -1
  101. package/dist/analysts/react/corrections/correction-react.js.map +1 -1
  102. package/dist/analysts/rust/detectors/detector-conventions.js +4 -4
  103. package/dist/analysts/rust/detectors/detector-conventions.js.map +1 -1
  104. package/dist/analysts/rust/detectors/detector-errors-potential.js +4 -4
  105. package/dist/analysts/rust/detectors/detector-errors-potential.js.map +1 -1
  106. package/dist/analysts/rust/detectors/detector-unsafe.js +2 -2
  107. package/dist/analysts/rust/detectors/detector-unsafe.js.map +1 -1
  108. package/dist/analysts/scorers/scorer.js +67 -67
  109. package/dist/analysts/scorers/scorer.js.map +1 -1
  110. package/dist/analysts/shell/analysts/analyst-shell.d.ts.map +1 -1
  111. package/dist/analysts/shell/analysts/analyst-shell.js +17 -16
  112. package/dist/analysts/shell/analysts/analyst-shell.js.map +1 -1
  113. package/dist/analysts/shell/corrections/correction-shell.d.ts.map +1 -1
  114. package/dist/analysts/shell/corrections/correction-shell.js +2 -1
  115. package/dist/analysts/shell/corrections/correction-shell.js.map +1 -1
  116. package/dist/analysts/sql/corrections/correction-sql.d.ts.map +1 -1
  117. package/dist/analysts/sql/corrections/correction-sql.js +2 -1
  118. package/dist/analysts/sql/corrections/correction-sql.js.map +1 -1
  119. package/dist/analysts/svg/corrections/correction-svg.d.ts.map +1 -1
  120. package/dist/analysts/svg/corrections/correction-svg.js +2 -1
  121. package/dist/analysts/svg/corrections/correction-svg.js.map +1 -1
  122. package/dist/analysts/tailwind/corrections/correction-tailwind.d.ts.map +1 -1
  123. package/dist/analysts/tailwind/corrections/correction-tailwind.js +2 -1
  124. package/dist/analysts/tailwind/corrections/correction-tailwind.js.map +1 -1
  125. package/dist/analysts/xml/corrections/correction-xml.d.ts.map +1 -1
  126. package/dist/analysts/xml/corrections/correction-xml.js +2 -1
  127. package/dist/analysts/xml/corrections/correction-xml.js.map +1 -1
  128. package/dist/app/github/app/repo-downloader.d.ts +2 -0
  129. package/dist/app/github/app/repo-downloader.d.ts.map +1 -1
  130. package/dist/app/github/app/repo-downloader.js +2 -2
  131. package/dist/app/github/app/repo-downloader.js.map +1 -1
  132. package/dist/app/github/app/webhook-handler.js +3 -3
  133. package/dist/app/github/app/webhook-handler.js.map +1 -1
  134. package/dist/app/github/jobs/auto-fix-job.d.ts.map +1 -1
  135. package/dist/app/github/jobs/auto-fix-job.js +19 -3
  136. package/dist/app/github/jobs/auto-fix-job.js.map +1 -1
  137. package/dist/app/github/push-analysis/pr-analysis-service.d.ts.map +1 -1
  138. package/dist/app/github/push-analysis/pr-analysis-service.js +2 -1
  139. package/dist/app/github/push-analysis/pr-analysis-service.js.map +1 -1
  140. package/dist/app/github/push-analysis/push-analysis-service.d.ts.map +1 -1
  141. package/dist/app/github/push-analysis/push-analysis-service.js +21 -8
  142. package/dist/app/github/push-analysis/push-analysis-service.js.map +1 -1
  143. package/dist/app/github/push-analysis/push-report.js +2 -2
  144. package/dist/app/github/push-analysis/push-report.js.map +1 -1
  145. package/dist/cli/commands/command-azure.js +1 -1
  146. package/dist/cli/commands/command-azure.js.map +1 -1
  147. package/dist/cli/commands/command-circleci.js +1 -1
  148. package/dist/cli/commands/command-circleci.js.map +1 -1
  149. package/dist/cli/commands/command-convert.js.map +1 -1
  150. package/dist/cli/commands/command-github-actions.js +1 -1
  151. package/dist/cli/commands/command-github-actions.js.map +1 -1
  152. package/dist/cli/commands/command-gitlab-ci.js +1 -1
  153. package/dist/cli/commands/command-gitlab-ci.js.map +1 -1
  154. package/dist/cli/commands/command-jenkins.js +1 -1
  155. package/dist/cli/commands/command-jenkins.js.map +1 -1
  156. package/dist/cli/commands/command-licenses.js +4 -4
  157. package/dist/cli/commands/command-licenses.js.map +1 -1
  158. package/dist/cli/commands/command-server.d.ts.map +1 -1
  159. package/dist/cli/commands/command-server.js +11 -7
  160. package/dist/cli/commands/command-server.js.map +1 -1
  161. package/dist/cli/diagnostic/exporters/compliance-exporter.js +2 -2
  162. package/dist/cli/diagnostic/exporters/compliance-exporter.js.map +1 -1
  163. package/dist/cli/diagnostic/exporters/markdown-exporter.js +7 -7
  164. package/dist/cli/diagnostic/exporters/markdown-exporter.js.map +1 -1
  165. package/dist/cli/diagnostic/handlers/archetype-handler.js.map +1 -1
  166. package/dist/cli/diagnostic/handlers/guardian-handler.js.map +1 -1
  167. package/dist/cli/diagnostic/processing-diagnostic.js +1 -1
  168. package/dist/cli/diagnostic/processing-diagnostic.js.map +1 -1
  169. package/dist/core/config/auto/fix-config.js.map +1 -1
  170. package/dist/core/config/auto/validation.d.ts.map +1 -1
  171. package/dist/core/config/auto/validation.js +1 -1
  172. package/dist/core/config/auto/validation.js.map +1 -1
  173. package/dist/core/config/excludes-padrao.d.ts.map +1 -1
  174. package/dist/core/config/excludes-padrao.js +3 -1
  175. package/dist/core/config/excludes-padrao.js.map +1 -1
  176. package/dist/core/execution/executor.d.ts.map +1 -1
  177. package/dist/core/execution/executor.js +40 -41
  178. package/dist/core/execution/executor.js.map +1 -1
  179. package/dist/core/execution/inquisitor.d.ts.map +1 -1
  180. package/dist/core/execution/inquisitor.js +21 -20
  181. package/dist/core/execution/inquisitor.js.map +1 -1
  182. package/dist/core/execution/scanner.js.map +1 -1
  183. package/dist/core/messages/en/analysts/analyst-github-actions-messages.d.ts +45 -0
  184. package/dist/core/messages/en/analysts/analyst-github-actions-messages.d.ts.map +1 -1
  185. package/dist/core/messages/en/analysts/analyst-github-actions-messages.js +45 -0
  186. package/dist/core/messages/en/analysts/analyst-github-actions-messages.js.map +1 -1
  187. package/dist/core/messages/en/analysts/analyst-gitlab-ci-messages.d.ts +12 -0
  188. package/dist/core/messages/en/analysts/analyst-gitlab-ci-messages.d.ts.map +1 -0
  189. package/dist/core/messages/en/analysts/analyst-gitlab-ci-messages.js +12 -0
  190. package/dist/core/messages/en/analysts/analyst-gitlab-ci-messages.js.map +1 -0
  191. package/dist/core/messages/en/analysts/analyst-shell-messages.d.ts +19 -0
  192. package/dist/core/messages/en/analysts/analyst-shell-messages.d.ts.map +1 -0
  193. package/dist/core/messages/en/analysts/analyst-shell-messages.js +19 -0
  194. package/dist/core/messages/en/analysts/analyst-shell-messages.js.map +1 -0
  195. package/dist/core/messages/en/analysts/analyst-todo-comments-messages.d.ts +1 -0
  196. package/dist/core/messages/en/analysts/analyst-todo-comments-messages.d.ts.map +1 -1
  197. package/dist/core/messages/en/analysts/analyst-todo-comments-messages.js +2 -1
  198. package/dist/core/messages/en/analysts/analyst-todo-comments-messages.js.map +1 -1
  199. package/dist/core/messages/en/analysts/archetypes-extra-messages.d.ts +2 -2
  200. package/dist/core/messages/en/analysts/archetypes-extra-messages.js +2 -2
  201. package/dist/core/messages/en/analysts/archetypes-extra-messages.js.map +1 -1
  202. package/dist/core/messages/en/analysts/detector-clean-arch-messages.d.ts +4 -4
  203. package/dist/core/messages/en/analysts/detector-clean-arch-messages.js +4 -4
  204. package/dist/core/messages/en/analysts/detector-clean-arch-messages.js.map +1 -1
  205. package/dist/core/messages/en/analysts/detector-css-messages.d.ts +13 -0
  206. package/dist/core/messages/en/analysts/detector-css-messages.d.ts.map +1 -0
  207. package/dist/core/messages/en/analysts/detector-css-messages.js +13 -0
  208. package/dist/core/messages/en/analysts/detector-css-messages.js.map +1 -0
  209. package/dist/core/messages/en/analysts/detector-js-ts-messages.d.ts +2 -2
  210. package/dist/core/messages/en/analysts/detector-js-ts-messages.js +2 -2
  211. package/dist/core/messages/en/analysts/detector-js-ts-messages.js.map +1 -1
  212. package/dist/core/messages/en/analysts/index.d.ts +3 -0
  213. package/dist/core/messages/en/analysts/index.d.ts.map +1 -1
  214. package/dist/core/messages/en/analysts/index.js +3 -0
  215. package/dist/core/messages/en/analysts/index.js.map +1 -1
  216. package/dist/core/messages/en/analysts/map-reversion-extra-messages.d.ts +6 -6
  217. package/dist/core/messages/en/analysts/map-reversion-extra-messages.js +6 -6
  218. package/dist/core/messages/en/analysts/map-reversion-extra-messages.js.map +1 -1
  219. package/dist/core/messages/en/analysts/report-github-actions-messages.d.ts +2 -2
  220. package/dist/core/messages/en/analysts/report-github-actions-messages.js +2 -2
  221. package/dist/core/messages/en/analysts/report-github-actions-messages.js.map +1 -1
  222. package/dist/core/messages/en/analysts/scorer-messages.d.ts +45 -45
  223. package/dist/core/messages/en/analysts/scorer-messages.js +49 -49
  224. package/dist/core/messages/en/analysts/scorer-messages.js.map +1 -1
  225. package/dist/core/messages/en/api/api-server-messages.d.ts +1 -0
  226. package/dist/core/messages/en/api/api-server-messages.d.ts.map +1 -1
  227. package/dist/core/messages/en/api/api-server-messages.js +1 -0
  228. package/dist/core/messages/en/api/api-server-messages.js.map +1 -1
  229. package/dist/core/messages/en/cli/cli-command-convert-messages.d.ts +1 -1
  230. package/dist/core/messages/en/cli/cli-command-convert-messages.js +1 -1
  231. package/dist/core/messages/en/cli/cli-command-convert-messages.js.map +1 -1
  232. package/dist/core/messages/en/cli/cli-command-format-messages.d.ts +1 -1
  233. package/dist/core/messages/en/cli/cli-command-format-messages.js +1 -1
  234. package/dist/core/messages/en/cli/cli-command-format-messages.js.map +1 -1
  235. package/dist/core/messages/en/cli/cli-command-github-actions-messages.d.ts +1 -1
  236. package/dist/core/messages/en/cli/cli-command-github-actions-messages.js +4 -4
  237. package/dist/core/messages/en/cli/cli-command-github-actions-messages.js.map +1 -1
  238. package/dist/core/messages/en/cli/cli-command-server-messages.d.ts +4 -0
  239. package/dist/core/messages/en/cli/cli-command-server-messages.d.ts.map +1 -1
  240. package/dist/core/messages/en/cli/cli-command-server-messages.js +4 -0
  241. package/dist/core/messages/en/cli/cli-command-server-messages.js.map +1 -1
  242. package/dist/core/messages/en/cli/cli-command-update-messages.d.ts +2 -2
  243. package/dist/core/messages/en/cli/cli-command-update-messages.js +2 -2
  244. package/dist/core/messages/en/cli/cli-command-update-messages.js.map +1 -1
  245. package/dist/core/messages/en/cli/cli-flags-validator-messages.d.ts +3 -3
  246. package/dist/core/messages/en/cli/cli-flags-validator-messages.js +3 -3
  247. package/dist/core/messages/en/cli/cli-flags-validator-messages.js.map +1 -1
  248. package/dist/core/messages/en/core/correcoes-messages.js +2 -2
  249. package/dist/core/messages/en/core/correcoes-messages.js.map +1 -1
  250. package/dist/core/messages/en/core/excecoes-messages.d.ts +1 -0
  251. package/dist/core/messages/en/core/excecoes-messages.d.ts.map +1 -1
  252. package/dist/core/messages/en/core/excecoes-messages.js +1 -0
  253. package/dist/core/messages/en/core/excecoes-messages.js.map +1 -1
  254. package/dist/core/messages/en/core/executor-extra-messages.d.ts +3 -0
  255. package/dist/core/messages/en/core/executor-extra-messages.d.ts.map +1 -1
  256. package/dist/core/messages/en/core/executor-extra-messages.js +3 -0
  257. package/dist/core/messages/en/core/executor-extra-messages.js.map +1 -1
  258. package/dist/core/messages/en/core/inquisitor-extra-messages.d.ts +2 -2
  259. package/dist/core/messages/en/core/inquisitor-extra-messages.js +2 -2
  260. package/dist/core/messages/en/core/inquisitor-extra-messages.js.map +1 -1
  261. package/dist/core/messages/en/core/parser-extra-messages.d.ts +3 -3
  262. package/dist/core/messages/en/core/parser-extra-messages.js +3 -3
  263. package/dist/core/messages/en/core/parser-extra-messages.js.map +1 -1
  264. package/dist/core/messages/en/core/plugin-messages.d.ts +18 -0
  265. package/dist/core/messages/en/core/plugin-messages.d.ts.map +1 -1
  266. package/dist/core/messages/en/core/plugin-messages.js +20 -2
  267. package/dist/core/messages/en/core/plugin-messages.js.map +1 -1
  268. package/dist/core/messages/en/github/github-webhook-messages.d.ts +2 -0
  269. package/dist/core/messages/en/github/github-webhook-messages.d.ts.map +1 -1
  270. package/dist/core/messages/en/github/github-webhook-messages.js +2 -0
  271. package/dist/core/messages/en/github/github-webhook-messages.js.map +1 -1
  272. package/dist/core/messages/en/guardian/guardian-messages.d.ts +4 -2
  273. package/dist/core/messages/en/guardian/guardian-messages.d.ts.map +1 -1
  274. package/dist/core/messages/en/guardian/guardian-messages.js +4 -2
  275. package/dist/core/messages/en/guardian/guardian-messages.js.map +1 -1
  276. package/dist/core/messages/en/guardian/watcher-hidden-messages.d.ts +2 -2
  277. package/dist/core/messages/en/guardian/watcher-hidden-messages.js +2 -2
  278. package/dist/core/messages/en/guardian/watcher-hidden-messages.js.map +1 -1
  279. package/dist/core/messages/en/log/log-helper.js.map +1 -1
  280. package/dist/core/messages/en/reports/report-async-patterns-messages.d.ts +3 -3
  281. package/dist/core/messages/en/reports/report-async-patterns-messages.js +3 -3
  282. package/dist/core/messages/en/reports/report-async-patterns-messages.js.map +1 -1
  283. package/dist/core/messages/en/reports/report-messages.d.ts +13 -0
  284. package/dist/core/messages/en/reports/report-messages.d.ts.map +1 -1
  285. package/dist/core/messages/en/reports/report-messages.js +14 -1
  286. package/dist/core/messages/en/reports/report-messages.js.map +1 -1
  287. package/dist/core/messages/en/shared/plugin-core-messages.d.ts +2 -2
  288. package/dist/core/messages/en/shared/plugin-core-messages.js +2 -2
  289. package/dist/core/messages/en/shared/plugin-core-messages.js.map +1 -1
  290. package/dist/core/messages/en/shared/plugin-registry-messages.d.ts +4 -4
  291. package/dist/core/messages/en/shared/plugin-registry-messages.js +4 -4
  292. package/dist/core/messages/en/shared/plugin-registry-messages.js.map +1 -1
  293. package/dist/core/messages/en/shared/shared-common-messages.d.ts +2 -0
  294. package/dist/core/messages/en/shared/shared-common-messages.d.ts.map +1 -1
  295. package/dist/core/messages/en/shared/shared-common-messages.js +2 -0
  296. package/dist/core/messages/en/shared/shared-common-messages.js.map +1 -1
  297. package/dist/core/messages/ja/analysts/analyst-github-actions-messages.d.ts +45 -0
  298. package/dist/core/messages/ja/analysts/analyst-github-actions-messages.d.ts.map +1 -1
  299. package/dist/core/messages/ja/analysts/analyst-github-actions-messages.js +45 -0
  300. package/dist/core/messages/ja/analysts/analyst-github-actions-messages.js.map +1 -1
  301. package/dist/core/messages/ja/analysts/analyst-gitlab-ci-messages.d.ts +12 -0
  302. package/dist/core/messages/ja/analysts/analyst-gitlab-ci-messages.d.ts.map +1 -0
  303. package/dist/core/messages/ja/analysts/analyst-gitlab-ci-messages.js +12 -0
  304. package/dist/core/messages/ja/analysts/analyst-gitlab-ci-messages.js.map +1 -0
  305. package/dist/core/messages/ja/analysts/analyst-shell-messages.d.ts +19 -0
  306. package/dist/core/messages/ja/analysts/analyst-shell-messages.d.ts.map +1 -0
  307. package/dist/core/messages/ja/analysts/analyst-shell-messages.js +19 -0
  308. package/dist/core/messages/ja/analysts/analyst-shell-messages.js.map +1 -0
  309. package/dist/core/messages/ja/analysts/analyst-todo-comments-messages.d.ts +1 -0
  310. package/dist/core/messages/ja/analysts/analyst-todo-comments-messages.d.ts.map +1 -1
  311. package/dist/core/messages/ja/analysts/analyst-todo-comments-messages.js +2 -1
  312. package/dist/core/messages/ja/analysts/analyst-todo-comments-messages.js.map +1 -1
  313. package/dist/core/messages/ja/analysts/archetypes-extra-messages.d.ts +2 -2
  314. package/dist/core/messages/ja/analysts/archetypes-extra-messages.js +2 -2
  315. package/dist/core/messages/ja/analysts/archetypes-extra-messages.js.map +1 -1
  316. package/dist/core/messages/ja/analysts/detector-clean-arch-messages.d.ts +4 -4
  317. package/dist/core/messages/ja/analysts/detector-clean-arch-messages.js +4 -4
  318. package/dist/core/messages/ja/analysts/detector-clean-arch-messages.js.map +1 -1
  319. package/dist/core/messages/ja/analysts/detector-css-messages.d.ts +13 -0
  320. package/dist/core/messages/ja/analysts/detector-css-messages.d.ts.map +1 -0
  321. package/dist/core/messages/ja/analysts/detector-css-messages.js +13 -0
  322. package/dist/core/messages/ja/analysts/detector-css-messages.js.map +1 -0
  323. package/dist/core/messages/ja/analysts/detector-js-ts-messages.d.ts +2 -2
  324. package/dist/core/messages/ja/analysts/detector-js-ts-messages.js +2 -2
  325. package/dist/core/messages/ja/analysts/detector-js-ts-messages.js.map +1 -1
  326. package/dist/core/messages/ja/analysts/index.d.ts +3 -0
  327. package/dist/core/messages/ja/analysts/index.d.ts.map +1 -1
  328. package/dist/core/messages/ja/analysts/index.js +3 -0
  329. package/dist/core/messages/ja/analysts/index.js.map +1 -1
  330. package/dist/core/messages/ja/analysts/map-reversion-extra-messages.d.ts +6 -6
  331. package/dist/core/messages/ja/analysts/map-reversion-extra-messages.js +6 -6
  332. package/dist/core/messages/ja/analysts/map-reversion-extra-messages.js.map +1 -1
  333. package/dist/core/messages/ja/analysts/report-github-actions-messages.d.ts +2 -2
  334. package/dist/core/messages/ja/analysts/report-github-actions-messages.js +2 -2
  335. package/dist/core/messages/ja/analysts/report-github-actions-messages.js.map +1 -1
  336. package/dist/core/messages/ja/analysts/scorer-messages.d.ts +45 -45
  337. package/dist/core/messages/ja/analysts/scorer-messages.js +49 -49
  338. package/dist/core/messages/ja/analysts/scorer-messages.js.map +1 -1
  339. package/dist/core/messages/ja/api/api-server-messages.d.ts +1 -0
  340. package/dist/core/messages/ja/api/api-server-messages.d.ts.map +1 -1
  341. package/dist/core/messages/ja/api/api-server-messages.js +1 -0
  342. package/dist/core/messages/ja/api/api-server-messages.js.map +1 -1
  343. package/dist/core/messages/ja/cli/cli-command-analysts-messages.d.ts +2 -2
  344. package/dist/core/messages/ja/cli/cli-command-analysts-messages.js +2 -2
  345. package/dist/core/messages/ja/cli/cli-command-analysts-messages.js.map +1 -1
  346. package/dist/core/messages/ja/cli/cli-command-convert-messages.d.ts +1 -1
  347. package/dist/core/messages/ja/cli/cli-command-convert-messages.js +1 -1
  348. package/dist/core/messages/ja/cli/cli-command-convert-messages.js.map +1 -1
  349. package/dist/core/messages/ja/cli/cli-command-format-messages.d.ts +1 -1
  350. package/dist/core/messages/ja/cli/cli-command-format-messages.js +1 -1
  351. package/dist/core/messages/ja/cli/cli-command-format-messages.js.map +1 -1
  352. package/dist/core/messages/ja/cli/cli-command-github-actions-messages.d.ts +1 -1
  353. package/dist/core/messages/ja/cli/cli-command-github-actions-messages.js +4 -4
  354. package/dist/core/messages/ja/cli/cli-command-github-actions-messages.js.map +1 -1
  355. package/dist/core/messages/ja/cli/cli-command-server-messages.d.ts +4 -0
  356. package/dist/core/messages/ja/cli/cli-command-server-messages.d.ts.map +1 -1
  357. package/dist/core/messages/ja/cli/cli-command-server-messages.js +4 -0
  358. package/dist/core/messages/ja/cli/cli-command-server-messages.js.map +1 -1
  359. package/dist/core/messages/ja/cli/cli-command-update-messages.d.ts +2 -2
  360. package/dist/core/messages/ja/cli/cli-command-update-messages.js +2 -2
  361. package/dist/core/messages/ja/cli/cli-command-update-messages.js.map +1 -1
  362. package/dist/core/messages/ja/cli/cli-flags-validator-messages.d.ts +3 -3
  363. package/dist/core/messages/ja/cli/cli-flags-validator-messages.js +3 -3
  364. package/dist/core/messages/ja/cli/cli-flags-validator-messages.js.map +1 -1
  365. package/dist/core/messages/ja/core/correcoes-messages.js +2 -2
  366. package/dist/core/messages/ja/core/correcoes-messages.js.map +1 -1
  367. package/dist/core/messages/ja/core/excecoes-messages.d.ts +1 -0
  368. package/dist/core/messages/ja/core/excecoes-messages.d.ts.map +1 -1
  369. package/dist/core/messages/ja/core/excecoes-messages.js +1 -0
  370. package/dist/core/messages/ja/core/excecoes-messages.js.map +1 -1
  371. package/dist/core/messages/ja/core/executor-extra-messages.d.ts +3 -0
  372. package/dist/core/messages/ja/core/executor-extra-messages.d.ts.map +1 -1
  373. package/dist/core/messages/ja/core/executor-extra-messages.js +3 -0
  374. package/dist/core/messages/ja/core/executor-extra-messages.js.map +1 -1
  375. package/dist/core/messages/ja/core/inquisitor-extra-messages.d.ts +2 -2
  376. package/dist/core/messages/ja/core/inquisitor-extra-messages.js +2 -2
  377. package/dist/core/messages/ja/core/inquisitor-extra-messages.js.map +1 -1
  378. package/dist/core/messages/ja/core/parser-extra-messages.d.ts +3 -3
  379. package/dist/core/messages/ja/core/parser-extra-messages.js +3 -3
  380. package/dist/core/messages/ja/core/parser-extra-messages.js.map +1 -1
  381. package/dist/core/messages/ja/core/plugin-messages.d.ts +18 -0
  382. package/dist/core/messages/ja/core/plugin-messages.d.ts.map +1 -1
  383. package/dist/core/messages/ja/core/plugin-messages.js +20 -2
  384. package/dist/core/messages/ja/core/plugin-messages.js.map +1 -1
  385. package/dist/core/messages/ja/github/github-webhook-messages.d.ts +2 -0
  386. package/dist/core/messages/ja/github/github-webhook-messages.d.ts.map +1 -1
  387. package/dist/core/messages/ja/github/github-webhook-messages.js +2 -0
  388. package/dist/core/messages/ja/github/github-webhook-messages.js.map +1 -1
  389. package/dist/core/messages/ja/guardian/guardian-messages.d.ts +4 -2
  390. package/dist/core/messages/ja/guardian/guardian-messages.d.ts.map +1 -1
  391. package/dist/core/messages/ja/guardian/guardian-messages.js +4 -2
  392. package/dist/core/messages/ja/guardian/guardian-messages.js.map +1 -1
  393. package/dist/core/messages/ja/guardian/watcher-hidden-messages.d.ts +2 -2
  394. package/dist/core/messages/ja/guardian/watcher-hidden-messages.js +2 -2
  395. package/dist/core/messages/ja/guardian/watcher-hidden-messages.js.map +1 -1
  396. package/dist/core/messages/ja/log/log-helper.js.map +1 -1
  397. package/dist/core/messages/ja/reports/report-async-patterns-messages.d.ts +3 -3
  398. package/dist/core/messages/ja/reports/report-async-patterns-messages.js +3 -3
  399. package/dist/core/messages/ja/reports/report-async-patterns-messages.js.map +1 -1
  400. package/dist/core/messages/ja/reports/report-messages.d.ts +13 -0
  401. package/dist/core/messages/ja/reports/report-messages.d.ts.map +1 -1
  402. package/dist/core/messages/ja/reports/report-messages.js +14 -1
  403. package/dist/core/messages/ja/reports/report-messages.js.map +1 -1
  404. package/dist/core/messages/ja/shared/plugin-core-messages.d.ts +2 -2
  405. package/dist/core/messages/ja/shared/plugin-core-messages.js +2 -2
  406. package/dist/core/messages/ja/shared/plugin-core-messages.js.map +1 -1
  407. package/dist/core/messages/ja/shared/plugin-registry-messages.d.ts +4 -4
  408. package/dist/core/messages/ja/shared/plugin-registry-messages.js +4 -4
  409. package/dist/core/messages/ja/shared/plugin-registry-messages.js.map +1 -1
  410. package/dist/core/messages/ja/shared/shared-common-messages.d.ts +2 -0
  411. package/dist/core/messages/ja/shared/shared-common-messages.d.ts.map +1 -1
  412. package/dist/core/messages/ja/shared/shared-common-messages.js +2 -0
  413. package/dist/core/messages/ja/shared/shared-common-messages.js.map +1 -1
  414. package/dist/core/messages/pt/analysts/analyst-github-actions-messages.d.ts +45 -0
  415. package/dist/core/messages/pt/analysts/analyst-github-actions-messages.d.ts.map +1 -1
  416. package/dist/core/messages/pt/analysts/analyst-github-actions-messages.js +45 -0
  417. package/dist/core/messages/pt/analysts/analyst-github-actions-messages.js.map +1 -1
  418. package/dist/core/messages/pt/analysts/analyst-gitlab-ci-messages.d.ts +12 -0
  419. package/dist/core/messages/pt/analysts/analyst-gitlab-ci-messages.d.ts.map +1 -0
  420. package/dist/core/messages/pt/analysts/analyst-gitlab-ci-messages.js +12 -0
  421. package/dist/core/messages/pt/analysts/analyst-gitlab-ci-messages.js.map +1 -0
  422. package/dist/core/messages/pt/analysts/analyst-shell-messages.d.ts +19 -0
  423. package/dist/core/messages/pt/analysts/analyst-shell-messages.d.ts.map +1 -0
  424. package/dist/core/messages/pt/analysts/analyst-shell-messages.js +19 -0
  425. package/dist/core/messages/pt/analysts/analyst-shell-messages.js.map +1 -0
  426. package/dist/core/messages/pt/analysts/analyst-todo-comments-messages.d.ts +1 -0
  427. package/dist/core/messages/pt/analysts/analyst-todo-comments-messages.d.ts.map +1 -1
  428. package/dist/core/messages/pt/analysts/analyst-todo-comments-messages.js +2 -1
  429. package/dist/core/messages/pt/analysts/analyst-todo-comments-messages.js.map +1 -1
  430. package/dist/core/messages/pt/analysts/archetypes-extra-messages.d.ts +2 -2
  431. package/dist/core/messages/pt/analysts/archetypes-extra-messages.js +2 -2
  432. package/dist/core/messages/pt/analysts/archetypes-extra-messages.js.map +1 -1
  433. package/dist/core/messages/pt/analysts/detector-clean-arch-messages.d.ts +4 -4
  434. package/dist/core/messages/pt/analysts/detector-clean-arch-messages.js +4 -4
  435. package/dist/core/messages/pt/analysts/detector-clean-arch-messages.js.map +1 -1
  436. package/dist/core/messages/pt/analysts/detector-css-messages.d.ts +13 -0
  437. package/dist/core/messages/pt/analysts/detector-css-messages.d.ts.map +1 -0
  438. package/dist/core/messages/pt/analysts/detector-css-messages.js +13 -0
  439. package/dist/core/messages/pt/analysts/detector-css-messages.js.map +1 -0
  440. package/dist/core/messages/pt/analysts/detector-js-ts-messages.d.ts +2 -2
  441. package/dist/core/messages/pt/analysts/detector-js-ts-messages.js +2 -2
  442. package/dist/core/messages/pt/analysts/detector-js-ts-messages.js.map +1 -1
  443. package/dist/core/messages/pt/analysts/index.d.ts +3 -0
  444. package/dist/core/messages/pt/analysts/index.d.ts.map +1 -1
  445. package/dist/core/messages/pt/analysts/index.js +3 -0
  446. package/dist/core/messages/pt/analysts/index.js.map +1 -1
  447. package/dist/core/messages/pt/analysts/map-reversion-extra-messages.d.ts +6 -6
  448. package/dist/core/messages/pt/analysts/map-reversion-extra-messages.js +6 -6
  449. package/dist/core/messages/pt/analysts/map-reversion-extra-messages.js.map +1 -1
  450. package/dist/core/messages/pt/analysts/report-github-actions-messages.d.ts +2 -2
  451. package/dist/core/messages/pt/analysts/report-github-actions-messages.js +2 -2
  452. package/dist/core/messages/pt/analysts/report-github-actions-messages.js.map +1 -1
  453. package/dist/core/messages/pt/analysts/scorer-messages.d.ts +45 -45
  454. package/dist/core/messages/pt/analysts/scorer-messages.js +49 -49
  455. package/dist/core/messages/pt/analysts/scorer-messages.js.map +1 -1
  456. package/dist/core/messages/pt/api/api-server-messages.d.ts +1 -0
  457. package/dist/core/messages/pt/api/api-server-messages.d.ts.map +1 -1
  458. package/dist/core/messages/pt/api/api-server-messages.js +1 -0
  459. package/dist/core/messages/pt/api/api-server-messages.js.map +1 -1
  460. package/dist/core/messages/pt/cli/cli-command-convert-messages.d.ts +1 -1
  461. package/dist/core/messages/pt/cli/cli-command-convert-messages.js +1 -1
  462. package/dist/core/messages/pt/cli/cli-command-convert-messages.js.map +1 -1
  463. package/dist/core/messages/pt/cli/cli-command-format-messages.d.ts +1 -1
  464. package/dist/core/messages/pt/cli/cli-command-format-messages.js +1 -1
  465. package/dist/core/messages/pt/cli/cli-command-format-messages.js.map +1 -1
  466. package/dist/core/messages/pt/cli/cli-command-github-actions-messages.d.ts +1 -1
  467. package/dist/core/messages/pt/cli/cli-command-github-actions-messages.js +4 -4
  468. package/dist/core/messages/pt/cli/cli-command-github-actions-messages.js.map +1 -1
  469. package/dist/core/messages/pt/cli/cli-command-server-messages.d.ts +4 -0
  470. package/dist/core/messages/pt/cli/cli-command-server-messages.d.ts.map +1 -1
  471. package/dist/core/messages/pt/cli/cli-command-server-messages.js +4 -0
  472. package/dist/core/messages/pt/cli/cli-command-server-messages.js.map +1 -1
  473. package/dist/core/messages/pt/cli/cli-command-update-messages.d.ts +2 -2
  474. package/dist/core/messages/pt/cli/cli-command-update-messages.js +2 -2
  475. package/dist/core/messages/pt/cli/cli-command-update-messages.js.map +1 -1
  476. package/dist/core/messages/pt/cli/cli-flags-validator-messages.d.ts +3 -3
  477. package/dist/core/messages/pt/cli/cli-flags-validator-messages.js +3 -3
  478. package/dist/core/messages/pt/cli/cli-flags-validator-messages.js.map +1 -1
  479. package/dist/core/messages/pt/core/correcoes-messages.js +2 -2
  480. package/dist/core/messages/pt/core/correcoes-messages.js.map +1 -1
  481. package/dist/core/messages/pt/core/excecoes-messages.d.ts +1 -0
  482. package/dist/core/messages/pt/core/excecoes-messages.d.ts.map +1 -1
  483. package/dist/core/messages/pt/core/excecoes-messages.js +1 -0
  484. package/dist/core/messages/pt/core/excecoes-messages.js.map +1 -1
  485. package/dist/core/messages/pt/core/executor-extra-messages.d.ts +3 -0
  486. package/dist/core/messages/pt/core/executor-extra-messages.d.ts.map +1 -1
  487. package/dist/core/messages/pt/core/executor-extra-messages.js +3 -0
  488. package/dist/core/messages/pt/core/executor-extra-messages.js.map +1 -1
  489. package/dist/core/messages/pt/core/inquisitor-extra-messages.d.ts +2 -2
  490. package/dist/core/messages/pt/core/inquisitor-extra-messages.js +2 -2
  491. package/dist/core/messages/pt/core/inquisitor-extra-messages.js.map +1 -1
  492. package/dist/core/messages/pt/core/parser-extra-messages.d.ts +3 -3
  493. package/dist/core/messages/pt/core/parser-extra-messages.js +3 -3
  494. package/dist/core/messages/pt/core/parser-extra-messages.js.map +1 -1
  495. package/dist/core/messages/pt/core/plugin-messages.d.ts +18 -0
  496. package/dist/core/messages/pt/core/plugin-messages.d.ts.map +1 -1
  497. package/dist/core/messages/pt/core/plugin-messages.js +20 -2
  498. package/dist/core/messages/pt/core/plugin-messages.js.map +1 -1
  499. package/dist/core/messages/pt/github/github-webhook-messages.d.ts +2 -0
  500. package/dist/core/messages/pt/github/github-webhook-messages.d.ts.map +1 -1
  501. package/dist/core/messages/pt/github/github-webhook-messages.js +2 -0
  502. package/dist/core/messages/pt/github/github-webhook-messages.js.map +1 -1
  503. package/dist/core/messages/pt/guardian/guardian-messages.d.ts +2 -2
  504. package/dist/core/messages/pt/guardian/guardian-messages.js +2 -2
  505. package/dist/core/messages/pt/guardian/guardian-messages.js.map +1 -1
  506. package/dist/core/messages/pt/guardian/watcher-hidden-messages.d.ts +2 -2
  507. package/dist/core/messages/pt/guardian/watcher-hidden-messages.js +2 -2
  508. package/dist/core/messages/pt/guardian/watcher-hidden-messages.js.map +1 -1
  509. package/dist/core/messages/pt/log/log-helper.js.map +1 -1
  510. package/dist/core/messages/pt/reports/report-async-patterns-messages.d.ts +3 -3
  511. package/dist/core/messages/pt/reports/report-async-patterns-messages.js +3 -3
  512. package/dist/core/messages/pt/reports/report-async-patterns-messages.js.map +1 -1
  513. package/dist/core/messages/pt/reports/report-messages.d.ts +13 -0
  514. package/dist/core/messages/pt/reports/report-messages.d.ts.map +1 -1
  515. package/dist/core/messages/pt/reports/report-messages.js +14 -1
  516. package/dist/core/messages/pt/reports/report-messages.js.map +1 -1
  517. package/dist/core/messages/pt/shared/plugin-core-messages.d.ts +2 -2
  518. package/dist/core/messages/pt/shared/plugin-core-messages.js +2 -2
  519. package/dist/core/messages/pt/shared/plugin-core-messages.js.map +1 -1
  520. package/dist/core/messages/pt/shared/plugin-registry-messages.d.ts +4 -4
  521. package/dist/core/messages/pt/shared/plugin-registry-messages.js +4 -4
  522. package/dist/core/messages/pt/shared/plugin-registry-messages.js.map +1 -1
  523. package/dist/core/messages/pt/shared/shared-common-messages.d.ts +2 -0
  524. package/dist/core/messages/pt/shared/shared-common-messages.d.ts.map +1 -1
  525. package/dist/core/messages/pt/shared/shared-common-messages.js +2 -0
  526. package/dist/core/messages/pt/shared/shared-common-messages.js.map +1 -1
  527. package/dist/core/messages/zh/analysts/analyst-github-actions-messages.d.ts +45 -0
  528. package/dist/core/messages/zh/analysts/analyst-github-actions-messages.d.ts.map +1 -1
  529. package/dist/core/messages/zh/analysts/analyst-github-actions-messages.js +45 -0
  530. package/dist/core/messages/zh/analysts/analyst-github-actions-messages.js.map +1 -1
  531. package/dist/core/messages/zh/analysts/analyst-gitlab-ci-messages.d.ts +12 -0
  532. package/dist/core/messages/zh/analysts/analyst-gitlab-ci-messages.d.ts.map +1 -0
  533. package/dist/core/messages/zh/analysts/analyst-gitlab-ci-messages.js +12 -0
  534. package/dist/core/messages/zh/analysts/analyst-gitlab-ci-messages.js.map +1 -0
  535. package/dist/core/messages/zh/analysts/analyst-shell-messages.d.ts +19 -0
  536. package/dist/core/messages/zh/analysts/analyst-shell-messages.d.ts.map +1 -0
  537. package/dist/core/messages/zh/analysts/analyst-shell-messages.js +19 -0
  538. package/dist/core/messages/zh/analysts/analyst-shell-messages.js.map +1 -0
  539. package/dist/core/messages/zh/analysts/analyst-todo-comments-messages.d.ts +1 -0
  540. package/dist/core/messages/zh/analysts/analyst-todo-comments-messages.d.ts.map +1 -1
  541. package/dist/core/messages/zh/analysts/analyst-todo-comments-messages.js +2 -1
  542. package/dist/core/messages/zh/analysts/analyst-todo-comments-messages.js.map +1 -1
  543. package/dist/core/messages/zh/analysts/archetypes-extra-messages.d.ts +2 -2
  544. package/dist/core/messages/zh/analysts/archetypes-extra-messages.js +2 -2
  545. package/dist/core/messages/zh/analysts/archetypes-extra-messages.js.map +1 -1
  546. package/dist/core/messages/zh/analysts/detector-clean-arch-messages.d.ts +4 -4
  547. package/dist/core/messages/zh/analysts/detector-clean-arch-messages.js +4 -4
  548. package/dist/core/messages/zh/analysts/detector-clean-arch-messages.js.map +1 -1
  549. package/dist/core/messages/zh/analysts/detector-css-messages.d.ts +13 -0
  550. package/dist/core/messages/zh/analysts/detector-css-messages.d.ts.map +1 -0
  551. package/dist/core/messages/zh/analysts/detector-css-messages.js +13 -0
  552. package/dist/core/messages/zh/analysts/detector-css-messages.js.map +1 -0
  553. package/dist/core/messages/zh/analysts/detector-js-ts-messages.d.ts +2 -2
  554. package/dist/core/messages/zh/analysts/detector-js-ts-messages.js +2 -2
  555. package/dist/core/messages/zh/analysts/detector-js-ts-messages.js.map +1 -1
  556. package/dist/core/messages/zh/analysts/index.d.ts +3 -0
  557. package/dist/core/messages/zh/analysts/index.d.ts.map +1 -1
  558. package/dist/core/messages/zh/analysts/index.js +3 -0
  559. package/dist/core/messages/zh/analysts/index.js.map +1 -1
  560. package/dist/core/messages/zh/analysts/map-reversion-extra-messages.d.ts +6 -6
  561. package/dist/core/messages/zh/analysts/map-reversion-extra-messages.js +6 -6
  562. package/dist/core/messages/zh/analysts/map-reversion-extra-messages.js.map +1 -1
  563. package/dist/core/messages/zh/analysts/report-github-actions-messages.d.ts +2 -2
  564. package/dist/core/messages/zh/analysts/report-github-actions-messages.js +2 -2
  565. package/dist/core/messages/zh/analysts/report-github-actions-messages.js.map +1 -1
  566. package/dist/core/messages/zh/analysts/scorer-messages.d.ts +45 -45
  567. package/dist/core/messages/zh/analysts/scorer-messages.js +49 -49
  568. package/dist/core/messages/zh/analysts/scorer-messages.js.map +1 -1
  569. package/dist/core/messages/zh/api/api-server-messages.d.ts +1 -0
  570. package/dist/core/messages/zh/api/api-server-messages.d.ts.map +1 -1
  571. package/dist/core/messages/zh/api/api-server-messages.js +1 -0
  572. package/dist/core/messages/zh/api/api-server-messages.js.map +1 -1
  573. package/dist/core/messages/zh/cli/cli-command-analysts-messages.d.ts +2 -2
  574. package/dist/core/messages/zh/cli/cli-command-analysts-messages.js +2 -2
  575. package/dist/core/messages/zh/cli/cli-command-analysts-messages.js.map +1 -1
  576. package/dist/core/messages/zh/cli/cli-command-convert-messages.d.ts +1 -1
  577. package/dist/core/messages/zh/cli/cli-command-convert-messages.js +1 -1
  578. package/dist/core/messages/zh/cli/cli-command-convert-messages.js.map +1 -1
  579. package/dist/core/messages/zh/cli/cli-command-format-messages.d.ts +1 -1
  580. package/dist/core/messages/zh/cli/cli-command-format-messages.js +1 -1
  581. package/dist/core/messages/zh/cli/cli-command-format-messages.js.map +1 -1
  582. package/dist/core/messages/zh/cli/cli-command-github-actions-messages.d.ts +1 -1
  583. package/dist/core/messages/zh/cli/cli-command-github-actions-messages.js +4 -4
  584. package/dist/core/messages/zh/cli/cli-command-github-actions-messages.js.map +1 -1
  585. package/dist/core/messages/zh/cli/cli-command-server-messages.d.ts +4 -0
  586. package/dist/core/messages/zh/cli/cli-command-server-messages.d.ts.map +1 -1
  587. package/dist/core/messages/zh/cli/cli-command-server-messages.js +4 -0
  588. package/dist/core/messages/zh/cli/cli-command-server-messages.js.map +1 -1
  589. package/dist/core/messages/zh/cli/cli-command-update-messages.d.ts +2 -2
  590. package/dist/core/messages/zh/cli/cli-command-update-messages.js +2 -2
  591. package/dist/core/messages/zh/cli/cli-command-update-messages.js.map +1 -1
  592. package/dist/core/messages/zh/cli/cli-flags-validator-messages.d.ts +3 -3
  593. package/dist/core/messages/zh/cli/cli-flags-validator-messages.js +3 -3
  594. package/dist/core/messages/zh/cli/cli-flags-validator-messages.js.map +1 -1
  595. package/dist/core/messages/zh/core/correcoes-messages.js +2 -2
  596. package/dist/core/messages/zh/core/correcoes-messages.js.map +1 -1
  597. package/dist/core/messages/zh/core/excecoes-messages.d.ts +1 -0
  598. package/dist/core/messages/zh/core/excecoes-messages.d.ts.map +1 -1
  599. package/dist/core/messages/zh/core/excecoes-messages.js +1 -0
  600. package/dist/core/messages/zh/core/excecoes-messages.js.map +1 -1
  601. package/dist/core/messages/zh/core/executor-extra-messages.d.ts +3 -0
  602. package/dist/core/messages/zh/core/executor-extra-messages.d.ts.map +1 -1
  603. package/dist/core/messages/zh/core/executor-extra-messages.js +3 -0
  604. package/dist/core/messages/zh/core/executor-extra-messages.js.map +1 -1
  605. package/dist/core/messages/zh/core/inquisitor-extra-messages.d.ts +2 -2
  606. package/dist/core/messages/zh/core/inquisitor-extra-messages.js +2 -2
  607. package/dist/core/messages/zh/core/inquisitor-extra-messages.js.map +1 -1
  608. package/dist/core/messages/zh/core/parser-extra-messages.d.ts +3 -3
  609. package/dist/core/messages/zh/core/parser-extra-messages.js +3 -3
  610. package/dist/core/messages/zh/core/parser-extra-messages.js.map +1 -1
  611. package/dist/core/messages/zh/core/plugin-messages.d.ts +18 -0
  612. package/dist/core/messages/zh/core/plugin-messages.d.ts.map +1 -1
  613. package/dist/core/messages/zh/core/plugin-messages.js +20 -2
  614. package/dist/core/messages/zh/core/plugin-messages.js.map +1 -1
  615. package/dist/core/messages/zh/github/github-webhook-messages.d.ts +2 -0
  616. package/dist/core/messages/zh/github/github-webhook-messages.d.ts.map +1 -1
  617. package/dist/core/messages/zh/github/github-webhook-messages.js +2 -0
  618. package/dist/core/messages/zh/github/github-webhook-messages.js.map +1 -1
  619. package/dist/core/messages/zh/guardian/guardian-messages.d.ts +4 -2
  620. package/dist/core/messages/zh/guardian/guardian-messages.d.ts.map +1 -1
  621. package/dist/core/messages/zh/guardian/guardian-messages.js +4 -2
  622. package/dist/core/messages/zh/guardian/guardian-messages.js.map +1 -1
  623. package/dist/core/messages/zh/guardian/watcher-hidden-messages.d.ts +2 -2
  624. package/dist/core/messages/zh/guardian/watcher-hidden-messages.js +2 -2
  625. package/dist/core/messages/zh/guardian/watcher-hidden-messages.js.map +1 -1
  626. package/dist/core/messages/zh/log/log-helper.js.map +1 -1
  627. package/dist/core/messages/zh/reports/report-async-patterns-messages.d.ts +3 -3
  628. package/dist/core/messages/zh/reports/report-async-patterns-messages.js +3 -3
  629. package/dist/core/messages/zh/reports/report-async-patterns-messages.js.map +1 -1
  630. package/dist/core/messages/zh/reports/report-messages.d.ts +13 -0
  631. package/dist/core/messages/zh/reports/report-messages.d.ts.map +1 -1
  632. package/dist/core/messages/zh/reports/report-messages.js +14 -1
  633. package/dist/core/messages/zh/reports/report-messages.js.map +1 -1
  634. package/dist/core/messages/zh/shared/plugin-core-messages.d.ts +2 -2
  635. package/dist/core/messages/zh/shared/plugin-core-messages.js +2 -2
  636. package/dist/core/messages/zh/shared/plugin-core-messages.js.map +1 -1
  637. package/dist/core/messages/zh/shared/plugin-registry-messages.d.ts +4 -4
  638. package/dist/core/messages/zh/shared/plugin-registry-messages.js +4 -4
  639. package/dist/core/messages/zh/shared/plugin-registry-messages.js.map +1 -1
  640. package/dist/core/messages/zh/shared/shared-common-messages.d.ts +2 -0
  641. package/dist/core/messages/zh/shared/shared-common-messages.d.ts.map +1 -1
  642. package/dist/core/messages/zh/shared/shared-common-messages.js +2 -0
  643. package/dist/core/messages/zh/shared/shared-common-messages.js.map +1 -1
  644. package/dist/core/parsing/parser.d.ts.map +1 -1
  645. package/dist/core/parsing/parser.js +6 -7
  646. package/dist/core/parsing/parser.js.map +1 -1
  647. package/dist/core/parsing/utils.d.ts +3 -3
  648. package/dist/core/registry/file-registry.d.ts.map +1 -1
  649. package/dist/core/registry/file-registry.js +3 -4
  650. package/dist/core/registry/file-registry.js.map +1 -1
  651. package/dist/core/workers/worker-executor.js +5 -3
  652. package/dist/core/workers/worker-executor.js.map +1 -1
  653. package/dist/core/workers/worker-pool.js +1 -1
  654. package/dist/core/workers/worker-pool.js.map +1 -1
  655. package/dist/guardian/baseline.js.map +1 -1
  656. package/dist/guardian/constants.js.map +1 -1
  657. package/dist/guardian/diff.js.map +1 -1
  658. package/dist/reports/analise-async-patterns.js +1 -1
  659. package/dist/reports/analise-async-patterns.js.map +1 -1
  660. package/dist/reports/filter-smart.js +4 -4
  661. package/dist/reports/filter-smart.js.map +1 -1
  662. package/dist/reports/generator-report.js +1 -1
  663. package/dist/reports/generator-report.js.map +1 -1
  664. package/dist/reports/report-caretaker-health.js +1 -1
  665. package/dist/reports/report-caretaker-health.js.map +1 -1
  666. package/dist/reports/report-structure.d.ts.map +1 -1
  667. package/dist/reports/report-structure.js +10 -2
  668. package/dist/reports/report-structure.js.map +1 -1
  669. package/dist/shared/plugins/init.js.map +1 -1
  670. package/dist/shared/validation/validation.js +1 -1
  671. package/dist/shared/validation/validation.js.map +1 -1
  672. package/out/404/index.html +1 -1
  673. package/out/404.html +1 -1
  674. package/out/__next.__PAGE__.txt +2 -2
  675. package/out/__next._full.txt +2 -2
  676. package/out/__next._head.txt +1 -1
  677. package/out/__next._index.txt +1 -1
  678. package/out/__next._tree.txt +1 -1
  679. package/out/_next/static/chunks/{1l-dhswmn6dl_.js → 1xfmvf0ifjmmy.js} +1 -1
  680. package/out/_not-found/__next._full.txt +1 -1
  681. package/out/_not-found/__next._head.txt +1 -1
  682. package/out/_not-found/__next._index.txt +1 -1
  683. package/out/_not-found/__next._not-found.__PAGE__.txt +1 -1
  684. package/out/_not-found/__next._not-found.txt +1 -1
  685. package/out/_not-found/__next._tree.txt +1 -1
  686. package/out/_not-found/index.html +1 -1
  687. package/out/_not-found/index.txt +1 -1
  688. package/out/changelog/__next._full.txt +1 -1
  689. package/out/changelog/__next._head.txt +1 -1
  690. package/out/changelog/__next._index.txt +1 -1
  691. package/out/changelog/__next._tree.txt +1 -1
  692. package/out/changelog/__next.changelog.__PAGE__.txt +1 -1
  693. package/out/changelog/__next.changelog.txt +1 -1
  694. package/out/changelog/index.html +1 -1
  695. package/out/changelog/index.txt +1 -1
  696. package/out/github/dashboard/__next._full.txt +1 -1
  697. package/out/github/dashboard/__next._head.txt +1 -1
  698. package/out/github/dashboard/__next._index.txt +1 -1
  699. package/out/github/dashboard/__next._tree.txt +1 -1
  700. package/out/github/dashboard/__next.github.dashboard.__PAGE__.txt +1 -1
  701. package/out/github/dashboard/__next.github.dashboard.txt +1 -1
  702. package/out/github/dashboard/__next.github.txt +1 -1
  703. package/out/github/dashboard/index.html +1 -1
  704. package/out/github/dashboard/index.txt +1 -1
  705. package/out/index.html +1 -1
  706. package/out/index.txt +2 -2
  707. package/out/privacy-policy/__next._full.txt +1 -1
  708. package/out/privacy-policy/__next._head.txt +1 -1
  709. package/out/privacy-policy/__next._index.txt +1 -1
  710. package/out/privacy-policy/__next._tree.txt +1 -1
  711. package/out/privacy-policy/__next.privacy-policy.__PAGE__.txt +1 -1
  712. package/out/privacy-policy/__next.privacy-policy.txt +1 -1
  713. package/out/privacy-policy/index.html +1 -1
  714. package/out/privacy-policy/index.txt +1 -1
  715. package/out/terms-of-use/__next._full.txt +1 -1
  716. package/out/terms-of-use/__next._head.txt +1 -1
  717. package/out/terms-of-use/__next._index.txt +1 -1
  718. package/out/terms-of-use/__next._tree.txt +1 -1
  719. package/out/terms-of-use/__next.terms-of-use.__PAGE__.txt +1 -1
  720. package/out/terms-of-use/__next.terms-of-use.txt +1 -1
  721. package/out/terms-of-use/index.html +1 -1
  722. package/out/terms-of-use/index.txt +1 -1
  723. package/package.json +11 -12
  724. /package/out/_next/static/{sHP-sIMshwWXMCtdszRWm → WkbNrhSUmQHl6FUQrrd3Q}/_buildManifest.js +0 -0
  725. /package/out/_next/static/{sHP-sIMshwWXMCtdszRWm → WkbNrhSUmQHl6FUQrrd3Q}/_clientMiddlewareManifest.js +0 -0
  726. /package/out/_next/static/{sHP-sIMshwWXMCtdszRWm → WkbNrhSUmQHl6FUQrrd3Q}/_ssgManifest.js +0 -0
@@ -1,3 +1,4 @@
1
+ import { messages } from '../../../core/messages/index.js';
1
2
  import { splitLines } from '../../../shared/helpers/index.js';
2
3
  import { criarOcorrencia } from '../../../types/index.js';
3
4
  export const detectorCssBestPractices = {
@@ -22,10 +23,10 @@ export const detectorCssBestPractices = {
22
23
  ocorrencias.push(criarOcorrencia({
23
24
  tipo: 'css-empty-rule',
24
25
  nivel: 'info',
25
- mensagem: 'Regra CSS vazia detectada',
26
+ mensagem: messages.DetectorCssMensagens.emptyRule,
26
27
  relPath,
27
28
  linha: numeroLinha,
28
- sugestao: 'Remova a regra vazia ou adicione propriedades'
29
+ sugestao: messages.DetectorCssMensagens.emptyRuleSugestao
29
30
  }));
30
31
  }
31
32
  propsInBlock.clear();
@@ -35,10 +36,10 @@ export const detectorCssBestPractices = {
35
36
  ocorrencias.push(criarOcorrencia({
36
37
  tipo: 'css-important-usage',
37
38
  nivel: 'aviso',
38
- mensagem: '!important detectado - aumenta especificidade desnecessariamente',
39
+ mensagem: messages.DetectorCssMensagens.important,
39
40
  relPath,
40
41
  linha: numeroLinha,
41
- sugestao: 'Refatore o seletor ao invés de usar !important'
42
+ sugestao: messages.DetectorCssMensagens.importantSugestao
42
43
  }));
43
44
  }
44
45
  const propMatch = /^([a-zA-Z-]+)\s*:\s*([^;]+)?/.exec(trimmed);
@@ -49,10 +50,10 @@ export const detectorCssBestPractices = {
49
50
  ocorrencias.push(criarOcorrencia({
50
51
  tipo: 'css-duplicate-property',
51
52
  nivel: 'aviso',
52
- mensagem: `Propriedade duplicada: ${prop}`,
53
+ mensagem: messages.DetectorCssMensagens.duplicateProperty(prop),
53
54
  relPath,
54
55
  linha: numeroLinha,
55
- sugestao: 'Remova a propriedade duplicada'
56
+ sugestao: messages.DetectorCssMensagens.duplicatePropertySugestao
56
57
  }));
57
58
  }
58
59
  propsInBlock.set(prop, { line: numeroLinha, value });
@@ -61,20 +62,20 @@ export const detectorCssBestPractices = {
61
62
  ocorrencias.push(criarOcorrencia({
62
63
  tipo: 'css-id-selector',
63
64
  nivel: 'info',
64
- mensagem: 'Seletor ID detectado - alta especificidade',
65
+ mensagem: messages.DetectorCssMensagens.idSelector,
65
66
  relPath,
66
67
  linha: numeroLinha,
67
- sugestao: 'Prefira classes ao invés de IDs para estilização'
68
+ sugestao: messages.DetectorCssMensagens.idSelectorSugestao
68
69
  }));
69
70
  }
70
71
  if (/\\9|\*property|_property|expression\s*\(/.test(trimmed)) {
71
72
  ocorrencias.push(criarOcorrencia({
72
73
  tipo: 'css-hack',
73
74
  nivel: 'aviso',
74
- mensagem: 'CSS hack detectado',
75
+ mensagem: messages.DetectorCssMensagens.cssHack,
75
76
  relPath,
76
77
  linha: numeroLinha,
77
- sugestao: 'Remova hacks de browser - use feature detection'
78
+ sugestao: messages.DetectorCssMensagens.cssHackSugestao
78
79
  }));
79
80
  }
80
81
  });
@@ -1 +1 @@
1
- {"version":3,"file":"detector-css-best-practices.js","sourceRoot":"","sources":["../../../../src/analysts/css/detectors/detector-css-best-practices.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * [BUSCA] Detector de boas práticas CSS\n *\n * Detecta padrões problemáticos em CSS/SCSS/SASS:\n * - !important usage\n * - Duplicate properties\n * - Invalid properties\n * - CSS hacks\n * - Empty rules\n * - ID selectors\n */\n\nimport { splitLines } from '@shared/helpers';\n\nimport type { Analista, Ocorrencia } from '@';\nimport { criarOcorrencia } from '@';\n\nexport const detectorCssBestPractices: Analista = {\n nome: 'detector-css-best-practices',\n categoria: 'estilo',\n descricao: 'Detecta más práticas em CSS/SCSS/SASS',\n test: (relPath: string): boolean => /\\.(css|scss|sass)$/i.test(relPath),\n aplicar: (src: string, relPath: string): Ocorrencia[] => {\n if (!src) return [];\n const ocorrencias: Ocorrencia[] = [];\n const linhas = splitLines(src);\n\n let depth = 0;\n const propsInBlock = new Map<string, { line: number; value: string }>();\n\n linhas.forEach((linha, index) => {\n const numeroLinha = index + 1;\n const trimmed = linha.trim();\n\n if (trimmed.includes('{')) depth++;\n if (trimmed.includes('}')) {\n if (propsInBlock.size === 0 && depth > 0) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'css-empty-rule',\n nivel: 'info',\n mensagem: 'Regra CSS vazia detectada',\n relPath,\n linha: numeroLinha,\n sugestao: 'Remova a regra vazia ou adicione propriedades'\n }));\n }\n propsInBlock.clear();\n depth--;\n }\n\n if (/!important/.test(trimmed)) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'css-important-usage',\n nivel: 'aviso',\n mensagem: '!important detectado - aumenta especificidade desnecessariamente',\n relPath,\n linha: numeroLinha,\n sugestao: 'Refatore o seletor ao invés de usar !important'\n }));\n }\n\n const propMatch = /^([a-zA-Z-]+)\\s*:\\s*([^;]+)?/.exec(trimmed);\n if (propMatch && depth > 0) {\n const prop = propMatch[1].toLowerCase();\n const value = (propMatch[2] || '').trim();\n\n if (propsInBlock.has(prop)) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'css-duplicate-property',\n nivel: 'aviso',\n mensagem: `Propriedade duplicada: ${prop}`,\n relPath,\n linha: numeroLinha,\n sugestao: 'Remova a propriedade duplicada'\n }));\n }\n propsInBlock.set(prop, { line: numeroLinha, value });\n }\n\n if (/#[a-zA-Z0-9_-]+\\s*\\{/.test(trimmed)) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'css-id-selector',\n nivel: 'info',\n mensagem: 'Seletor ID detectado - alta especificidade',\n relPath,\n linha: numeroLinha,\n sugestao: 'Prefira classes ao invés de IDs para estilização'\n }));\n }\n\n if (/\\\\9|\\*property|_property|expression\\s*\\(/.test(trimmed)) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'css-hack',\n nivel: 'aviso',\n mensagem: 'CSS hack detectado',\n relPath,\n linha: numeroLinha,\n sugestao: 'Remova hacks de browser - use feature detection'\n }));\n }\n });\n\n return ocorrencias;\n }\n};\n"]}
1
+ {"version":3,"file":"detector-css-best-practices.js","sourceRoot":"","sources":["../../../../src/analysts/css/detectors/detector-css-best-practices.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * [BUSCA] Detector de boas práticas CSS\n *\n * Detecta padrões problemáticos em CSS/SCSS/SASS:\n * - !important usage\n * - Duplicate properties\n * - Invalid properties\n * - CSS hacks\n * - Empty rules\n * - ID selectors\n */\n\nimport { messages } from '@core/messages';\nimport { splitLines } from '@shared/helpers';\n\nimport type { Analista, Ocorrencia } from '@';\nimport { criarOcorrencia } from '@';\n\nexport const detectorCssBestPractices: Analista = {\n nome: 'detector-css-best-practices',\n categoria: 'estilo',\n descricao: 'Detecta más práticas em CSS/SCSS/SASS',\n test: (relPath: string): boolean => /\\.(css|scss|sass)$/i.test(relPath),\n aplicar: (src: string, relPath: string): Ocorrencia[] => {\n if (!src) return [];\n const ocorrencias: Ocorrencia[] = [];\n const linhas = splitLines(src);\n\n let depth = 0;\n const propsInBlock = new Map<string, { line: number; value: string }>();\n\n linhas.forEach((linha, index) => {\n const numeroLinha = index + 1;\n const trimmed = linha.trim();\n\n if (trimmed.includes('{')) depth++;\n if (trimmed.includes('}')) {\n if (propsInBlock.size === 0 && depth > 0) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'css-empty-rule',\n nivel: 'info',\n mensagem: messages.DetectorCssMensagens.emptyRule,\n relPath,\n linha: numeroLinha,\n sugestao: messages.DetectorCssMensagens.emptyRuleSugestao\n }));\n }\n propsInBlock.clear();\n depth--;\n }\n\n if (/!important/.test(trimmed)) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'css-important-usage',\n nivel: 'aviso',\n mensagem: messages.DetectorCssMensagens.important,\n relPath,\n linha: numeroLinha,\n sugestao: messages.DetectorCssMensagens.importantSugestao\n }));\n }\n\n const propMatch = /^([a-zA-Z-]+)\\s*:\\s*([^;]+)?/.exec(trimmed);\n if (propMatch && depth > 0) {\n const prop = propMatch[1].toLowerCase();\n const value = (propMatch[2] || '').trim();\n\n if (propsInBlock.has(prop)) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'css-duplicate-property',\n nivel: 'aviso',\n mensagem: messages.DetectorCssMensagens.duplicateProperty(prop),\n relPath,\n linha: numeroLinha,\n sugestao: messages.DetectorCssMensagens.duplicatePropertySugestao\n }));\n }\n propsInBlock.set(prop, { line: numeroLinha, value });\n }\n\n if (/#[a-zA-Z0-9_-]+\\s*\\{/.test(trimmed)) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'css-id-selector',\n nivel: 'info',\n mensagem: messages.DetectorCssMensagens.idSelector,\n relPath,\n linha: numeroLinha,\n sugestao: messages.DetectorCssMensagens.idSelectorSugestao\n }));\n }\n\n if (/\\\\9|\\*property|_property|expression\\s*\\(/.test(trimmed)) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'css-hack',\n nivel: 'aviso',\n mensagem: messages.DetectorCssMensagens.cssHack,\n relPath,\n linha: numeroLinha,\n sugestao: messages.DetectorCssMensagens.cssHackSugestao\n }));\n }\n });\n\n return ocorrencias;\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":"analyst-github-actions.d.ts","sourceRoot":"","sources":["../../../../src/analysts/github-actions/analysts/analyst-github-actions.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAoB,cAAc,EAAgC,MAAM,GAAG,CAAC;AAkDlG,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAE7E;AACD,wBAAgB,4BAA4B,IAAI,cAAc,EAAE,CAE/D;AACD,eAAO,MAAM,qBAAqB,EAAE,QAuCnC,CAAC;AACF,eAAO,MAAM,2BAA2B,EAAE,QA2HzC,CAAC"}
1
+ {"version":3,"file":"analyst-github-actions.d.ts","sourceRoot":"","sources":["../../../../src/analysts/github-actions/analysts/analyst-github-actions.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAoB,cAAc,EAAgC,MAAM,GAAG,CAAC;AAmDlG,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAE7E;AACD,wBAAgB,4BAA4B,IAAI,cAAc,EAAE,CAE/D;AACD,eAAO,MAAM,qBAAqB,EAAE,QAuCnC,CAAC;AACF,eAAO,MAAM,2BAA2B,EAAE,QA2HzC,CAAC"}
@@ -7,6 +7,7 @@ import { detectorWorkflowSecurity } from '../detectors/detector-workflow-securit
7
7
  import { detectarJobsPassivos, detectorWorkflowEstrutura } from '../detectors/detector-workflow-structure.js';
8
8
  import { detectorWorkflowTriggerInseguro } from '../detectors/detector-workflow-trigger-unsafe.js';
9
9
  import { isOrgVerificada } from '../detectors/org-verified.js';
10
+ import { messages } from '../../../core/messages/index.js';
10
11
  let _workflowNeedsFullHistory = false;
11
12
  const detectoresRegistrados = [];
12
13
  export function registrarDetectorGithubActions(detector) {
@@ -68,7 +69,7 @@ export const analistaGithubActionsGlobal = {
68
69
  if (!paths.some(caminho => /CODEOWNERS/i.test(caminho))) {
69
70
  ores.push({
70
71
  tipo: 'GITHUB_ACTIONS_CODEOWNERS_MISSING',
71
- mensagem: 'CODEOWNERS faltando',
72
+ mensagem: messages.AnalistaGithubActionsMensagens.missingCodeowners,
72
73
  relPath: '.github/',
73
74
  linha: 0,
74
75
  coluna: 0,
@@ -80,7 +81,7 @@ export const analistaGithubActionsGlobal = {
80
81
  if (readme && !/Code of Conduct|Código de Conduta/i.test(content)) {
81
82
  ores.push({
82
83
  tipo: 'GITHUB_ACTIONS_DOC_GOVERNANCE_MISSING',
83
- mensagem: 'README sem Código de Conduta',
84
+ mensagem: messages.AnalistaGithubActionsMensagens.missingCodeOfConduct,
84
85
  relPath: readme.relPath,
85
86
  linha: 1,
86
87
  coluna: 0,
@@ -90,7 +91,7 @@ export const analistaGithubActionsGlobal = {
90
91
  if (!paths.some(caminho => /stale/i.test(caminho))) {
91
92
  ores.push({
92
93
  tipo: 'GITHUB_ACTIONS_STALE_BOT_MISSING',
93
- mensagem: 'Stale bot faltando',
94
+ mensagem: messages.AnalistaGithubActionsMensagens.missingStaleBot,
94
95
  relPath: '.github/workflows/',
95
96
  linha: 0,
96
97
  coluna: 0,
@@ -100,7 +101,7 @@ export const analistaGithubActionsGlobal = {
100
101
  if (!paths.some(caminho => /release|deploy/i.test(caminho))) {
101
102
  ores.push({
102
103
  tipo: 'GITHUB_ACTIONS_RELEASE_AUTOMATION_MISSING',
103
- mensagem: 'Release automation faltando',
104
+ mensagem: messages.AnalistaGithubActionsMensagens.missingReleaseAutomation,
104
105
  relPath: '.github/workflows/',
105
106
  linha: 0,
106
107
  coluna: 0,
@@ -110,7 +111,7 @@ export const analistaGithubActionsGlobal = {
110
111
  if (!paths.some(caminho => /\.github\/ISSUE_TEMPLATE/i.test(caminho))) {
111
112
  ores.push({
112
113
  tipo: 'GITHUB_ACTIONS_ISSUE_TEMPLATES_MISSING',
113
- mensagem: 'Issue templates faltando',
114
+ mensagem: messages.AnalistaGithubActionsMensagens.missingIssueTemplates,
114
115
  relPath: '.github/ISSUE_TEMPLATE/',
115
116
  linha: 0,
116
117
  coluna: 0,
@@ -120,7 +121,7 @@ export const analistaGithubActionsGlobal = {
120
121
  if (!paths.some(caminho => /pull_request_template/i.test(caminho))) {
121
122
  ores.push({
122
123
  tipo: 'GITHUB_ACTIONS_PR_TEMPLATE_MISSING',
123
- mensagem: 'PR template faltando',
124
+ mensagem: messages.AnalistaGithubActionsMensagens.missingPrTemplate,
124
125
  relPath: '.github/',
125
126
  linha: 0,
126
127
  coluna: 0,
@@ -132,7 +133,7 @@ export const analistaGithubActionsGlobal = {
132
133
  if (!hasSemanticRelease) {
133
134
  ores.push({
134
135
  tipo: 'GITHUB_ACTIONS_SEMANTIC_VERSIONING_MISSING',
135
- mensagem: 'Automação de versionamento semântico não detectada',
136
+ mensagem: messages.AnalistaGithubActionsMensagens.missingSemanticVersioning,
136
137
  relPath: '.github/workflows/',
137
138
  linha: 0,
138
139
  coluna: 0,
@@ -142,7 +143,7 @@ export const analistaGithubActionsGlobal = {
142
143
  if (!hasChangelog) {
143
144
  ores.push({
144
145
  tipo: 'GITHUB_ACTIONS_CHANGELOG_AUTOMATION_MISSING',
145
- mensagem: 'Automação de changelog faltando',
146
+ mensagem: messages.AnalistaGithubActionsMensagens.missingChangelogAutomation,
146
147
  relPath: '.github/workflows/',
147
148
  linha: 0,
148
149
  coluna: 0,
@@ -154,7 +155,7 @@ export const analistaGithubActionsGlobal = {
154
155
  if (missingLicense.length > sourceFiles.length / 2) {
155
156
  ores.push({
156
157
  tipo: 'GITHUB_ACTIONS_LICENSE_HEADERS_MISSING',
157
- mensagem: 'Muitos arquivos sem cabeçalho de licença (SPDX)',
158
+ mensagem: messages.AnalistaGithubActionsMensagens.missingLicenseHeaders,
158
159
  relPath: './',
159
160
  linha: 0,
160
161
  coluna: 0,
@@ -1 +1 @@
1
- {"version":3,"file":"analyst-github-actions.js","sourceRoot":"","sources":["../../../../src/analysts/github-actions/analysts/analyst-github-actions.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAIrC,OAAO,EAAE,+BAA+B,EAAE,MAAM,kDAAkD,CAAC;AACnG,OAAO,EAAE,+BAA+B,EAAE,MAAM,iDAAiD,CAAC;AAClG,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAC9G,OAAO,EAAE,+BAA+B,EAAE,MAAM,kDAAkD,CAAC;AACnG,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAsC/D,IAAI,yBAAyB,GAAG,KAAK,CAAC;AAEtC,MAAM,qBAAqB,GAAqB,EAAE,CAAC;AACnD,MAAM,UAAU,8BAA8B,CAAC,QAAwB;IACrE,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACvC,CAAC;AACD,MAAM,UAAU,4BAA4B;IAC1C,OAAO,CAAC,GAAG,qBAAqB,CAAC,CAAC;AACpC,CAAC;AACD,MAAM,CAAC,MAAM,qBAAqB,GAAa;IAC7C,IAAI,EAAE,gBAAgB;IACtB,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,wEAAwE;IACnF,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC;IACnE,KAAK,CAAC,OAAO,CAAC,QAAgB,EAAE,OAAe,EAAE,OAAgB,IAAI,EAAE,GAAY,EAAE,QAA2B;QAC9G,MAAM,WAAW,GAAiB,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,MAAM,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACtE,MAAM,QAAQ,GAAG,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC1E,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE;gBACtH,QAAQ;gBACR,QAAQ;aACT,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAuB,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC3I,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAuB,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;YACjJ,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAuB,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC7I,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,+BAA+B,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAuB,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC9I,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,+BAA+B,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAuB,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;YACjJ,MAAM,KAAK,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;YACpD,WAAW,CAAC,IAAI,CAAC,GAAI,eAAgC,EAAE,GAAI,kBAAmC,EAAE,GAAI,gBAAiC,EAAE,GAAI,WAA4B,EAAE,GAAI,cAA+B,CAAC,CAAC;YAC9M,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;gBAC5B,WAAW,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,kBAAkB,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;oBACvE,QAAQ,EAAE,OAAO,CAAC,SAAS;oBAC3B,OAAO;oBACP,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;oBACzB,MAAM,EAAE,CAAC;oBACT,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;oBAChC,KAAK,EAAE,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;iBACtI,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;CACF,CAAC;AACF,MAAM,CAAC,MAAM,2BAA2B,GAAa;IACnD,IAAI,EAAE,uBAAuB;IAC7B,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,6BAA6B;IACxC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK;IACjB,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAsB;QAClD,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,GAAiB,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAG3D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,mCAAmC;gBACzC,QAAQ,EAAE,qBAAqB;gBAC/B,OAAO,EAAE,UAAU;gBACnB,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;QAGD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QACxF,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAwB,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,IAAI,MAAM,IAAI,CAAC,oCAAoC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,uCAAuC;gBAC7C,QAAQ,EAAE,8BAA8B;gBACxC,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;QAGD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,kCAAkC;gBACxC,QAAQ,EAAE,oBAAoB;gBAC9B,OAAO,EAAE,oBAAoB;gBAC7B,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;QAGD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,2CAA2C;gBACjD,QAAQ,EAAE,6BAA6B;gBACvC,OAAO,EAAE,oBAAoB;gBAC7B,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;QAGD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACtE,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,wCAAwC;gBAC9C,QAAQ,EAAE,0BAA0B;gBACpC,OAAO,EAAE,yBAAyB;gBAClC,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;QAGD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,oCAAoC;gBAC1C,QAAQ,EAAE,sBAAsB;gBAChC,OAAO,EAAE,UAAU;gBACnB,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;QAGD,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3F,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,4CAA4C;gBAClD,QAAQ,EAAE,oDAAoD;gBAC9D,OAAO,EAAE,oBAAoB;gBAC7B,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,6CAA6C;gBACnD,QAAQ,EAAE,iCAAiC;gBAC3C,OAAO,EAAE,oBAAoB;gBAC7B,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;QAGD,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACvF,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,OAAiB,IAAI,EAAE,CAAC,CAAC,CAAC;QACxH,IAAI,cAAc,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,wCAAwC;gBAC9C,QAAQ,EAAE,iDAAiD;gBAC3D,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC;AAIF,SAAS,+BAA+B,CAAC,EAAgB,EAAE,GAAW;IAEpE,MAAM,iCAAiC,GAAG,yIAAyI,CAAC;IACpL,IAAI,iCAAiC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,MAAM,IAAI,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IACvD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,IAAI,EAAE,GAAG,IAAI,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAClE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,EAAW,EAAE,GAAW;IAC/D,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,IAAI,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IAEtB,yBAAyB,GAAG,+BAA+B,CAAC,EAAkB,EAAE,GAAG,CAAC,CAAC;IAGrF,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,iBAAiB,CAAC,IAAoB,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAGD,KAAK,CAAC,IAAI,CAAC,GAAG,2BAA2B,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAGpD,KAAK,CAAC,IAAI,CAAC,GAAG,+BAA+B,CAAC,EAAE,CAAC,CAAC,CAAC;IAGnD,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAI,EAOd,CAAC,IAAI,CAAC;QACR,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7C,IAAI,oBAAoB,CAAC,GAKxB,CAAC,EAAE,CAAC;oBACH,KAAK,CAAC,IAAI,CAAC;wBACT,IAAI,EAAE,sBAAsB;wBAC5B,SAAS,EAAE,uBAAuB;wBAClC,UAAU,EAAE,OAAO;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAGD,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,uBAAuB;YAClC,UAAU,EAAE,MAAM;SACnB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,oBAAoB;YAC1B,SAAS,EAAE,4BAA4B;YACvC,UAAU,EAAE,MAAM;SACnB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,iBAAiB,CAAC,EAAgB,EAAE,KAAyB;IAEpE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACb,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,4BAA4B;YACvC,UAAU,EAAE,OAAO;SACpB,CAAC,CAAC;IACL,CAAC;IAGD,IAAI,EAAE,CAAC,SAAS,IAAI,OAAO,EAAE,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,oBAAoB;YAC1B,SAAS,EAAE,oBAAoB;YAC/B,UAAU,EAAE,OAAO;SACpB,CAAC,CAAC;IACL,CAAC;IAGD,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,SAAS,EAAE,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,sBAAsB;YAC5B,SAAS,EAAE,sBAAsB;YACjC,UAAU,EAAE,OAAO;SACpB,CAAC,CAAC;IACL,CAAC;IAGD,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QAChD,IAAI,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACvH,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,cAAc;gBACpB,SAAS,EAAE,uBAAuB,KAAK,EAAE;gBACzC,UAAU,EAAE,SAAS;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAGD,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QACZ,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3C,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,GAAG,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,SAAS,EAAE,CAAC;gBACrE,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,sBAAsB;oBAC5B,SAAS,EAAE,OAAO,EAAE,gBAAgB;oBACpC,UAAU,EAAE,OAAO;iBACpB,CAAC,CAAC;YACL,CAAC;YACD,IAAI,GAAG,EAAE,SAAS,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACxD,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,oBAAoB;oBAC1B,SAAS,EAAE,6BAA6B;oBACxC,UAAU,EAAE,OAAO;iBACpB,CAAC,CAAC;YACL,CAAC;YAGD,IAAI,2CAA2C,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBACvE,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,cAAc;oBACpB,SAAS,EAAE,QAAQ,EAAE,oCAAoC;oBACzD,UAAU,EAAE,OAAO;oBACnB,QAAQ,EAAE,4DAA4D;iBACvE,CAAC,CAAC;YACL,CAAC;YACD,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC;gBACf,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,KAAK;oBAAE,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAG5D,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAGvC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;oBAC1B,KAAK,CAAC,IAAI,CAAC;wBACT,IAAI,EAAE,WAAW;wBACjB,SAAS,EAAE,QAAQ,EAAE,YAAY,GAAG,CAAC,KAAK,CAAC,MAAM,sCAAsC;wBACvF,UAAU,EAAE,OAAO;wBACnB,QAAQ,EAAE,6DAA6D;qBACxE,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAGD,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAGvC,yBAAyB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAG7C,gCAAgC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;IAGD,IAAI,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,KAAK,MAAM,MAAM,IAAI,EAAE,CAAC,KAAK;YAAE,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC3D,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAGD,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG;QAAE,YAAY,CAAC,EAAkB,EAAE,KAAK,CAAC,CAAC;AACjE,CAAC;AACD,SAAS,YAAY,CAAC,MAAoB,EAAE,KAAyB;IACnE,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,mBAAmB;gBACzB,SAAS,EAAE,0BAA0B;gBACrC,UAAU,EAAE,OAAO;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACpF,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,iBAAiB;YACvB,SAAS,EAAE,gBAAgB;YAC3B,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACxD,IAAI,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvH,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,cAAc;oBACpB,SAAS,EAAE,OAAO,KAAK,YAAY;oBACnC,UAAU,EAAE,SAAS;iBACtB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,IAAI,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,kBAAkB;YACxB,SAAS,EAAE,kBAAkB;YAC7B,UAAU,EAAE,MAAM;SACnB,CAAC,CAAC;IACL,CAAC;IAGD,IAAI,MAAM,CAAC,IAAI,IAAI,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACjE,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,KAAK,SAAS,CAAC;QAC/D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC;QAC3D,IAAI,CAAC,YAAY,IAAI,CAAC,UAAU,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,wBAAwB;gBAC9B,SAAS,EAAE,8CAA8C;gBACzD,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,6DAA6D;aACxE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAGD,IAAI,MAAM,CAAC,IAAI,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACxE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACtC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAE3B,IAAI,CAAC,yBAAyB,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,2BAA2B;oBACjC,SAAS,EAAE,mEAAmE;oBAC9E,UAAU,EAAE,OAAO;oBACnB,QAAQ,EAAE,6FAA6F;iBACxG,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,yBAAyB,GAAG;IAChC,kBAAkB;IAClB,oBAAoB;IACpB,sBAAsB;IACtB,oBAAoB;IACpB,kBAAkB;IAClB,sBAAsB;IACtB,oBAAoB;IACpB,yBAAyB;IACzB,2BAA2B;IAC3B,eAAe;IACf,eAAe;IACf,iBAAiB;IACjB,2BAA2B;IAC3B,iCAAiC;IACjC,qBAAqB;IACrB,0BAA0B;IAC1B,wBAAwB;IACxB,4BAA4B;IAC5B,0BAA0B;IAC1B,aAAa;IACb,sBAAsB;IACtB,uCAAuC;IACvC,4BAA4B;IAC5B,2BAA2B;IAC3B,8BAA8B;IAC9B,gCAAgC;IAChC,6BAA6B;IAC7B,0BAA0B;CAC3B,CAAC;AAMF,SAAS,oBAAoB,CAAC,KAAqB,EAAE,KAAyB;IAC5E,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI;YAAE,SAAS;QACrC,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YAE9B,IAAI,MAAM,CAAC,IAAI,IAAI,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC7F,SAAS;YACX,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;YACnE,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,eAAe;gBACrB,SAAS,EAAE,0BAA0B,KAAK,GAAG;gBAC7C,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,oEAAoE;aAC/E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAOD,SAAS,mBAAmB,CAAC,UAAmC,EAAE,KAAyB;IACzF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO;IAGlC,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACnE,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnF,MAAM,iBAAiB,GAAG,8BAA8B,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7H,IAAI,iBAAiB;QAAE,OAAO;IAE9B,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,KAAK,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;QACjC,IAAI,GAAG,EAAE,KAAK;YAAE,cAAc,EAAE,CAAC;IACnC,CAAC;IAGD,IAAI,cAAc,KAAK,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,wBAAwB;YAC9B,SAAS,EAAE,iFAAiF;YAC5F,UAAU,EAAE,OAAO;YACnB,QAAQ,EAAE,6EAA6E;SACxF,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAKD,SAAS,yBAAyB,CAAC,UAAmC,EAAE,KAAyB;IAC/F,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,GAAG,EAAE,KAAK;YAAE,SAAS;QAC1B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,MAAM,CAAC,IAAI,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBAAE,aAAa,EAAE,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,kCAAkC;YACxC,SAAS,EAAE,GAAG,aAAa,iEAAiE;YAC5F,UAAU,EAAE,OAAO;YACnB,QAAQ,EAAE,kDAAkD;SAC7D,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAKD,SAAS,gCAAgC,CAAC,UAAmC,EAAE,KAAyB;IACtG,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,qBAAqB,GAAG,KAAK,CAAC;IAClC,KAAK,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,GAAG,EAAE,KAAK;YAAE,SAAS;QAC1B,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,MAAM,CAAC,GAAG,IAAI,wDAAwD,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5F,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,IAAI,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;gBACjF,qBAAqB,GAAG,IAAI,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,IAAI,aAAa;YAAE,YAAY,EAAE,CAAC;IACpC,CAAC;IACD,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,4BAA4B;YAClC,SAAS,EAAE,iCAAiC,YAAY,+BAA+B;YACvF,UAAU,EAAE,OAAO;YACnB,QAAQ,EAAE,mFAAmF;SAC9F,CAAC,CAAC;IACL,CAAC;AACH,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\n\n/**\n * @fileoverview Analista de qualidade para workflows do GitHub Actions (v0.6.0)\n */\n\nimport type { NodePath } from '@babel/traverse';\nimport { parseDocument } from 'yaml';\n\nimport type { Analista, ContextoExecucao, DeteccaoCustom, Ocorrencia, ProblemaWorkflow } from '@';\n\nimport { detectorDependenciasVulneraveis } from '../detectors/detector-dependencies-vulnerable.js';\nimport { detectarProblemasAcessibilidade } from '../detectors/detector-workflow-accessibility.js';\nimport { detectarProblemasCompliance } from '../detectors/detector-workflow-compliance.js';\nimport { detectorWorkflowPerformance } from '../detectors/detector-workflow-performance.js';\nimport { detectorWorkflowSecurity } from '../detectors/detector-workflow-security.js';\nimport { detectarJobsPassivos, detectorWorkflowEstrutura } from '../detectors/detector-workflow-structure.js';\nimport { detectorWorkflowTriggerInseguro } from '../detectors/detector-workflow-trigger-unsafe.js';\nimport { isOrgVerificada } from '../detectors/org-verified.js';\n\ninterface WorkflowStep {\n name?: string;\n uses?: string;\n with?: {\n path?: string;\n 'fetch-depth'?: number | string;\n 'cache-from'?: string;\n 'cache-to'?: string;\n [chave: string]: unknown;\n };\n env?: Record<string, unknown>;\n run?: string;\n}\ninterface WorkflowJob {\n name?: string;\n needs?: string | string[];\n strategy?: {\n matrix?: unknown;\n 'fail-fast'?: unknown;\n };\n container?: unknown;\n steps?: WorkflowStep[];\n}\ninterface WorkflowNode extends Record<string, unknown> {\n name?: string;\n container?: unknown;\n strategy?: {\n matrix?: unknown;\n 'fail-fast'?: unknown;\n };\n jobs?: Record<string, WorkflowJob>;\n steps?: WorkflowStep[];\n uses?: string;\n run?: string;\n}\n/** Flag global temporária (resetada a cada execução) para indicar se o workflow precisa de histórico completo do git */\nlet _workflowNeedsFullHistory = false;\n\nconst detectoresRegistrados: DeteccaoCustom[] = [];\nexport function registrarDetectorGithubActions(detector: DeteccaoCustom): void {\n detectoresRegistrados.push(detector);\n}\nexport function obterDetectoresGithubActions(): DeteccaoCustom[] {\n return [...detectoresRegistrados];\n}\nexport const analistaGithubActions: Analista = {\n nome: 'github-actions',\n categoria: 'workflows',\n descricao: 'Analista avançado de workflows do GitHub Actions com suporte a plugins',\n test: (relPath: string) => relPath.startsWith('.github/workflows/'),\n async aplicar(conteudo: string, relPath: string, _ast: unknown = null, _fc?: string, contexto?: ContextoExecucao): Promise<Ocorrencia[]> {\n const ocorrencias: Ocorrencia[] = [];\n try {\n const doc = parseDocument(conteudo);\n const workflow = doc.toJS();\n const problemas = await executarDetectoresNativos(workflow, conteudo);\n const caminhos = contexto?.arquivos.map(arquivo => arquivo.relPath) || [];\n const plugResults = await Promise.all(detectoresRegistrados.map(diretorio => Promise.resolve(diretorio.testar(workflow, {\n conteudo,\n caminhos\n })).catch(() => [])));\n const securityResults = await Promise.resolve(detectorWorkflowSecurity.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const performanceResults = await Promise.resolve(detectorWorkflowPerformance.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const estruturaResults = await Promise.resolve(detectorWorkflowEstrutura.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const depsResults = await Promise.resolve(detectorDependenciasVulneraveis.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const triggerResults = await Promise.resolve(detectorWorkflowTriggerInseguro.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const todos = [...problemas, ...plugResults.flat()];\n ocorrencias.push(...(securityResults as Ocorrencia[]), ...(performanceResults as Ocorrencia[]), ...(estruturaResults as Ocorrencia[]), ...(depsResults as Ocorrencia[]), ...(triggerResults as Ocorrencia[]));\n for (const caminho of todos) {\n ocorrencias.push({\n tipo: `GITHUB_ACTIONS_${caminho.tipo.toUpperCase().replace(/-/g, '_')}`,\n mensagem: caminho.descricao,\n relPath,\n linha: caminho.linha || 1,\n coluna: 1,\n sugestao: caminho.sugestao || '',\n nivel: caminho.severidade === 'critica' || caminho.severidade === 'alta' ? 'erro' : caminho.severidade === 'media' ? 'aviso' : 'info'\n });\n }\n } catch {\n // Basic regex fallback if YAML fails\n }\n return ocorrencias;\n }\n};\nexport const analistaGithubActionsGlobal: Analista = {\n nome: 'github-actions-global',\n categoria: 'workflows',\n descricao: 'Governança Global do GitHub',\n test: () => false,\n async aplicar(_c, _p, _a, _f, ctx?: ContextoExecucao): Promise<Ocorrencia[]> {\n if (!ctx) return [];\n const ores: Ocorrencia[] = [];\n const paths = ctx.arquivos.map(arquivo => arquivo.relPath);\n\n // CODEOWNERS\n if (!paths.some(caminho => /CODEOWNERS/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_CODEOWNERS_MISSING',\n mensagem: 'CODEOWNERS faltando',\n relPath: '.github/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // README\n const readme = ctx.arquivos?.find(arquivo => /README\\.md/i.test(arquivo.relPath ?? ''));\n const content = readme ? readme.content as string | null || '' : '';\n if (readme && !/Code of Conduct|Código de Conduta/i.test(content)) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_DOC_GOVERNANCE_MISSING',\n mensagem: 'README sem Código de Conduta',\n relPath: readme.relPath,\n linha: 1,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // Stale Bot\n if (!paths.some(caminho => /stale/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_STALE_BOT_MISSING',\n mensagem: 'Stale bot faltando',\n relPath: '.github/workflows/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // Release\n if (!paths.some(caminho => /release|deploy/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_RELEASE_AUTOMATION_MISSING',\n mensagem: 'Release automation faltando',\n relPath: '.github/workflows/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // Issue Templates\n if (!paths.some(caminho => /\\.github\\/ISSUE_TEMPLATE/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_ISSUE_TEMPLATES_MISSING',\n mensagem: 'Issue templates faltando',\n relPath: '.github/ISSUE_TEMPLATE/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // PR Template\n if (!paths.some(caminho => /pull_request_template/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_PR_TEMPLATE_MISSING',\n mensagem: 'PR template faltando',\n relPath: '.github/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // Semantic Versioning & Changelog\n const hasSemanticRelease = paths.some(caminho => /semantic-release|semrel/i.test(caminho));\n const hasChangelog = paths.some(caminho => /changelog/i.test(caminho));\n if (!hasSemanticRelease) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_SEMANTIC_VERSIONING_MISSING',\n mensagem: 'Automação de versionamento semântico não detectada',\n relPath: '.github/workflows/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n if (!hasChangelog) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_CHANGELOG_AUTOMATION_MISSING',\n mensagem: 'Automação de changelog faltando',\n relPath: '.github/workflows/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // License Headers\n const sourceFiles = ctx.arquivos.filter(arquivo => /\\.(ts|js)$/.test(arquivo.relPath));\n const missingLicense = sourceFiles.filter(arquivo => !/SPDX-License-Identifier/i.test(arquivo.content as string || ''));\n if (missingLicense.length > sourceFiles.length / 2) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_LICENSE_HEADERS_MISSING',\n mensagem: 'Muitos arquivos sem cabeçalho de licença (SPDX)',\n relPath: './',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n return ores;\n }\n};\n/**\n * Verifica se o workflow contém comandos git que exigem histórico completo.\n */\nfunction workflowRequerHistoricoCompleto(wf: WorkflowNode, raw: string): boolean {\n // Verificar no raw por comandos git conhecidos que precisam de histórico completo\n const gitCommandsQuePrecisamDeHistorico = /\\b(git\\s+(rev-parse|tag|describe|log|shortlog|diff|bisect|blame)|git\\s+checkout\\s+-b|git\\s+fetch\\s+--unshallow|git\\s+clone\\s+--depth)/gi;\n if (gitCommandsQuePrecisamDeHistorico.test(raw)) {\n return true;\n }\n\n // Verificar nas ações steps por comandos que indicam necessidade de histórico\n const jobs = wf?.jobs ? Object.values(wf.jobs) : [];\n const allSteps = jobs.flatMap(job => job?.steps || []);\n for (const step of allSteps) {\n if (step?.run && gitCommandsQuePrecisamDeHistorico.test(step.run)) {\n return true;\n }\n }\n\n return false;\n}\n\nasync function executarDetectoresNativos(wf: unknown, raw: string): Promise<ProblemaWorkflow[]> {\n const probs: ProblemaWorkflow[] = [];\n if (!wf) return probs;\n\n _workflowNeedsFullHistory = workflowRequerHistoricoCompleto(wf as WorkflowNode, raw);\n\n // Handle various snippet styles for tests\n const candidates = Array.isArray(wf) ? wf : [wf];\n for (const item of candidates) {\n if (typeof item === 'object' && item !== null) {\n analisarEstrutura(item as WorkflowNode, probs);\n }\n }\n\n // Compliance checks\n probs.push(...detectarProblemasCompliance(wf, raw));\n\n // Accessibility checks\n probs.push(...detectarProblemasAcessibilidade(wf));\n\n // Passive jobs check\n if (typeof wf === 'object' && 'jobs' in wf) {\n const wfJobs = (wf as {\n jobs?: Record<string, {\n steps?: Array<{\n uses?: string;\n run?: string;\n }>;\n }>;\n }).jobs;\n if (wfJobs) {\n for (const [, job] of Object.entries(wfJobs)) {\n if (detectarJobsPassivos(job as {\n steps?: Array<{\n uses?: string;\n run?: string;\n }>;\n })) {\n probs.push({\n tipo: 'job-passivo-workflow',\n descricao: 'Job passivo detectado',\n severidade: 'baixa'\n });\n }\n }\n }\n }\n\n // Final check for raw string patterns (like sudo)\n if (/sudo\\s+/.test(raw)) {\n probs.push({\n tipo: 'uso-sudo',\n descricao: 'Uso de sudo detectado',\n severidade: 'alta'\n });\n }\n if (raw.includes('pull_request_target:')) {\n probs.push({\n tipo: 'estrutura-workflow',\n descricao: 'Uso de pull_request_target',\n severidade: 'alta'\n });\n }\n return probs;\n}\nfunction analisarEstrutura(wf: WorkflowNode, probs: ProblemaWorkflow[]) {\n // Workflow sem nome\n if (!wf.name) {\n probs.push({\n tipo: 'workflow-sem-nome',\n descricao: 'Workflow sem nome definido',\n severidade: 'baixa'\n });\n }\n\n // Container (Root level for snippets)\n if (wf.container && typeof wf.container === 'string') {\n probs.push({\n tipo: 'container-sem-user',\n descricao: 'Container sem user',\n severidade: 'media'\n });\n }\n\n // Strategy\n if (wf.strategy?.matrix && wf.strategy['fail-fast'] === undefined) {\n probs.push({\n tipo: 'matrix-sem-fail-fast',\n descricao: 'Matrix sem fail-fast',\n severidade: 'baixa'\n });\n }\n\n // Detect Secrets in generic maps (for environment snippets in tests)\n for (const [chave, valor] of Object.entries(wf)) {\n if (/(KEY|TOKEN|SECRET|PASSWORD)/i.test(chave) && valor && typeof valor !== 'object' && !String(valor).includes('${{')) {\n probs.push({\n tipo: 'env-sensivel',\n descricao: `Secret hardcoded em ${chave}`,\n severidade: 'critica'\n });\n }\n }\n\n // Jobs\n if (wf.jobs) {\n const jobEntries = Object.entries(wf.jobs);\n for (const [id, job] of jobEntries) {\n if (job?.strategy?.matrix && job.strategy['fail-fast'] === undefined) {\n probs.push({\n tipo: 'matrix-sem-fail-fast',\n descricao: `Job ${id} sem fail-fast`,\n severidade: 'baixa'\n });\n }\n if (job?.container && typeof job.container === 'string') {\n probs.push({\n tipo: 'container-sem-user',\n descricao: 'Container rodando como root',\n severidade: 'media'\n });\n }\n\n // --- v0.4.5: Job sem nome descritivo ---\n if (/^(job\\d+|step\\d+|build\\d*|test\\d*|j\\d+)$/i.test(id) && !job?.name) {\n probs.push({\n tipo: 'job-sem-nome',\n descricao: `Job '${id}' usa ID genérico sem campo 'name'`,\n severidade: 'baixa',\n sugestao: 'Usar nomes semânticos como build-backend, test-integration'\n });\n }\n if (job?.steps) {\n for (const string of job.steps) analisarStep(string, probs);\n\n // --- v0.4.5: Steps sem nome ---\n analisarStepsSemNome(job.steps, probs);\n\n // --- v0.7.0: Jobs muito longos ---\n if (job.steps.length > 15) {\n probs.push({\n tipo: 'job-longo',\n descricao: `Job '${id}' possui ${job.steps.length} steps, o que dificulta a manutenção`,\n severidade: 'baixa',\n sugestao: 'Considere quebrar em jobs menores ou usar composite actions'\n });\n }\n }\n }\n\n // --- v0.4.5: Build sem parallelismo ---\n analisarParalelismo(jobEntries, probs);\n\n // --- v0.4.5: Download desnecessário de artifacts ---\n analisarDownloadArtifacts(jobEntries, probs);\n\n // --- v0.4.5: Múltiplas instalações de dependências ---\n analisarMultiplasInstalacoesDeps(jobEntries, probs);\n }\n\n // Se forem passos diretos na raiz (snippet)\n if (wf.steps && Array.isArray(wf.steps)) {\n for (const string of wf.steps) analisarStep(string, probs);\n analisarStepsSemNome(wf.steps, probs);\n }\n\n // Direct steps (if snippet is a list)\n if (wf.uses || wf.run) analisarStep(wf as WorkflowStep, probs);\n}\nfunction analisarStep(string: WorkflowStep, probs: ProblemaWorkflow[]) {\n if (!string) return;\n // Pinning - only for non-verified orgs\n if (string.uses && /@v\\d+/.test(string.uses)) {\n const actionRef = string.uses.split('@')[0];\n if (!isOrgVerificada(actionRef)) {\n probs.push({\n tipo: 'falta-sha-pinning',\n descricao: 'Pinning por SHA faltando',\n severidade: 'media'\n });\n }\n }\n // Upload\n if (string.uses?.includes('upload-artifact') && string.with?.path?.includes('.env')) {\n probs.push({\n tipo: 'upload-sensivel',\n descricao: 'Upload de .env',\n severidade: 'critica'\n });\n }\n // Env\n if (string.env) {\n for (const [chave, valor] of Object.entries(string.env)) {\n if (/(KEY|TOKEN|SECRET|PASSWORD)/i.test(chave) && valor && typeof valor !== 'object' && !String(valor).includes('${{')) {\n probs.push({\n tipo: 'env-sensivel',\n descricao: `Env ${chave} hardcoded`,\n severidade: 'critica'\n });\n }\n }\n }\n // Injection\n if (string.run && /\\$\\{\\{\\s*github\\.event\\./.test(string.run)) {\n probs.push({\n tipo: 'script-injection',\n descricao: 'Script injection',\n severidade: 'alta'\n });\n }\n\n // --- v0.4.5: Docker build sem layer caching ---\n if (string.uses && /docker\\/build-push-action/.test(string.uses)) {\n const hasCacheFrom = string.with?.['cache-from'] !== undefined;\n const hasCacheTo = string.with?.['cache-to'] !== undefined;\n if (!hasCacheFrom && !hasCacheTo) {\n probs.push({\n tipo: 'docker-sem-layer-cache',\n descricao: 'Docker build sem cache de layers configurado',\n severidade: 'media',\n sugestao: 'Adicionar cache-from e cache-to para otimizar builds Docker'\n });\n }\n }\n\n // --- v0.4.5: Checkout com fetch-depth: 0 desnecessário ---\n if (string.uses && /actions\\/checkout/.test(string.uses) && string.with) {\n const fd = string.with['fetch-depth'];\n if (fd === 0 || fd === '0') {\n // Não emitir se já foi identificado que o workflow precisa de histórico completo\n if (!_workflowNeedsFullHistory) {\n probs.push({\n tipo: 'fetch-depth-desnecessario',\n descricao: 'checkout com fetch-depth: 0 baixa todo o histórico do repositório',\n severidade: 'baixa',\n sugestao: 'Usar fetch-depth: 1 (default) a menos que precise do histórico completo para tags/changelog'\n });\n }\n }\n }\n}\n\nconst ACTIONS_AUTO_EXPLICATIVAS = [\n 'actions/checkout',\n 'actions/setup-node',\n 'actions/setup-python',\n 'actions/setup-java',\n 'actions/setup-go',\n 'actions/setup-dotnet',\n 'actions/setup-ruby',\n 'actions/upload-artifact',\n 'actions/download-artifact',\n 'actions/cache',\n 'actions/stale',\n 'actions/labeler',\n 'actions/dependency-review',\n 'actions/attest-build-provenance',\n 'docker/login-action',\n 'docker/build-push-action',\n 'docker/metadata-action',\n 'docker/setup-buildx-action',\n 'docker/setup-qemu-action',\n 'azure/login',\n 'azure/webapps-deploy',\n 'aws-actions/configure-aws-credentials',\n 'google-github-actions/auth',\n 'github/codeql-action/init',\n 'github/codeql-action/analyze',\n 'github/codeql-action/autobuild',\n 'softprops/action-gh-release',\n 'cypress-io/github-action',\n];\n\n/**\n * v0.4.5: Detecta steps sem campo 'name'\n * Não reporta para actions bem conhecidas e auto-explicativas\n */\nfunction analisarStepsSemNome(steps: WorkflowStep[], probs: ProblemaWorkflow[]) {\n for (const string of steps) {\n if (!string || string.name) continue;\n if (string.uses || string.run) {\n // Pular actions auto-explicativas (não precisam de name)\n if (string.uses && ACTIONS_AUTO_EXPLICATIVAS.some(action => string.uses?.startsWith(action))) {\n continue;\n }\n const ident = string.uses ? `uses: ${string.uses}` : 'run command';\n probs.push({\n tipo: 'step-sem-nome',\n descricao: `Step sem campo 'name' (${ident})`,\n severidade: 'baixa',\n sugestao: 'Adicionar campo name: para melhor legibilidade nos logs do Actions'\n });\n }\n }\n}\n\n/**\n * v0.4.5: Detecta jobs que poderiam rodar em paralelo mas têm 'needs' desnecessário\n * Heurística: se todos os jobs têm 'needs' formando uma cadeia linear, sugere paralelismo\n * Exceção: workflows de release/deploy são intrinsecamente sequenciais\n */\nfunction analisarParalelismo(jobEntries: [string, WorkflowJob][], probs: ProblemaWorkflow[]) {\n if (jobEntries.length < 3) return;\n\n // Check if this is a release/deploy workflow (sequential by nature)\n const workflowName = jobEntries[0]?.[1]?.name?.toLowerCase() || '';\n const jobNames = jobEntries.map(([, j]) => j?.name?.toLowerCase() || '').join(' ');\n const isReleaseWorkflow = /release|deploy|publish|ship/i.test(workflowName) || /release|deploy|publish|ship/i.test(jobNames);\n if (isReleaseWorkflow) return;\n\n let totalWithNeeds = 0;\n for (const [, job] of jobEntries) {\n if (job?.needs) totalWithNeeds++;\n }\n\n // Se todos os jobs (exceto o primeiro) dependem do anterior em cadeia linear\n if (totalWithNeeds === jobEntries.length - 1) {\n probs.push({\n tipo: 'build-sem-parallelismo',\n descricao: 'Todos os jobs estão em cadeia linear - considere paralelizar jobs independentes',\n severidade: 'media',\n sugestao: 'Remover dependências (needs) desnecessárias para permitir execução paralela'\n });\n }\n}\n\n/**\n * v0.4.5: Detecta múltiplos download-artifact em jobs diferentes\n */\nfunction analisarDownloadArtifacts(jobEntries: [string, WorkflowJob][], probs: ProblemaWorkflow[]) {\n let downloadCount = 0;\n for (const [, job] of jobEntries) {\n if (!job?.steps) continue;\n for (const string of job.steps) {\n if (string.uses && /download-artifact/.test(string.uses)) downloadCount++;\n }\n }\n if (downloadCount >= 3) {\n probs.push({\n tipo: 'download-artifacts-desnecessario',\n descricao: `${downloadCount} download-artifact encontrados - considere consolidar artifacts`,\n severidade: 'baixa',\n sugestao: 'Consolidar artifacts ou usar cache compartilhado'\n });\n }\n}\n\n/**\n * v0.4.5: Detecta npm ci/npm install em múltiplos jobs sem cache compartilhado\n */\nfunction analisarMultiplasInstalacoesDeps(jobEntries: [string, WorkflowJob][], probs: ProblemaWorkflow[]) {\n let installCount = 0;\n let hasCacheStep = false;\n let hasSetupNodeWithCache = false;\n for (const [, job] of jobEntries) {\n if (!job?.steps) continue;\n let jobHasInstall = false;\n for (const string of job.steps) {\n if (string.run && /\\b(npm\\s+(ci|install)|yarn\\s+install|pnpm\\s+install)\\b/.test(string.run)) {\n jobHasInstall = true;\n }\n if (string.uses && /actions\\/cache/.test(string.uses)) {\n hasCacheStep = true;\n }\n if (string.uses && /actions\\/setup-node/.test(string.uses) && string.with?.cache) {\n hasSetupNodeWithCache = true;\n }\n }\n if (jobHasInstall) installCount++;\n }\n if (installCount >= 2 && !hasCacheStep && !hasSetupNodeWithCache) {\n probs.push({\n tipo: 'multiplas-instalacoes-deps',\n descricao: `Instalação de dependências em ${installCount} jobs sem cache compartilhado`,\n severidade: 'media',\n sugestao: 'Usar actions/cache ou artifact de node_modules para evitar instalações duplicadas'\n });\n }\n}"]}
1
+ {"version":3,"file":"analyst-github-actions.js","sourceRoot":"","sources":["../../../../src/analysts/github-actions/analysts/analyst-github-actions.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n\n/**\n * @fileoverview Analista de qualidade para workflows do GitHub Actions (v0.6.0)\n */\n\nimport type { NodePath } from '@babel/traverse';\nimport { parseDocument } from 'yaml';\n\nimport type { Analista, ContextoExecucao, DeteccaoCustom, Ocorrencia, ProblemaWorkflow } from '@';\n\nimport { detectorDependenciasVulneraveis } from '../detectors/detector-dependencies-vulnerable.js';\nimport { detectarProblemasAcessibilidade } from '../detectors/detector-workflow-accessibility.js';\nimport { detectarProblemasCompliance } from '../detectors/detector-workflow-compliance.js';\nimport { detectorWorkflowPerformance } from '../detectors/detector-workflow-performance.js';\nimport { detectorWorkflowSecurity } from '../detectors/detector-workflow-security.js';\nimport { detectarJobsPassivos, detectorWorkflowEstrutura } from '../detectors/detector-workflow-structure.js';\nimport { detectorWorkflowTriggerInseguro } from '../detectors/detector-workflow-trigger-unsafe.js';\nimport { isOrgVerificada } from '../detectors/org-verified.js';\nimport { messages } from '@core/messages';\n\ninterface WorkflowStep {\n name?: string;\n uses?: string;\n with?: {\n path?: string;\n 'fetch-depth'?: number | string;\n 'cache-from'?: string;\n 'cache-to'?: string;\n [chave: string]: unknown;\n };\n env?: Record<string, unknown>;\n run?: string;\n}\ninterface WorkflowJob {\n name?: string;\n needs?: string | string[];\n strategy?: {\n matrix?: unknown;\n 'fail-fast'?: unknown;\n };\n container?: unknown;\n steps?: WorkflowStep[];\n}\ninterface WorkflowNode extends Record<string, unknown> {\n name?: string;\n container?: unknown;\n strategy?: {\n matrix?: unknown;\n 'fail-fast'?: unknown;\n };\n jobs?: Record<string, WorkflowJob>;\n steps?: WorkflowStep[];\n uses?: string;\n run?: string;\n}\n/** Flag global temporária (resetada a cada execução) para indicar se o workflow precisa de histórico completo do git */\nlet _workflowNeedsFullHistory = false;\n\nconst detectoresRegistrados: DeteccaoCustom[] = [];\nexport function registrarDetectorGithubActions(detector: DeteccaoCustom): void {\n detectoresRegistrados.push(detector);\n}\nexport function obterDetectoresGithubActions(): DeteccaoCustom[] {\n return [...detectoresRegistrados];\n}\nexport const analistaGithubActions: Analista = {\n nome: 'github-actions',\n categoria: 'workflows',\n descricao: 'Analista avançado de workflows do GitHub Actions com suporte a plugins',\n test: (relPath: string) => relPath.startsWith('.github/workflows/'),\n async aplicar(conteudo: string, relPath: string, _ast: unknown = null, _fc?: string, contexto?: ContextoExecucao): Promise<Ocorrencia[]> {\n const ocorrencias: Ocorrencia[] = [];\n try {\n const doc = parseDocument(conteudo);\n const workflow = doc.toJS();\n const problemas = await executarDetectoresNativos(workflow, conteudo);\n const caminhos = contexto?.arquivos.map(arquivo => arquivo.relPath) || [];\n const plugResults = await Promise.all(detectoresRegistrados.map(diretorio => Promise.resolve(diretorio.testar(workflow, {\n conteudo,\n caminhos\n })).catch(() => [])));\n const securityResults = await Promise.resolve(detectorWorkflowSecurity.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const performanceResults = await Promise.resolve(detectorWorkflowPerformance.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const estruturaResults = await Promise.resolve(detectorWorkflowEstrutura.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const depsResults = await Promise.resolve(detectorDependenciasVulneraveis.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const triggerResults = await Promise.resolve(detectorWorkflowTriggerInseguro.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const todos = [...problemas, ...plugResults.flat()];\n ocorrencias.push(...(securityResults as Ocorrencia[]), ...(performanceResults as Ocorrencia[]), ...(estruturaResults as Ocorrencia[]), ...(depsResults as Ocorrencia[]), ...(triggerResults as Ocorrencia[]));\n for (const caminho of todos) {\n ocorrencias.push({\n tipo: `GITHUB_ACTIONS_${caminho.tipo.toUpperCase().replace(/-/g, '_')}`,\n mensagem: caminho.descricao,\n relPath,\n linha: caminho.linha || 1,\n coluna: 1,\n sugestao: caminho.sugestao || '',\n nivel: caminho.severidade === 'critica' || caminho.severidade === 'alta' ? 'erro' : caminho.severidade === 'media' ? 'aviso' : 'info'\n });\n }\n } catch {\n // Basic regex fallback if YAML fails\n }\n return ocorrencias;\n }\n};\nexport const analistaGithubActionsGlobal: Analista = {\n nome: 'github-actions-global',\n categoria: 'workflows',\n descricao: 'Governança Global do GitHub',\n test: () => false,\n async aplicar(_c, _p, _a, _f, ctx?: ContextoExecucao): Promise<Ocorrencia[]> {\n if (!ctx) return [];\n const ores: Ocorrencia[] = [];\n const paths = ctx.arquivos.map(arquivo => arquivo.relPath);\n\n // CODEOWNERS\n if (!paths.some(caminho => /CODEOWNERS/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_CODEOWNERS_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingCodeowners,\n relPath: '.github/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // README\n const readme = ctx.arquivos?.find(arquivo => /README\\.md/i.test(arquivo.relPath ?? ''));\n const content = readme ? readme.content as string | null || '' : '';\n if (readme && !/Code of Conduct|Código de Conduta/i.test(content)) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_DOC_GOVERNANCE_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingCodeOfConduct,\n relPath: readme.relPath,\n linha: 1,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // Stale Bot\n if (!paths.some(caminho => /stale/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_STALE_BOT_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingStaleBot,\n relPath: '.github/workflows/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // Release\n if (!paths.some(caminho => /release|deploy/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_RELEASE_AUTOMATION_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingReleaseAutomation,\n relPath: '.github/workflows/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // Issue Templates\n if (!paths.some(caminho => /\\.github\\/ISSUE_TEMPLATE/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_ISSUE_TEMPLATES_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingIssueTemplates,\n relPath: '.github/ISSUE_TEMPLATE/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // PR Template\n if (!paths.some(caminho => /pull_request_template/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_PR_TEMPLATE_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingPrTemplate,\n relPath: '.github/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // Semantic Versioning & Changelog\n const hasSemanticRelease = paths.some(caminho => /semantic-release|semrel/i.test(caminho));\n const hasChangelog = paths.some(caminho => /changelog/i.test(caminho));\n if (!hasSemanticRelease) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_SEMANTIC_VERSIONING_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingSemanticVersioning,\n relPath: '.github/workflows/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n if (!hasChangelog) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_CHANGELOG_AUTOMATION_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingChangelogAutomation,\n relPath: '.github/workflows/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // License Headers\n const sourceFiles = ctx.arquivos.filter(arquivo => /\\.(ts|js)$/.test(arquivo.relPath));\n const missingLicense = sourceFiles.filter(arquivo => !/SPDX-License-Identifier/i.test(arquivo.content as string || ''));\n if (missingLicense.length > sourceFiles.length / 2) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_LICENSE_HEADERS_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingLicenseHeaders,\n relPath: './',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n return ores;\n }\n};\n/**\n * Verifica se o workflow contém comandos git que exigem histórico completo.\n */\nfunction workflowRequerHistoricoCompleto(wf: WorkflowNode, raw: string): boolean {\n // Verificar no raw por comandos git conhecidos que precisam de histórico completo\n const gitCommandsQuePrecisamDeHistorico = /\\b(git\\s+(rev-parse|tag|describe|log|shortlog|diff|bisect|blame)|git\\s+checkout\\s+-b|git\\s+fetch\\s+--unshallow|git\\s+clone\\s+--depth)/gi;\n if (gitCommandsQuePrecisamDeHistorico.test(raw)) {\n return true;\n }\n\n // Verificar nas ações steps por comandos que indicam necessidade de histórico\n const jobs = wf?.jobs ? Object.values(wf.jobs) : [];\n const allSteps = jobs.flatMap(job => job?.steps || []);\n for (const step of allSteps) {\n if (step?.run && gitCommandsQuePrecisamDeHistorico.test(step.run)) {\n return true;\n }\n }\n\n return false;\n}\n\nasync function executarDetectoresNativos(wf: unknown, raw: string): Promise<ProblemaWorkflow[]> {\n const probs: ProblemaWorkflow[] = [];\n if (!wf) return probs;\n\n _workflowNeedsFullHistory = workflowRequerHistoricoCompleto(wf as WorkflowNode, raw);\n\n // Handle various snippet styles for tests\n const candidates = Array.isArray(wf) ? wf : [wf];\n for (const item of candidates) {\n if (typeof item === 'object' && item !== null) {\n analisarEstrutura(item as WorkflowNode, probs);\n }\n }\n\n // Compliance checks\n probs.push(...detectarProblemasCompliance(wf, raw));\n\n // Accessibility checks\n probs.push(...detectarProblemasAcessibilidade(wf));\n\n // Passive jobs check\n if (typeof wf === 'object' && 'jobs' in wf) {\n const wfJobs = (wf as {\n jobs?: Record<string, {\n steps?: Array<{\n uses?: string;\n run?: string;\n }>;\n }>;\n }).jobs;\n if (wfJobs) {\n for (const [, job] of Object.entries(wfJobs)) {\n if (detectarJobsPassivos(job as {\n steps?: Array<{\n uses?: string;\n run?: string;\n }>;\n })) {\n probs.push({\n tipo: 'job-passivo-workflow',\n descricao: 'Job passivo detectado',\n severidade: 'baixa'\n });\n }\n }\n }\n }\n\n // Final check for raw string patterns (like sudo)\n if (/sudo\\s+/.test(raw)) {\n probs.push({\n tipo: 'uso-sudo',\n descricao: 'Uso de sudo detectado',\n severidade: 'alta'\n });\n }\n if (raw.includes('pull_request_target:')) {\n probs.push({\n tipo: 'estrutura-workflow',\n descricao: 'Uso de pull_request_target',\n severidade: 'alta'\n });\n }\n return probs;\n}\nfunction analisarEstrutura(wf: WorkflowNode, probs: ProblemaWorkflow[]) {\n // Workflow sem nome\n if (!wf.name) {\n probs.push({\n tipo: 'workflow-sem-nome',\n descricao: 'Workflow sem nome definido',\n severidade: 'baixa'\n });\n }\n\n // Container (Root level for snippets)\n if (wf.container && typeof wf.container === 'string') {\n probs.push({\n tipo: 'container-sem-user',\n descricao: 'Container sem user',\n severidade: 'media'\n });\n }\n\n // Strategy\n if (wf.strategy?.matrix && wf.strategy['fail-fast'] === undefined) {\n probs.push({\n tipo: 'matrix-sem-fail-fast',\n descricao: 'Matrix sem fail-fast',\n severidade: 'baixa'\n });\n }\n\n // Detect Secrets in generic maps (for environment snippets in tests)\n for (const [chave, valor] of Object.entries(wf)) {\n if (/(KEY|TOKEN|SECRET|PASSWORD)/i.test(chave) && valor && typeof valor !== 'object' && !String(valor).includes('${{')) {\n probs.push({\n tipo: 'env-sensivel',\n descricao: `Secret hardcoded em ${chave}`,\n severidade: 'critica'\n });\n }\n }\n\n // Jobs\n if (wf.jobs) {\n const jobEntries = Object.entries(wf.jobs);\n for (const [id, job] of jobEntries) {\n if (job?.strategy?.matrix && job.strategy['fail-fast'] === undefined) {\n probs.push({\n tipo: 'matrix-sem-fail-fast',\n descricao: `Job ${id} sem fail-fast`,\n severidade: 'baixa'\n });\n }\n if (job?.container && typeof job.container === 'string') {\n probs.push({\n tipo: 'container-sem-user',\n descricao: 'Container rodando como root',\n severidade: 'media'\n });\n }\n\n // --- v0.4.5: Job sem nome descritivo ---\n if (/^(job\\d+|step\\d+|build\\d*|test\\d*|j\\d+)$/i.test(id) && !job?.name) {\n probs.push({\n tipo: 'job-sem-nome',\n descricao: `Job '${id}' usa ID genérico sem campo 'name'`,\n severidade: 'baixa',\n sugestao: 'Usar nomes semânticos como build-backend, test-integration'\n });\n }\n if (job?.steps) {\n for (const string of job.steps) analisarStep(string, probs);\n\n // --- v0.4.5: Steps sem nome ---\n analisarStepsSemNome(job.steps, probs);\n\n // --- v0.7.0: Jobs muito longos ---\n if (job.steps.length > 15) {\n probs.push({\n tipo: 'job-longo',\n descricao: `Job '${id}' possui ${job.steps.length} steps, o que dificulta a manutenção`,\n severidade: 'baixa',\n sugestao: 'Considere quebrar em jobs menores ou usar composite actions'\n });\n }\n }\n }\n\n // --- v0.4.5: Build sem parallelismo ---\n analisarParalelismo(jobEntries, probs);\n\n // --- v0.4.5: Download desnecessário de artifacts ---\n analisarDownloadArtifacts(jobEntries, probs);\n\n // --- v0.4.5: Múltiplas instalações de dependências ---\n analisarMultiplasInstalacoesDeps(jobEntries, probs);\n }\n\n // Se forem passos diretos na raiz (snippet)\n if (wf.steps && Array.isArray(wf.steps)) {\n for (const string of wf.steps) analisarStep(string, probs);\n analisarStepsSemNome(wf.steps, probs);\n }\n\n // Direct steps (if snippet is a list)\n if (wf.uses || wf.run) analisarStep(wf as WorkflowStep, probs);\n}\nfunction analisarStep(string: WorkflowStep, probs: ProblemaWorkflow[]) {\n if (!string) return;\n // Pinning - only for non-verified orgs\n if (string.uses && /@v\\d+/.test(string.uses)) {\n const actionRef = string.uses.split('@')[0];\n if (!isOrgVerificada(actionRef)) {\n probs.push({\n tipo: 'falta-sha-pinning',\n descricao: 'Pinning por SHA faltando',\n severidade: 'media'\n });\n }\n }\n // Upload\n if (string.uses?.includes('upload-artifact') && string.with?.path?.includes('.env')) {\n probs.push({\n tipo: 'upload-sensivel',\n descricao: 'Upload de .env',\n severidade: 'critica'\n });\n }\n // Env\n if (string.env) {\n for (const [chave, valor] of Object.entries(string.env)) {\n if (/(KEY|TOKEN|SECRET|PASSWORD)/i.test(chave) && valor && typeof valor !== 'object' && !String(valor).includes('${{')) {\n probs.push({\n tipo: 'env-sensivel',\n descricao: `Env ${chave} hardcoded`,\n severidade: 'critica'\n });\n }\n }\n }\n // Injection\n if (string.run && /\\$\\{\\{\\s*github\\.event\\./.test(string.run)) {\n probs.push({\n tipo: 'script-injection',\n descricao: 'Script injection',\n severidade: 'alta'\n });\n }\n\n // --- v0.4.5: Docker build sem layer caching ---\n if (string.uses && /docker\\/build-push-action/.test(string.uses)) {\n const hasCacheFrom = string.with?.['cache-from'] !== undefined;\n const hasCacheTo = string.with?.['cache-to'] !== undefined;\n if (!hasCacheFrom && !hasCacheTo) {\n probs.push({\n tipo: 'docker-sem-layer-cache',\n descricao: 'Docker build sem cache de layers configurado',\n severidade: 'media',\n sugestao: 'Adicionar cache-from e cache-to para otimizar builds Docker'\n });\n }\n }\n\n // --- v0.4.5: Checkout com fetch-depth: 0 desnecessário ---\n if (string.uses && /actions\\/checkout/.test(string.uses) && string.with) {\n const fd = string.with['fetch-depth'];\n if (fd === 0 || fd === '0') {\n // Não emitir se já foi identificado que o workflow precisa de histórico completo\n if (!_workflowNeedsFullHistory) {\n probs.push({\n tipo: 'fetch-depth-desnecessario',\n descricao: 'checkout com fetch-depth: 0 baixa todo o histórico do repositório',\n severidade: 'baixa',\n sugestao: 'Usar fetch-depth: 1 (default) a menos que precise do histórico completo para tags/changelog'\n });\n }\n }\n }\n}\n\nconst ACTIONS_AUTO_EXPLICATIVAS = [\n 'actions/checkout',\n 'actions/setup-node',\n 'actions/setup-python',\n 'actions/setup-java',\n 'actions/setup-go',\n 'actions/setup-dotnet',\n 'actions/setup-ruby',\n 'actions/upload-artifact',\n 'actions/download-artifact',\n 'actions/cache',\n 'actions/stale',\n 'actions/labeler',\n 'actions/dependency-review',\n 'actions/attest-build-provenance',\n 'docker/login-action',\n 'docker/build-push-action',\n 'docker/metadata-action',\n 'docker/setup-buildx-action',\n 'docker/setup-qemu-action',\n 'azure/login',\n 'azure/webapps-deploy',\n 'aws-actions/configure-aws-credentials',\n 'google-github-actions/auth',\n 'github/codeql-action/init',\n 'github/codeql-action/analyze',\n 'github/codeql-action/autobuild',\n 'softprops/action-gh-release',\n 'cypress-io/github-action',\n];\n\n/**\n * v0.4.5: Detecta steps sem campo 'name'\n * Não reporta para actions bem conhecidas e auto-explicativas\n */\nfunction analisarStepsSemNome(steps: WorkflowStep[], probs: ProblemaWorkflow[]) {\n for (const string of steps) {\n if (!string || string.name) continue;\n if (string.uses || string.run) {\n // Pular actions auto-explicativas (não precisam de name)\n if (string.uses && ACTIONS_AUTO_EXPLICATIVAS.some(action => string.uses?.startsWith(action))) {\n continue;\n }\n const ident = string.uses ? `uses: ${string.uses}` : 'run command';\n probs.push({\n tipo: 'step-sem-nome',\n descricao: `Step sem campo 'name' (${ident})`,\n severidade: 'baixa',\n sugestao: 'Adicionar campo name: para melhor legibilidade nos logs do Actions'\n });\n }\n }\n}\n\n/**\n * v0.4.5: Detecta jobs que poderiam rodar em paralelo mas têm 'needs' desnecessário\n * Heurística: se todos os jobs têm 'needs' formando uma cadeia linear, sugere paralelismo\n * Exceção: workflows de release/deploy são intrinsecamente sequenciais\n */\nfunction analisarParalelismo(jobEntries: [string, WorkflowJob][], probs: ProblemaWorkflow[]) {\n if (jobEntries.length < 3) return;\n\n // Check if this is a release/deploy workflow (sequential by nature)\n const workflowName = jobEntries[0]?.[1]?.name?.toLowerCase() || '';\n const jobNames = jobEntries.map(([, j]) => j?.name?.toLowerCase() || '').join(' ');\n const isReleaseWorkflow = /release|deploy|publish|ship/i.test(workflowName) || /release|deploy|publish|ship/i.test(jobNames);\n if (isReleaseWorkflow) return;\n\n let totalWithNeeds = 0;\n for (const [, job] of jobEntries) {\n if (job?.needs) totalWithNeeds++;\n }\n\n // Se todos os jobs (exceto o primeiro) dependem do anterior em cadeia linear\n if (totalWithNeeds === jobEntries.length - 1) {\n probs.push({\n tipo: 'build-sem-parallelismo',\n descricao: 'Todos os jobs estão em cadeia linear - considere paralelizar jobs independentes',\n severidade: 'media',\n sugestao: 'Remover dependências (needs) desnecessárias para permitir execução paralela'\n });\n }\n}\n\n/**\n * v0.4.5: Detecta múltiplos download-artifact em jobs diferentes\n */\nfunction analisarDownloadArtifacts(jobEntries: [string, WorkflowJob][], probs: ProblemaWorkflow[]) {\n let downloadCount = 0;\n for (const [, job] of jobEntries) {\n if (!job?.steps) continue;\n for (const string of job.steps) {\n if (string.uses && /download-artifact/.test(string.uses)) downloadCount++;\n }\n }\n if (downloadCount >= 3) {\n probs.push({\n tipo: 'download-artifacts-desnecessario',\n descricao: `${downloadCount} download-artifact encontrados - considere consolidar artifacts`,\n severidade: 'baixa',\n sugestao: 'Consolidar artifacts ou usar cache compartilhado'\n });\n }\n}\n\n/**\n * v0.4.5: Detecta npm ci/npm install em múltiplos jobs sem cache compartilhado\n */\nfunction analisarMultiplasInstalacoesDeps(jobEntries: [string, WorkflowJob][], probs: ProblemaWorkflow[]) {\n let installCount = 0;\n let hasCacheStep = false;\n let hasSetupNodeWithCache = false;\n for (const [, job] of jobEntries) {\n if (!job?.steps) continue;\n let jobHasInstall = false;\n for (const string of job.steps) {\n if (string.run && /\\b(npm\\s+(ci|install)|yarn\\s+install|pnpm\\s+install)\\b/.test(string.run)) {\n jobHasInstall = true;\n }\n if (string.uses && /actions\\/cache/.test(string.uses)) {\n hasCacheStep = true;\n }\n if (string.uses && /actions\\/setup-node/.test(string.uses) && string.with?.cache) {\n hasSetupNodeWithCache = true;\n }\n }\n if (jobHasInstall) installCount++;\n }\n if (installCount >= 2 && !hasCacheStep && !hasSetupNodeWithCache) {\n probs.push({\n tipo: 'multiplas-instalacoes-deps',\n descricao: `Instalação de dependências em ${installCount} jobs sem cache compartilhado`,\n severidade: 'media',\n sugestao: 'Usar actions/cache ou artifact de node_modules para evitar instalações duplicadas'\n });\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"autofix-engine.d.ts","sourceRoot":"","sources":["../../../../src/analysts/github-actions/corrections/autofix-engine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAOrC,qBAAa,aAAa;IAOjB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC,GAAG,MAAM;IAwB7E,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;CAGjF;AACD,eAAO,MAAM,aAAa,eAAsB,CAAC"}
1
+ {"version":3,"file":"autofix-engine.d.ts","sourceRoot":"","sources":["../../../../src/analysts/github-actions/corrections/autofix-engine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AASrC,qBAAa,aAAa;IAOjB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC,GAAG,MAAM;IAwB7E,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;CAGjF;AACD,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -1,4 +1,6 @@
1
+ import { getMessages } from '../../../core/messages/index.js';
1
2
  import { parseDocument } from 'yaml';
3
+ const { AnalistaGithubActionsMensagens } = getMessages();
2
4
  export class AutofixEngine {
3
5
  aplicarFixes(content, fixers) {
4
6
  if (!content || fixers.length === 0)
@@ -12,7 +14,7 @@ export class AutofixEngine {
12
14
  fix(doc);
13
15
  }
14
16
  catch (err) {
15
- console.error(`Erro ao aplicar correção: ${err}`);
17
+ console.error(AnalistaGithubActionsMensagens.erroAplicarCorrecao(err));
16
18
  }
17
19
  }
18
20
  return doc.toString();
@@ -1 +1 @@
1
- {"version":3,"file":"autofix-engine.js","sourceRoot":"","sources":["../../../../src/analysts/github-actions/corrections/autofix-engine.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAMrC,MAAM,OAAO,aAAa;IAOjB,YAAY,CAAC,OAAe,EAAE,MAAsC;QACzE,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QACpD,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAGnC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,OAAO,CAAC;QACjB,CAAC;QAGD,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,GAAG,CAAC,GAAG,CAAC,CAAC;YACX,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAMM,aAAa,CAAC,QAA0B;QAC7C,OAAO,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,SAAS,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,QAAmC,CAAC,CAAC;IAChJ,CAAC;CACF;AACD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\nimport type { DeteccaoCustom } from '@types';\nimport type { Document } from 'yaml';\nimport { parseDocument } from 'yaml';\n\n/**\n * Motor de Auto-fix para GitHub Actions\n * Utiliza a biblioteca 'yaml' para mutar o documento preservando a formatação.\n */\nexport class AutofixEngine {\n /**\n * Aplica uma lista de mutadores a um conteúdo YAML\n * @param content O conteúdo original do arquivo YAML\n * @param fixers Lista de funções de correção que operam na AST (Document)\n * @returns O conteúdo corrigido\n */\n public aplicarFixes(content: string, fixers: Array<(doc: Document) => void>): string {\n if (!content || fixers.length === 0) return content;\n const doc = parseDocument(content);\n\n // Se o documento tiver erros de parse, não aplicamos correções para evitar corromper\n if (doc.errors.length > 0) {\n return content;\n }\n\n // Executa cada mutador na AST\n for (const fix of fixers) {\n try {\n fix(doc);\n } catch (err) {\n console.error(`Erro ao aplicar correção: ${err}`);\n }\n }\n return doc.toString();\n }\n\n /**\n * Converte o método corrigir de DeteccaoCustom para um formato compatível com o motor\n * @param detecoes Lista de detecções que possuem método corrigir\n */\n public extrairFixers(detecoes: DeteccaoCustom[]): Array<(doc: Document) => void> {\n return detecoes.filter(diretorio => typeof diretorio.corrigir === 'function').map(diretorio => diretorio.corrigir as (doc: Document) => void);\n }\n}\nexport const autofixEngine = new AutofixEngine();"]}
1
+ {"version":3,"file":"autofix-engine.js","sourceRoot":"","sources":["../../../../src/analysts/github-actions/corrections/autofix-engine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,EAAE,8BAA8B,EAAE,GAAG,WAAW,EAAE,CAAC;AAMzD,MAAM,OAAO,aAAa;IAOjB,YAAY,CAAC,OAAe,EAAE,MAAsC;QACzE,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QACpD,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAGnC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,OAAO,CAAC;QACjB,CAAC;QAGD,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,GAAG,CAAC,GAAG,CAAC,CAAC;YACX,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAMM,aAAa,CAAC,QAA0B;QAC7C,OAAO,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,SAAS,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,QAAmC,CAAC,CAAC;IAChJ,CAAC;CACF;AACD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { getMessages } from '@core/messages';\nimport type { DeteccaoCustom } from '@types';\nimport type { Document } from 'yaml';\nimport { parseDocument } from 'yaml';\n\nconst { AnalistaGithubActionsMensagens } = getMessages();\n\n/**\n * Motor de Auto-fix para GitHub Actions\n * Utiliza a biblioteca 'yaml' para mutar o documento preservando a formatação.\n */\nexport class AutofixEngine {\n /**\n * Aplica uma lista de mutadores a um conteúdo YAML\n * @param content O conteúdo original do arquivo YAML\n * @param fixers Lista de funções de correção que operam na AST (Document)\n * @returns O conteúdo corrigido\n */\n public aplicarFixes(content: string, fixers: Array<(doc: Document) => void>): string {\n if (!content || fixers.length === 0) return content;\n const doc = parseDocument(content);\n\n // Se o documento tiver erros de parse, não aplicamos correções para evitar corromper\n if (doc.errors.length > 0) {\n return content;\n }\n\n // Executa cada mutador na AST\n for (const fix of fixers) {\n try {\n fix(doc);\n } catch (err) {\n console.error(AnalistaGithubActionsMensagens.erroAplicarCorrecao(err));\n }\n }\n return doc.toString();\n }\n\n /**\n * Converte o método corrigir de DeteccaoCustom para um formato compatível com o motor\n * @param detecoes Lista de detecções que possuem método corrigir\n */\n public extrairFixers(detecoes: DeteccaoCustom[]): Array<(doc: Document) => void> {\n return detecoes.filter(diretorio => typeof diretorio.corrigir === 'function').map(diretorio => diretorio.corrigir as (doc: Document) => void);\n }\n}\nexport const autofixEngine = new AutofixEngine();"]}
@@ -1 +1 @@
1
- {"version":3,"file":"correction-workflow.d.ts","sourceRoot":"","sources":["../../../../src/analysts/github-actions/corrections/correction-workflow.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,GAAG,CAAC;AAG9C,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAmC7F;AACD,eAAO,MAAM,kBAAkB,EAAE,QAsBhC,CAAC"}
1
+ {"version":3,"file":"correction-workflow.d.ts","sourceRoot":"","sources":["../../../../src/analysts/github-actions/corrections/correction-workflow.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,GAAG,CAAC;AAG9C,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAmC7F;AACD,eAAO,MAAM,kBAAkB,EAAE,QAsBhC,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { messages } from '../../../core/messages/index.js';
1
2
  import { splitLines } from '../../../shared/helpers/index.js';
2
3
  import { criarOcorrencia } from '../../../types/index.js';
3
4
  export function detectarCorrecoesWorkflow(src, _relPath) {
@@ -48,7 +49,7 @@ export const correctionWorkflow = {
48
49
  return correcoes.map(elem => criarOcorrencia({
49
50
  tipo: `correction-${elem.tipo}`,
50
51
  nivel: elem.confianca > 85 ? 'aviso' : 'info',
51
- mensagem: `Correção sugerida: ${elem.tipo}`,
52
+ mensagem: messages.SharedCommonMensagens.correcaoSugerida(elem.tipo),
52
53
  relPath,
53
54
  linha: elem.linha,
54
55
  sugestao: ` ${elem.original}\n ${elem.sugerido}\nConfiança: ${elem.confianca}%`,