@mocoto/mahoraga 0.14.1 → 0.14.2

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 (268) hide show
  1. package/dist/analysts/architects/analyst-structure.js +1 -1
  2. package/dist/analysts/architects/archetypes-custom.js +8 -13
  3. package/dist/analysts/architects/detector-archetypes.js +39 -35
  4. package/dist/analysts/architects/orchestrator-archetypes.js +3 -3
  5. package/dist/analysts/architects/signals-project-advanced.js +2 -2
  6. package/dist/analysts/architects/signals-project.js +1 -1
  7. package/dist/analysts/azure-pipelines/analysts/analyst-azure.js +20 -21
  8. package/dist/analysts/azure-pipelines/detectors/detector-azure-structure.js +0 -3
  9. package/dist/analysts/circleci/analysts/analyst-circleci.js +22 -24
  10. package/dist/analysts/circleci/detectors/detector-circleci-structure.js +4 -7
  11. package/dist/analysts/converters/convert-registry.js +1 -1
  12. package/dist/analysts/converters/index.js +1 -1
  13. package/dist/analysts/corrections/auto-fix-engine.js +1 -1
  14. package/dist/analysts/corrections/corrector-structure.js +8 -7
  15. package/dist/analysts/corrections/map-reversion.js +2 -2
  16. package/dist/analysts/corrections/reorganize-barrels.js +3 -3
  17. package/dist/analysts/corrections/rewrite-testes-aliases.js +23 -22
  18. package/dist/analysts/corrections/type-safety/type-analyzer.js +3 -3
  19. package/dist/analysts/corrections/type-safety/type-validator.js +2 -2
  20. package/dist/analysts/corrections/type-safety/usage-analyzer.js +3 -3
  21. package/dist/analysts/css/analysts/analyst-css.js +27 -28
  22. package/dist/analysts/css-in-js/detectors/detector-css-in-js-best-practices.js +8 -15
  23. package/dist/analysts/detectors/detector-architecture.js +2 -2
  24. package/dist/analysts/detectors/detector-bugs-ml.js +8 -8
  25. package/dist/analysts/detectors/detector-code-fragile.js +11 -10
  26. package/dist/analysts/detectors/detector-dependencies.js +5 -5
  27. package/dist/analysts/detectors/detector-duplications.js +5 -8
  28. package/dist/analysts/detectors/detector-monorepo.js +10 -9
  29. package/dist/analysts/detectors/detector-performance.js +2 -1
  30. package/dist/analysts/detectors/detector-recommendation-architecture.js +1 -1
  31. package/dist/analysts/detectors/detector-security.js +1 -1
  32. package/dist/analysts/detectors/detector-structure.js +3 -3
  33. package/dist/analysts/github-actions/analysts/analyst-github-actions.js +5 -8
  34. package/dist/analysts/github-actions/detectors/detector-workflow-accessibility.js +1 -9
  35. package/dist/analysts/github-actions/detectors/detector-workflow-structure.js +1 -4
  36. package/dist/analysts/github-actions/detectors/detector-workflow-trigger-unsafe.js +6 -5
  37. package/dist/analysts/gitlab-ci/analysts/analyst-gitlab-ci.js +2 -2
  38. package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-structure.js +0 -3
  39. package/dist/analysts/go/analysts/analyst-best-practices.js +2 -2
  40. package/dist/analysts/go/analysts/analyst-concurrency.js +1 -1
  41. package/dist/analysts/go/analysts/analyst-security.js +1 -1
  42. package/dist/analysts/go/detectors/detector-conventions.js +1 -1
  43. package/dist/analysts/html/analysts/analyst-html.js +10 -12
  44. package/dist/analysts/html/detectors/detector-html.js +3 -3
  45. package/dist/analysts/js-ts/analysts/analyst-commands-cli.js +22 -22
  46. package/dist/analysts/js-ts/analysts/analyst-functions-long.js +5 -5
  47. package/dist/analysts/js-ts/analysts/analyst-patterns-usage.js +6 -2
  48. package/dist/analysts/js-ts/detectors/detector-anti-patterns-async.js +81 -9
  49. package/dist/analysts/js-ts/detectors/detector-constructions-syntactic.js +35 -6
  50. package/dist/analysts/js-ts/detectors/detector-context-smart.js +6 -6
  51. package/dist/analysts/js-ts/detectors/detector-leaks-memory.js +1 -1
  52. package/dist/analysts/js-ts/detectors/detector-types-unsafe.js +33 -2
  53. package/dist/analysts/php/analysts/analyst-php.js +3 -3
  54. package/dist/analysts/php/detectors/detector-php-best-practices.js +5 -5
  55. package/dist/analysts/php/detectors/detector-php-security.js +5 -5
  56. package/dist/analysts/php/scorers/scorer-php.js +2 -2
  57. package/dist/analysts/plugins/detector-documentation.js +5 -6
  58. package/dist/analysts/plugins/detector-markdown.js +7 -7
  59. package/dist/analysts/python/analysts/analyst-python.js +2 -5
  60. package/dist/analysts/react/analysts/analyst-react-hooks.js +63 -8
  61. package/dist/analysts/react/analysts/analyst-react.js +45 -1
  62. package/dist/analysts/react/corrections/correction-react.js +40 -0
  63. package/dist/analysts/react/detectors/detector-react-best-practices.js +4 -4
  64. package/dist/analysts/react/scorers/scorer-react.js +36 -1
  65. package/dist/analysts/rust/analysts/analyst-best-practices.js +42 -3
  66. package/dist/analysts/rust/analysts/analyst-memory.js +2 -2
  67. package/dist/analysts/rust/analysts/analyst-rust.js +52 -5
  68. package/dist/analysts/rust/analysts/analyst-security.js +29 -1
  69. package/dist/analysts/scorers/scorer.js +5 -5
  70. package/dist/analysts/shell/analysts/analyst-shell.js +81 -5
  71. package/dist/analysts/shell/corrections/correction-shell.js +34 -1
  72. package/dist/analysts/shell/detectors/detector-shell-security.js +88 -0
  73. package/dist/analysts/shell/scorers/scorer-shell.js +58 -1
  74. package/dist/analysts/strategists/operator-structure.js +5 -7
  75. package/dist/analysts/strategists/suggestions-contextuais.js +5 -2
  76. package/dist/analysts/svg/analysts/analyst-svg.js +1 -0
  77. package/dist/analysts/tailwind/analysts/analyst-tailwind.js +79 -55
  78. package/dist/analysts/tailwind/corrections/correction-tailwind.js +116 -9
  79. package/dist/analysts/tailwind/detectors/detector-tailwind-best-practices.js +122 -7
  80. package/dist/analysts/tailwind/scorers/scorer-tailwind.js +62 -10
  81. package/dist/analysts/xml/analysts/analyst-xml.js +2 -2
  82. package/dist/app/index.js +1 -0
  83. package/dist/bin/cli-bootstrap.js +6 -4
  84. package/dist/bin/index.js +6 -4
  85. package/dist/caretakers/scoring.js +1 -0
  86. package/dist/cli/commands/command-analysts.js +1 -1
  87. package/dist/cli/commands/command-azure.js +1 -1
  88. package/dist/cli/commands/command-circleci.js +1 -1
  89. package/dist/cli/commands/command-compliance.js +1 -1
  90. package/dist/cli/commands/command-diagnose.js +10 -13
  91. package/dist/cli/commands/command-fix-types.js +9 -32
  92. package/dist/cli/commands/command-formatters.js +2 -2
  93. package/dist/cli/commands/command-gitlab-ci.js +1 -1
  94. package/dist/cli/commands/command-guardian.js +1 -1
  95. package/dist/cli/commands/command-imports.js +6 -6
  96. package/dist/cli/commands/command-jenkins.js +1 -1
  97. package/dist/cli/commands/command-licenses.js +1 -1
  98. package/dist/cli/commands/command-marketplace.js +3 -3
  99. package/dist/cli/commands/command-names.js +3 -8
  100. package/dist/cli/commands/command-perf.js +7 -9
  101. package/dist/cli/commands/command-plugins.js +4 -4
  102. package/dist/cli/diagnostic/auto-fix.js +2 -2
  103. package/dist/cli/diagnostic/exporters/json-exporter.js +1 -1
  104. package/dist/cli/diagnostic/exporters/sharded-exporter.js +0 -3
  105. package/dist/cli/diagnostic/exporters/svg-optimization-exporter.js +1 -1
  106. package/dist/cli/diagnostic/handlers/archetype-handler.js +3 -6
  107. package/dist/cli/diagnostic/handlers/auto-fix-handler.js +4 -4
  108. package/dist/cli/diagnostic/handlers/guardian-handler.js +1 -1
  109. package/dist/cli/diagnostic/processing-diagnostic.js +31 -35
  110. package/dist/cli/diagnostic/processing-helpers.js +2 -2
  111. package/dist/cli/handlers/fix-types-exporter.js +1 -4
  112. package/dist/cli/helpers/display-frame.js +5 -5
  113. package/dist/core/config/auto/auto-fix-config.js +0 -6
  114. package/dist/core/config/chalk-safe.js +2 -2
  115. package/dist/core/config/config.js +6 -8
  116. package/dist/core/config/conventions.js +1 -1
  117. package/dist/core/config/security.js +2 -2
  118. package/dist/core/execution/analysis-cache.js +5 -8
  119. package/dist/core/execution/executor.js +8 -19
  120. package/dist/core/execution/inquisitor.js +24 -21
  121. package/dist/core/execution/results.js +1 -0
  122. package/dist/core/execution/scanner.js +3 -3
  123. package/dist/core/messages/en/analysts/analyst-github-actions-messages.js +1 -1
  124. package/dist/core/messages/en/analysts/analyst-patterns-usage-messages.js +1 -0
  125. package/dist/core/messages/en/analysts/analyst-shell-messages.js +15 -0
  126. package/dist/core/messages/en/analysts/detector-constructions-syntactic-messages.js +6 -0
  127. package/dist/core/messages/en/analysts/detector-js-ts-messages.js +27 -0
  128. package/dist/core/messages/en/analysts/detector-react-messages.js +8 -0
  129. package/dist/core/messages/en/analysts/detector-shell-messages.js +17 -0
  130. package/dist/core/messages/en/analysts/detector-tailwind-messages.js +3 -3
  131. package/dist/core/messages/en/core/plugin-messages.js +31 -3
  132. package/dist/core/messages/en/log/log.js +4 -4
  133. package/dist/core/messages/en/ui/filter-config.js +1 -5
  134. package/dist/core/messages/i18n-system.js +3 -3
  135. package/dist/core/messages/index.js +3 -3
  136. package/dist/core/messages/ja/analysts/analyst-github-actions-messages.js +1 -1
  137. package/dist/core/messages/ja/analysts/analyst-patterns-usage-messages.js +1 -0
  138. package/dist/core/messages/ja/analysts/analyst-shell-messages.js +15 -0
  139. package/dist/core/messages/ja/analysts/detector-constructions-syntactic-messages.js +6 -0
  140. package/dist/core/messages/ja/analysts/detector-js-ts-messages.js +27 -0
  141. package/dist/core/messages/ja/analysts/detector-react-messages.js +8 -0
  142. package/dist/core/messages/ja/analysts/detector-shell-messages.js +17 -0
  143. package/dist/core/messages/ja/analysts/detector-tailwind-messages.js +3 -3
  144. package/dist/core/messages/ja/core/plugin-messages.js +31 -3
  145. package/dist/core/messages/ja/log/log.js +4 -4
  146. package/dist/core/messages/ja/ui/filter-config.js +1 -1
  147. package/dist/core/messages/pt/analysts/analyst-github-actions-messages.js +1 -1
  148. package/dist/core/messages/pt/analysts/analyst-patterns-usage-messages.js +1 -0
  149. package/dist/core/messages/pt/analysts/analyst-shell-messages.js +15 -0
  150. package/dist/core/messages/pt/analysts/detector-constructions-syntactic-messages.js +6 -0
  151. package/dist/core/messages/pt/analysts/detector-js-ts-messages.js +27 -0
  152. package/dist/core/messages/pt/analysts/detector-react-messages.js +8 -0
  153. package/dist/core/messages/pt/analysts/detector-shell-messages.js +17 -0
  154. package/dist/core/messages/pt/analysts/detector-tailwind-messages.js +3 -3
  155. package/dist/core/messages/pt/core/plugin-messages.js +31 -3
  156. package/dist/core/messages/pt/log/log-engine.js +6 -6
  157. package/dist/core/messages/pt/log/log.js +3 -3
  158. package/dist/core/messages/pt/ui/filter-config.js +1 -1
  159. package/dist/core/messages/shared/icons.js +3 -3
  160. package/dist/core/messages/zh/analysts/analyst-github-actions-messages.js +1 -1
  161. package/dist/core/messages/zh/analysts/analyst-patterns-usage-messages.js +1 -0
  162. package/dist/core/messages/zh/analysts/analyst-shell-messages.js +15 -0
  163. package/dist/core/messages/zh/analysts/detector-constructions-syntactic-messages.js +6 -0
  164. package/dist/core/messages/zh/analysts/detector-js-ts-messages.js +27 -0
  165. package/dist/core/messages/zh/analysts/detector-react-messages.js +8 -0
  166. package/dist/core/messages/zh/analysts/detector-shell-messages.js +17 -0
  167. package/dist/core/messages/zh/analysts/detector-tailwind-messages.js +3 -3
  168. package/dist/core/messages/zh/core/plugin-messages.js +31 -3
  169. package/dist/core/messages/zh/log/log.js +3 -3
  170. package/dist/core/messages/zh/ui/filter-config.js +1 -5
  171. package/dist/core/parsing/filters.js +3 -3
  172. package/dist/core/parsing/langs/json.js +1 -1
  173. package/dist/core/parsing/langs/python.js +1 -1
  174. package/dist/core/parsing/langs/typescript.js +1 -1
  175. package/dist/core/parsing/parser.js +2 -2
  176. package/dist/core/registry/file-registry.js +3 -2
  177. package/dist/core/registry/paths.js +3 -3
  178. package/dist/core/reporting/default-reporter.js +2 -2
  179. package/dist/core/schema/version.js +6 -6
  180. package/dist/core/workers/worker-executor.js +3 -3
  181. package/dist/core/workers/worker-pool.js +0 -0
  182. package/dist/guardian/baseline.js +1 -1
  183. package/dist/guardian/gpg.js +3 -1
  184. package/dist/guardian/integrity.js +2 -7
  185. package/dist/guardian/records.js +6 -1
  186. package/dist/guardian/result.js +1 -1
  187. package/dist/guardian/sentinel.js +6 -1
  188. package/dist/guardian/watcher-hidden.js +5 -1
  189. package/dist/licenses/fs-utils.js +4 -1
  190. package/dist/licenses/generate-notices.js +1 -1
  191. package/dist/licenses/header-options.js +0 -1
  192. package/dist/licenses/index.js +1 -0
  193. package/dist/licenses/normalizer.js +10 -9
  194. package/dist/node.loader.js +224 -4
  195. package/dist/reports/analise-async-patterns.js +1 -1
  196. package/dist/reports/filter-smart.js +2 -5
  197. package/dist/reports/generator-report.js +4 -4
  198. package/dist/reports/report-archetypes.js +10 -10
  199. package/dist/reports/report-caretaker-health.js +2 -1
  200. package/dist/sdk/analyzer.js +1 -1
  201. package/dist/shared/data-processing/fragment-report.js +10 -10
  202. package/dist/shared/data-processing/json.js +1 -1
  203. package/dist/shared/data-processing/occurrences.js +3 -2
  204. package/dist/shared/formatters/code-min-formatter.js +1 -1
  205. package/dist/shared/formatters/engines/prettier.js +1 -1
  206. package/dist/shared/formatters/engines/stylelint.js +6 -9
  207. package/dist/shared/formatters/formatter.js +8 -8
  208. package/dist/shared/formatters/formatters/code.js +3 -3
  209. package/dist/shared/formatters/formatters/css.js +2 -10
  210. package/dist/shared/formatters/formatters/dotfiles.js +1 -1
  211. package/dist/shared/formatters/formatters/html.js +1 -5
  212. package/dist/shared/formatters/formatters/json.js +0 -3
  213. package/dist/shared/formatters/formatters/markdown.js +18 -23
  214. package/dist/shared/formatters/formatters/properties.js +2 -2
  215. package/dist/shared/formatters/formatters/shell.js +1 -4
  216. package/dist/shared/formatters/formatters/sql.js +0 -3
  217. package/dist/shared/formatters/formatters/xml.js +5 -7
  218. package/dist/shared/formatters/formatters/yaml.js +2 -7
  219. package/dist/shared/formatters/index.js +1 -1
  220. package/dist/shared/helpers/framework-detector.js +1 -1
  221. package/dist/shared/helpers/json.js +1 -1
  222. package/dist/shared/helpers/magic-constants-whitelist.js +1 -1
  223. package/dist/shared/helpers/masking.js +17 -17
  224. package/dist/shared/helpers/reader-report.js +0 -12
  225. package/dist/shared/helpers/structural-hash.js +3 -2
  226. package/dist/shared/helpers/structure.js +1 -1
  227. package/dist/shared/marketplace/registry.js +1 -1
  228. package/dist/shared/marketplace/remote.js +4 -4
  229. package/dist/shared/persistence/persistence.js +0 -1
  230. package/dist/shared/plugins/core-plugin.js +3 -1
  231. package/dist/shared/plugins/registry.js +3 -2
  232. package/dist/types/caretakers/imports-barrel.js +1 -0
  233. package/dist/types/caretakers/index.js +4 -0
  234. package/dist/types/caretakers/map-reversion.js +1 -0
  235. package/dist/types/caretakers/pruning.js +1 -0
  236. package/dist/types/caretakers/scoring.js +1 -0
  237. package/dist/types/common/analysts.js +1 -1
  238. package/dist/types/core/config/filters.js +1 -0
  239. package/dist/types/core/config/index.js +2 -0
  240. package/dist/types/core/execution/ambiente.js +1 -0
  241. package/dist/types/core/execution/linguagens.js +1 -0
  242. package/dist/types/core/execution/parse-errors.js +1 -0
  243. package/dist/types/core/execution/results.js +1 -0
  244. package/dist/types/core/execution/structure-json.js +1 -0
  245. package/dist/types/core/index.js +1 -0
  246. package/dist/types/core/messages/index.js +1 -0
  247. package/dist/types/core/messages/log.js +1 -0
  248. package/dist/types/core/parsing/babel-narrow.js +1 -0
  249. package/dist/types/core/parsing/index.js +1 -0
  250. package/dist/types/core/runtime.js +1 -0
  251. package/dist/types/guardian/index.js +2 -0
  252. package/dist/types/guardian/integrity.js +7 -0
  253. package/dist/types/guardian/snapshot.js +1 -0
  254. package/dist/types/index.js +4 -4
  255. package/dist/types/licenses/index.js +2 -0
  256. package/dist/types/processing/display.js +16 -13
  257. package/dist/types/processing/filters.js +3 -7
  258. package/dist/types/reports/compliance.js +1 -0
  259. package/dist/types/reports/streaming.js +1 -0
  260. package/dist/types/scripts/index.js +1 -0
  261. package/dist/types/scripts/migrar-aliases.js +1 -0
  262. package/dist/types/sdk/index.js +1 -0
  263. package/dist/types/shared/index.js +2 -0
  264. package/dist/types/vulnerabilities/index.js +2 -0
  265. package/dist/vulnerabilities/npm-audit.js +0 -1
  266. package/dist/vulnerabilities/scanner.js +2 -1
  267. package/dist/vulnerabilities/vulnerabilities.js +0 -1
  268. package/package.json +11 -12
@@ -54,4 +54,31 @@ export const DetectorJsTsMensagens = {
54
54
  observerWithoutDisconnect: 'disconnect()のないObserver(MutationObserver/IntersectionObserver)。メモリリークの原因になります。',
55
55
  webSocketWithoutClose: '対応するclose()呼び出しのないWebSocket。接続が開いたままになる可能性があります。',
56
56
  workerWithoutTerminate: 'terminate()呼び出しのないWorker。ワーカーがバックグラウンドで実行され続けます。',
57
+ // ES2025+ features
58
+ satisfiesAvailable: '型はより安全なナローイングのために"satisfies"を"as"の代わりに使用できます',
59
+ satisfiesAvailableSugestao: '"as Type" を "satisfies Type" に置き換えて、ワイドニングせずに検証してください',
60
+ usingResourceManagement: '"using" による明示的リソース管理が検出されました (ES2026)',
61
+ usingResourceManagementSugestao: 'リソースがSymbol.disposeまたはSymbol.asyncDisposeを実装していることを確認してください',
62
+ temporalApi: 'Temporal API の使用が検出されました (ES2026)',
63
+ temporalApiSugestao: 'TemporalはDateを置き換えます — Temporal.Now, Temporal.PlainDate等を使用してください',
64
+ iteratorHelper: 'イテレータヘルパーメソッドが検出されました (ES2025)',
65
+ iteratorHelperSugestao: 'Iteratorヘルパー(.map(), .filter(), .take())は遅延評価を可能にします',
66
+ setMethods: '新しいSetメソッドが検出されました (ES2025)',
67
+ setMethodsSugestao: '集合演算にはSet.prototype.union(), .intersection(), .difference()を使用してください',
68
+ topLevelAwait: 'トップレベルawaitが検出されました',
69
+ topLevelAwaitSugestao: 'トップレベルawaitが不必要にインポートをブロックしないか確認してください',
70
+ promiseWithResolvers: 'Promise.withResolvers() が検出されました (ES2025)',
71
+ promiseWithResolversSugestao: '可能な場合はPromise.withResolvers()よりもasync/awaitを推奨します',
72
+ promiseAllSettled: 'Promise.allSettled() が検出されました — all-settledパターンに適しています',
73
+ promiseAllSettledSugestao: 'すべてのプロミスの結果(拒否に関わらず)が必要な場合はPromise.allSettled()を使用してください',
74
+ forAwaitOf: 'for await...of が検出されました — 非同期反復',
75
+ forAwaitOfSugestao: '非同期反復可能が正しくSymbol.asyncIteratorを実装していることを確認してください',
76
+ regexpEscape: 'RegExp.escape() が検出されました (ES2025)',
77
+ regexpEscapeSugestao: '正規表現パターンでユーザー入力を安全にエスケープするにはRegExp.escape()を使用してください',
78
+ errorIsError: 'Error.isError() が検出されました (ES2026)',
79
+ errorIsErrorSugestao: '信頼性のあるエラー型チェックにはError.isError()を使用してください',
80
+ arrayFromAsync: 'Array.fromAsync() が検出されました (ES2026)',
81
+ arrayFromAsyncSugestao: '非同期反復可能から配列を作成するにはArray.fromAsync()を使用してください',
82
+ mapGetOrInsert: 'Map.getOrInsert() / .getOrInsertComputed() が検出されました (ES2026)',
83
+ mapGetOrInsertSugestao: 'アトミックなMap upsert操作にはgetOrInsert()を使用してください',
57
84
  };
@@ -57,4 +57,12 @@ export const DetectorReactMensagens = {
57
57
  contextTooBroadSugestao: 'より小さなコンテキストに分割してください',
58
58
  liftingStateTooHigh: '必要なレベルよりも多くのレベルに状態が引き上げられています',
59
59
  liftingStateTooHighSugestao: 'コンテキストまたはローカル状態を検討してください',
60
+ react19ForwardRef: 'forwardRef は React 19 で非推奨',
61
+ react19ForwardRefSugestao: '通常のプロップとして ref を渡してください',
62
+ react19FC: 'React.FC は React 19 で非推奨',
63
+ react19FCSugestao: 'React.FC を使わずに直接 props を型指定してください',
64
+ react19UseClient: '\'use client\' ディレクティブがありません (React 19)',
65
+ react19UseClientSugestao: 'クライアントコンポーネントにはファイル先頭に \'use client\' を追加してください',
66
+ react19DefaultProps: 'defaultProps は React 19 で非推奨',
67
+ react19DefaultPropsSugestao: '代わりにデフォルトパラメータ値を使用してください',
60
68
  };
@@ -60,4 +60,21 @@ export const DetectorShellMensagens = {
60
60
  loopOverCommandOutputSugestao: 'ls の解析の代わりにグロブパターンを使用してください',
61
61
  pipeOverTempfile: 'パイプラインが一時ファイルを置き換えられる可能性があります',
62
62
  pipeOverTempfileSugestao: '一時ファイルの代わりにパイプを使用してください',
63
+ // Modern Bash (2026)
64
+ missingSetU: '"set -u" がありません — 未設定の変数は静かに空に展開されます',
65
+ missingSetUSugestao: '変数名のタイポをキャッチするために "set -u" を追加してください',
66
+ missingIso: 'IFS=$\'\\n\\t\' がありません — ワードスプリッティングが予期しない動作を引き起こす可能性があります',
67
+ missingIsoSugestao: '安全なワードスプリッティングのためにスクリプト先頭に IFS=$\'\\n\\t\' を追加してください',
68
+ missingTrap: 'trap ハンドラが見つかりません — シグナル時にクリーンアップがスキップされる可能性があります',
69
+ missingTrapSugestao: 'trap ハンドラを追加: trap "cleanup" EXIT INT TERM',
70
+ missingMainFn: 'スクリプトに main 関数パターンがありません',
71
+ missingMainFnSugestao: 'ロジックを main() でラップし、最後に main "$@" を呼び出してください',
72
+ missingCommandV: 'command -v の代わりにハードコードされたパス',
73
+ missingCommandVSugestao: '可用性を確認するには "command -v <ツール>" を使用してください',
74
+ missingDebugMode: 'スクリプトにデバッグモードがありません — トラブルシューティングが困難です',
75
+ missingDebugModeSugestao: 'デバッグトレースのために [[ "${DEBUG:-}" == "true" ]] && set -x を追加してください',
76
+ missingInputValidation: 'コマンド引数が検証されていません — 予期しない入力がエラーの原因になる可能性があります',
77
+ missingInputValidationSugestao: '先頭で引数を検証: [[ -z "$1" ]] && { echo "使用法: ..."; exit 1; }',
78
+ shellCheckRecommended: '包括的な分析のために ShellCheck の実行を検討してください',
79
+ shellCheckRecommendedSugestao: 'shellcheck をインストールして実行: shellcheck script.sh',
63
80
  };
@@ -5,13 +5,13 @@ export const DetectorTailwindMensagens = {
5
5
  repeatedClasses: (duplicates) => `重複したクラス: ${duplicates}`,
6
6
  repeatedClassesSugestao: '重複したクラスを削除してください',
7
7
  arbitraryValue: (val) => `任意の値が検出されました: ${val}`,
8
- arbitraryValueSugestao: 'tailwind.config.jsへの追加を検討してください',
8
+ arbitraryValueSugestao: 'CSSの@theme経由での追加を検討してください (Tailwind v4)',
9
9
  important: 'Tailwindクラスで!importantが検出されました',
10
10
  importantSugestao: '!importantを避けてください - 詳細度をリファクタリングしてください',
11
11
  arbitraryValueOveruse: '任意の値の過剰使用 - デザイントークンが不足している可能性があります',
12
- arbitraryValueOveruseSugestao: '任意の値の代わりにtailwind.config.jsでカスタムトークンを定義してください',
12
+ arbitraryValueOveruseSugestao: '任意の値の代わりにCSSの@themeでカスタムトークンを定義してください (Tailwind v4)',
13
13
  missingDesignToken: 'ハードコードされた値が検出されました - Tailwindデザイントークンを使用してください',
14
- missingDesignTokenSugestao: '色、スペーシング、サイズをtailwind.config.jsに抽出してください',
14
+ missingDesignTokenSugestao: '色、スペーシング、サイズをCSSの@themeに抽出してください (Tailwind v4)',
15
15
  responsiveWithoutBase: '対応するベースクラスなしのレスポンシブクラス',
16
16
  responsiveWithoutBaseSugestao: 'レスポンシブバリアントの前にベースクラスを追加してください',
17
17
  inlineStylesWithTailwind: 'Tailwindクラスと一緒にインラインスタイルが検出されました',
@@ -29,7 +29,16 @@ export const ReactMensagens = {
29
29
  export const ReactHooksMensagens = {
30
30
  useEffectNoDeps: 'useEffect に依存配列がありません(ループを避けるため依存関係を確認してください)。',
31
31
  memoCallbackNoDeps: 'フックに依存配列がありません(useMemo/useCallback)。',
32
- hookInConditional: '条件分岐内でフックが宣言されています(フックのルールに違反)。'
32
+ hookInConditional: '条件分岐内でフックが宣言されています(フックのルールに違反)。',
33
+ react19Use: 'use() フック検出 (React 19) — <Suspense> バウンダリでラップしてください。',
34
+ react19UseOptimistic: 'useOptimistic フック検出 (React 19) — 更新関数が必要です。',
35
+ react19UseActionState: 'useActionState フック検出 (React 19) — フォームアクション用。',
36
+ react19UseFormStatus: 'useFormStatus フック検出 (React 19) — フォームの pending 状態にアクセス。',
37
+ react19ForwardRefDeprecated: 'forwardRef は React 19 で非推奨 — 通常のプロップとして ref を渡してください。',
38
+ react19FCDeprecated: 'React.FC/FunctionComponent は React 19 で非推奨 — プロップを直接型指定してください。',
39
+ react19DefaultPropsDeprecated: 'defaultProps は React 19 で非推奨 — デフォルトパラメータを使用してください。',
40
+ react19UseClient: 'ファイルが \'use client\' ディレクティブなしでクライアント機能を使用 (React 19)。',
41
+ react19FormAction: 'action プロップ付きフォーム検出 (React 19)。'
33
42
  };
34
43
  // ─── TAILWINDメッセージ ────────────────────────────────────────────
35
44
  export const TailwindMensagens = {
@@ -38,7 +47,13 @@ export const TailwindMensagens = {
38
47
  importantUsage: (token) => `!(important)の使用が検出されました(${token})。important の代わりにユーティリティクラスまたはスコープの強化を優先してください。`,
39
48
  variantConflict: (prop, variants) => `${prop} のバリアント競合の可能性あり(バリアント: ${variants.slice(0, 6).join(', ')})。順序/スコープを確認してください。`,
40
49
  dangerousArbitraryValue: (token) => `潜在的に危険な url を含む任意の値(${token})。javascript:/data:text/html は避けてください。`,
41
- arbitraryValue: (token) => `任意の値を含むクラス(${token})。デザインと一致しているか確認してください。`
50
+ arbitraryValue: (token) => `任意の値を含むクラス(${token})。デザインと一致しているか確認してください。`,
51
+ v3DeprecatedUtility: (token, replacement) => `v3の非推奨ユーティリティ "${token}" → "${replacement}"を使用してください (Tailwind v4).`,
52
+ v3Directive: `@tailwindディレクティブが検出されました (v3) → @import "tailwindcss"を使用してください (Tailwind v4).`,
53
+ v3LayerUtilities: `@layer utilitiesが検出されました (v3) → @utilityを使用してください (Tailwind v4).`,
54
+ themeFunction: `theme()関数が検出されました (非推奨 v3) → CSS変数 (var(--color-*))を優先してください.`,
55
+ v3ImportantPrefix: (token) => `"${token}" 内の!importantプレフィックス (v3) → !を末尾に移動 ("${token.replace('!', '')}!").`,
56
+ v3ArbitraryVar: `角括弧内の変数 (v3) → 括弧を使用 (例: bg-[--var]の代わりにbg-(--var)).`
42
57
  };
43
58
  // ─── CSSメッセージ ─────────────────────────────────────────────────
44
59
  export const CssMensagens = {
@@ -270,7 +285,20 @@ export const RustMensagens = {
270
285
  missingDoc: (fnName) => `公開関数 '${fnName}' にドキュメンテーションコメント (///) がありません。`,
271
286
  namingConvention: (constName) => `定数 '${constName}' は SCREAMING_CASE 規約に従うべきです。`,
272
287
  redundantReturn: '関数末尾の return は冗長です。Rust は暗黙の戻り値 (最後の式) を使用します。',
273
- wildcardImport: (importPath) => `ワイルドカードインポート '${importPath}' は名前空間を汚染する可能性があります。明示的なインポートを推奨します。`
288
+ wildcardImport: (importPath) => `ワイルドカードインポート '${importPath}' は名前空間を汚染する可能性があります。明示的なインポートを推奨します。`,
289
+ lazyLockSuggestion: 'once_cell::sync::Lazy を検出 — std::sync::LazyLock を使用 (Rust 1.80+)。',
290
+ onceLockSuggestion: 'once_cell::sync::OnceCell を検出 — std::sync::OnceLock を使用 (Rust 1.70+)。',
291
+ offsetOfSuggestion: 'フィールドアクセスの手動ポインタオフセット — std::mem::offset_of! を使用 (Rust 1.77+)。',
292
+ letChainsPattern: 'let_chains パターン検出 (Rust 1.78 で安定化)。',
293
+ assertMatchesSuggestion: 'assert!(matches!(...)) パターン — assert_matches!(...) を検討 (nightly)。',
294
+ isSomeAnd: '.is_some() && 述語パターン — .is_some_and(|x| ...) を使用 (Rust 1.70+)。',
295
+ isOkAnd: '.is_ok() && 述語パターン — .is_ok_and(|x| ...) を使用 (Rust 1.70+)。',
296
+ inspectMethod: '副作用のある map() — .inspect() を使用 (Rust 1.76+)。',
297
+ implicitFormatCapture: 'format!("...{var}...") は暗黙的キャプチャが可能 (Rust 1.80+)。',
298
+ pointerCast: 'ポインタキャストに `as` を使用 — .cast() を使用 (Rust 1.72+)。',
299
+ splitOnce: 'インデックスアクセス付き splitn(2, ...) — .split_once() を使用 (Rust 1.62+)。',
300
+ okErrAntipattern: '.ok()?.unwrap() アンチパターン — Result に直接 ? を使用。',
301
+ collectOverPush: 'ループ内で push() によるコレクション構築 — .map().collect() を使用。'
274
302
  };
275
303
  // ─── JAVA / KOTLINメッセージ ───────────────────────────────────────
276
304
  export const JavaMensagens = {
@@ -140,9 +140,9 @@ export function formatarLinha({ nivel, mensagem, sanitize = true }) {
140
140
  if (!process.env.VITEST && process.env.SUKUNA_CENTER === '1') {
141
141
  try {
142
142
  const cols = obterColunasTerm();
143
- const out = process.stdout && typeof process.stdout.isTTY !== 'undefined' ? process.stdout : undefined;
143
+ const out = typeof process.stdout.isTTY !== 'undefined' ? process.stdout : undefined;
144
144
  const isTty = !!out && out.isTTY;
145
- if (isTty && cols && cols > 0) {
145
+ if (isTty && typeof cols === 'number' && cols > 0) {
146
146
  const ANSI_REGEX = /[\u001B\u009B][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
147
147
  const visLen = (string) => (string || '').replace(ANSI_REGEX, '').length;
148
148
  const pad = Math.floor(Math.max(0, cols - visLen(linha)) / 2);
@@ -164,7 +164,7 @@ export function formatarLinha({ nivel, mensagem, sanitize = true }) {
164
164
  function obterColunasTerm() {
165
165
  // Tries to get terminal width safely
166
166
  try {
167
- const out = process.stdout && typeof process.stdout.columns !== 'undefined' ? process.stdout : undefined;
167
+ const out = typeof process.stdout.columns !== 'undefined' ? process.stdout : undefined;
168
168
  const cols = out?.columns;
169
169
  if (typeof cols === 'number' && cols > 0) {
170
170
  return cols;
@@ -414,7 +414,7 @@ export const log = {
414
414
  const visibleLen = (string) => string.replace(ANSI_REGEX, '').length;
415
415
  const frameWidth = Math.max(...lines.map(linha => visibleLen(linha)));
416
416
  const cols = obterColunasTerm() ?? 0;
417
- const outStream = process.stdout && typeof process.stdout.isTTY !== 'undefined' ? process.stdout : undefined;
417
+ const outStream = typeof process.stdout.isTTY !== 'undefined' ? process.stdout : undefined;
418
418
  const isTty = !!outStream && outStream.isTTY;
419
419
  if (isTty) {
420
420
  const pad = Math.floor(Math.max(0, cols - frameWidth) / 2);
@@ -221,7 +221,7 @@ export const AGRUPAMENTOS_MENSAGEM = [
221
221
  * 問題タイプの優先度を取得
222
222
  */
223
223
  export function getPrioridade(tipo) {
224
- return PRIORIDADES[tipo] || {
224
+ return PRIORIDADES[tipo] ?? {
225
225
  prioridade: 'baixa',
226
226
  icone: ICONES_ARQUIVO.arquivo,
227
227
  descricao: 'カテゴリ未分類の問題'
@@ -54,5 +54,5 @@ export const AnalistaGithubActionsMensagens = {
54
54
  pullRequestTargetGrantsWritePermissionsSugestao: 'Use pull_request ao invés de pull_request_target, ou valide cuidadosamente o branch de origem',
55
55
  workflowDispatchWithoutInputs: 'workflow_dispatch sem inputs definidos',
56
56
  workflowDispatchWithoutInputsSugestao: 'Defina inputs obrigatórios para controlar a execução manual do workflow',
57
- erroAplicarCorrecao: (erro) => `Erro ao aplicar correção: ${erro}`,
57
+ erroAplicarCorrecao: (erro) => `Erro ao aplicar correção: ${String(erro)}`,
58
58
  };
@@ -16,5 +16,6 @@ export const PadroesUsoMensagens = {
16
16
  nonArrowCallback: "Callback com 'function' onde arrow function seria mais adequada. Prefira () => {}.",
17
17
  consoleLog: "console.log detectado em código de produção. Remova ou substitua por logger apropriado.",
18
18
  uselessConditional: "Comparação desnecessária: if (x === true). Use apenas if (x).",
19
+ satisfiesUsage: "Palavra-chave 'satisfies' do TypeScript usada — garante type safety sem widening",
19
20
  erroAnalise: (relPath, erro) => `Falha ao analisar padrões de uso em ${relPath}: ${erro}`
20
21
  };
@@ -60,4 +60,19 @@ export const AnalistaShellMensagens = {
60
60
  loopOverCommandOutputSugestao: 'Use glob: "for f in *".',
61
61
  pipeOverTempfile: 'Pipeline poderia substituir arquivo temporário.',
62
62
  pipeOverTempfileSugestao: 'Use pipes em vez de arquivos temporários.',
63
+ // Modern Bash (2026)
64
+ missingSetU: 'Falta "set -u" — variáveis não definidas expandirão para vazio silenciosamente.',
65
+ missingSetUSugestao: 'Adicione "set -u" para capturar erros de digitação em nomes de variáveis.',
66
+ missingIso: 'Falta IFS=$\'\\n\\t\' — word splitting pode causar comportamento inesperado.',
67
+ missingIsoSugestao: 'Adicione IFS=$\'\\n\\t\' no início do script para word splitting seguro.',
68
+ missingTrap: 'Nenhum trap handler encontrado — limpeza pode ser ignorada em sinais.',
69
+ missingTrapSugestao: 'Adicione trap handler: trap "cleanup" EXIT INT TERM.',
70
+ missingMainFn: 'Script não possui padrão de função main.',
71
+ missingMainFnSugestao: 'Envolva a lógica em main() e chame main "$@" no final.',
72
+ missingCommandV: 'Caminho hardcoded em vez de usar command -v.',
73
+ missingCommandVSugestao: 'Use "command -v <ferramenta>" para verificar disponibilidade.',
74
+ missingDebugMode: 'Script não tem modo debug — troubleshooting é mais difícil.',
75
+ missingDebugModeSugestao: 'Adicione [[ "${DEBUG:-}" == "true" ]] && set -x para debug tracing.',
76
+ missingInputValidation: 'Argumentos de comando não validados — input inesperado pode causar erros.',
77
+ missingInputValidationSugestao: 'Valide argumentos no início: [[ -z "$1" ]] && { echo "Uso: ..."; exit 1; }.',
63
78
  };
@@ -12,4 +12,10 @@ export const DetectorConstrucoesSintaticasMensagens = {
12
12
  templateLiteralOveruse: "Template literal desnecessário para concatenação simples. Use operador '+'.",
13
13
  unnecessaryObjectSpread: "Spread de objeto desnecessário. Atribuição direta 'obj.prop = val' é mais eficiente.",
14
14
  getterSetterWithoutValidation: "Getter/setter sem validação no setter. Adicione validação para evitar dados inválidos.",
15
+ // ES2025/ES2026
16
+ explicitResourceManagement: "Gerenciamento Explícito de Recursos com 'using' detectado (ES2026)",
17
+ temporalApiUsage: "Uso da Temporal API detectado (ES2026) — alternativa moderna de data/hora ao Date",
18
+ iteratorHelperUsage: "Método auxiliar de iterador detectado (ES2025) — avaliação lazy em iteráveis",
19
+ setMethodUsage: "Novo método de Set detectado (ES2025) — use para operações de conjunto",
20
+ mapUpsertUsage: "Método upsert de Map detectado (ES2026) — .getOrInsert() / .getOrInsertComputed()",
15
21
  };
@@ -54,4 +54,31 @@ export const DetectorJsTsMensagens = {
54
54
  observerWithoutDisconnect: 'Observer (MutationObserver/IntersectionObserver) sem disconnect(). Isso causa vazamento de memória.',
55
55
  webSocketWithoutClose: 'WebSocket sem chamada close() correspondente. A conexão pode permanecer aberta.',
56
56
  workerWithoutTerminate: 'Worker sem chamada terminate(). O worker continuará executando em segundo plano.',
57
+ // ES2025+ features
58
+ satisfiesAvailable: 'Tipo pode usar "satisfies" no lugar de "as" para narrowing mais seguro',
59
+ satisfiesAvailableSugestao: 'Substitua "as Type" por "satisfies Type" para validar sem widen',
60
+ usingResourceManagement: 'Gerenciamento de Recursos com "using" detectado (ES2026)',
61
+ usingResourceManagementSugestao: 'Certifique-se que o recurso implementa Symbol.dispose ou Symbol.asyncDispose',
62
+ temporalApi: 'Uso da Temporal API detectado (ES2026)',
63
+ temporalApiSugestao: 'Temporal substitui Date — use Temporal.Now, Temporal.PlainDate, etc.',
64
+ iteratorHelper: 'Método helper de iterador detectado (ES2025)',
65
+ iteratorHelperSugestao: 'Iterator helpers (.map(), .filter(), .take()) permitem lazy evaluation',
66
+ setMethods: 'Novo método de Set detectado (ES2025)',
67
+ setMethodsSugestao: 'Use Set.prototype.union(), .intersection(), .difference() para operações',
68
+ topLevelAwait: 'Top-level await detectado',
69
+ topLevelAwaitSugestao: 'Verifique se o top-level await não bloqueia imports desnecessariamente',
70
+ promiseWithResolvers: 'Promise.withResolvers() detectado (ES2025)',
71
+ promiseWithResolversSugestao: 'Prefira async/await ao invés de Promise.withResolvers() quando possível',
72
+ promiseAllSettled: 'Promise.allSettled() detectado — bom para padrões all-settled',
73
+ promiseAllSettledSugestao: 'Use Promise.allSettled() quando precisar de resultados independente de rejeição',
74
+ forAwaitOf: 'for await...of detectado — iteração assíncrona',
75
+ forAwaitOfSugestao: 'Certifique-se que o iterável assíncrono implementa Symbol.asyncIterator corretamente',
76
+ regexpEscape: 'RegExp.escape() detectado (ES2025)',
77
+ regexpEscapeSugestao: 'Use RegExp.escape() para escapar input de usuário com segurança em regex',
78
+ errorIsError: 'Error.isError() detectado (ES2026)',
79
+ errorIsErrorSugestao: 'Use Error.isError() para verificação confiável de tipo Error',
80
+ arrayFromAsync: 'Array.fromAsync() detectado (ES2026)',
81
+ arrayFromAsyncSugestao: 'Use Array.fromAsync() para criar arrays a partir de iteráveis assíncronos',
82
+ mapGetOrInsert: 'Map.getOrInsert() / .getOrInsertComputed() detectado (ES2026)',
83
+ mapGetOrInsertSugestao: 'Use getOrInsert() para operações atômicas de upsert em Map',
57
84
  };
@@ -57,4 +57,12 @@ export const DetectorReactMensagens = {
57
57
  contextTooBroadSugestao: 'Divida em contextos menores',
58
58
  liftingStateTooHigh: 'Estado elevado mais níveis que o necessário',
59
59
  liftingStateTooHighSugestao: 'Considere context ou estado local',
60
+ react19ForwardRef: 'forwardRef é deprecated no React 19',
61
+ react19ForwardRefSugestao: 'Passe ref como uma prop direta',
62
+ react19FC: 'React.FC é deprecated no React 19',
63
+ react19FCSugestao: 'Tipe as props diretamente ao invés de usar React.FC',
64
+ react19UseClient: 'Diretiva \'use client\' ausente (React 19)',
65
+ react19UseClientSugestao: 'Adicione \'use client\' no topo do arquivo para componentes client',
66
+ react19DefaultProps: 'defaultProps é deprecated no React 19',
67
+ react19DefaultPropsSugestao: 'Use valores padrão de parâmetros',
60
68
  };
@@ -60,4 +60,21 @@ export const DetectorShellMensagens = {
60
60
  loopOverCommandOutputSugestao: 'Use padrões glob em vez de analisar ls',
61
61
  pipeOverTempfile: 'Pipeline poderia substituir arquivo temporário',
62
62
  pipeOverTempfileSugestao: 'Use pipes em vez de arquivos temporários',
63
+ // Modern Bash (2026)
64
+ missingSetU: 'Falta "set -u" — variáveis não definidas expandirão para vazio silenciosamente',
65
+ missingSetUSugestao: 'Adicione "set -u" para capturar erros de digitação em nomes de variáveis',
66
+ missingIso: 'Falta IFS=$\'\\n\\t\' — word splitting pode causar comportamento inesperado',
67
+ missingIsoSugestao: 'Adicione IFS=$\'\\n\\t\' no início do script para word splitting seguro',
68
+ missingTrap: 'Nenhum trap handler encontrado — limpeza pode ser ignorada em sinais',
69
+ missingTrapSugestao: 'Adicione trap handler: trap "cleanup" EXIT INT TERM',
70
+ missingMainFn: 'Script não possui padrão de função main',
71
+ missingMainFnSugestao: 'Envolva a lógica em main() e chame main "$@" no final',
72
+ missingCommandV: 'Caminho hardcoded em vez de usar command -v',
73
+ missingCommandVSugestao: 'Use "command -v <ferramenta>" para verificar disponibilidade',
74
+ missingDebugMode: 'Script não tem modo debug — troubleshooting é mais difícil',
75
+ missingDebugModeSugestao: 'Adicione [[ "${DEBUG:-}" == "true" ]] && set -x para debug tracing',
76
+ missingInputValidation: 'Argumentos de comando não validados — input inesperado pode causar erros',
77
+ missingInputValidationSugestao: 'Valide argumentos no início: [[ -z "$1" ]] && { echo "Uso: ..."; exit 1; }',
78
+ shellCheckRecommended: 'Considere rodar ShellCheck para análise abrangente',
79
+ shellCheckRecommendedSugestao: 'Instale shellcheck e execute: shellcheck script.sh',
63
80
  };
@@ -5,13 +5,13 @@ export const DetectorTailwindMensagens = {
5
5
  repeatedClasses: (duplicates) => `Classes repetidas: ${duplicates}`,
6
6
  repeatedClassesSugestao: 'Remova classes duplicadas',
7
7
  arbitraryValue: (val) => `Valor arbitrário detectado: ${val}`,
8
- arbitraryValueSugestao: 'Considere adicionar ao tailwind.config.js',
8
+ arbitraryValueSugestao: 'Considere adicionar via @theme no CSS (Tailwind v4)',
9
9
  important: '!important detectado em classe Tailwind',
10
10
  importantSugestao: 'Evite !important - refatore a especificidade',
11
11
  arbitraryValueOveruse: 'Uso excessivo de valores arbitrários - pode indicar falta de tokens de design',
12
- arbitraryValueOveruseSugestao: 'Defina tokens personalizados em tailwind.config.js ao invés de valores arbitrários',
12
+ arbitraryValueOveruseSugestao: 'Defina tokens personalizados via @theme no CSS ao invés de valores arbitrários (Tailwind v4)',
13
13
  missingDesignToken: 'Valor hardcoded detectado - use tokens de design do Tailwind',
14
- missingDesignTokenSugestao: 'Extraia cores, espaçamentos e tamanhos para o tailwind.config.js',
14
+ missingDesignTokenSugestao: 'Extraia cores, espaçamentos e tamanhos para @theme no CSS (Tailwind v4)',
15
15
  responsiveWithoutBase: 'Classe responsiva sem classe base correspondente',
16
16
  responsiveWithoutBaseSugestao: 'Adicione a classe base antes das variantes responsivas',
17
17
  inlineStylesWithTailwind: 'Estilos inline detectados junto com classes Tailwind',
@@ -29,7 +29,16 @@ export const ReactMensagens = {
29
29
  export const ReactHooksMensagens = {
30
30
  useEffectNoDeps: 'useEffect sem array de dependências (avalie deps para evitar loops).',
31
31
  memoCallbackNoDeps: 'Hook sem array de dependências (useMemo/useCallback).',
32
- hookInConditional: 'Hook declarado dentro de condicional (quebra Rules of Hooks).'
32
+ hookInConditional: 'Hook declarado dentro de condicional (quebra Rules of Hooks).',
33
+ react19Use: 'Hook use() detectado (React 19) — certifique-se de usar <Suspense>.',
34
+ react19UseOptimistic: 'Hook useOptimistic detectado (React 19) — requer função de update.',
35
+ react19UseActionState: 'Hook useActionState detectado (React 19) — para form actions.',
36
+ react19UseFormStatus: 'Hook useFormStatus detectado (React 19) — acessa estado pendente do form.',
37
+ react19ForwardRefDeprecated: 'forwardRef é deprecated no React 19 — passe ref como prop direta.',
38
+ react19FCDeprecated: 'React.FC/FunctionComponent é deprecated no React 19 — tipagem direta de props.',
39
+ react19DefaultPropsDeprecated: 'defaultProps é deprecated no React 19 — use parâmetros default.',
40
+ react19UseClient: 'Arquivo usa recursos client-side (hooks/eventos) sem diretiva \'use client\' (React 19).',
41
+ react19FormAction: 'Form com action prop detectado (React 19).'
33
42
  };
34
43
  // ─── MENSAGENS TAILWIND ───────────────────────────────────────
35
44
  export const TailwindMensagens = {
@@ -38,7 +47,13 @@ export const TailwindMensagens = {
38
47
  importantUsage: (token) => `Uso de ! (important) detectado em (${token}). Prefira classes utilitárias ou reforço de escopo ao invés de important.`,
39
48
  variantConflict: (prop, variants) => `Possível conflito de variantes para ${prop} (variantes: ${variants.slice(0, 6).join(', ')}). Verifique ordem/escopo.`,
40
49
  dangerousArbitraryValue: (token) => `Valor arbitrário com url potencialmente perigosa (${token}). Evite javascript:/data:text/html.`,
41
- arbitraryValue: (token) => `Classe com valor arbitrário (${token}). Confirme se está alinhada ao design.`
50
+ arbitraryValue: (token) => `Classe com valor arbitrário (${token}). Confirme se está alinhada ao design.`,
51
+ v3DeprecatedUtility: (token, replacement) => `Utilitário obsoleto do v3 "${token}" → use "${replacement}" (Tailwind v4).`,
52
+ v3Directive: `Diretiva @tailwind detectada (v3) → use @import "tailwindcss" (Tailwind v4).`,
53
+ v3LayerUtilities: `@layer utilities detectado (v3) → use @utility (Tailwind v4).`,
54
+ themeFunction: `Função theme() detectada (deprecated v3) → prefira CSS variables (var(--color-*)).`,
55
+ v3ImportantPrefix: (token) => `!important como prefixo em "${token}" (v3) → mova ! para o final ("${token.replace('!', '')}!").`,
56
+ v3ArbitraryVar: `Variável entre colchetes (v3) → use parênteses (ex: bg-(--var) ao invés de bg-[--var]).`
42
57
  };
43
58
  // ─── MENSAGENS CSS ────────────────────────────────────────────
44
59
  export const CssMensagens = {
@@ -287,7 +302,20 @@ export const RustMensagens = {
287
302
  missingDoc: (fnName) => `Função pública '${fnName}' sem comentário de documentação (///).`,
288
303
  namingConvention: (constName) => `Constante '${constName}' deve seguir convenção SCREAMING_CASE.`,
289
304
  redundantReturn: 'return redundante no final da função; Rust usa retorno implícito (última expressão).',
290
- wildcardImport: (importPath) => `Importação curinga '${importPath}' pode poluir o namespace; prefira imports explícitos.`
305
+ wildcardImport: (importPath) => `Importação curinga '${importPath}' pode poluir o namespace; prefira imports explícitos.`,
306
+ lazyLockSuggestion: 'once_cell::sync::Lazy detectado — use std::sync::LazyLock (Rust 1.80+).',
307
+ onceLockSuggestion: 'once_cell::sync::OnceCell detectado — use std::sync::OnceLock (Rust 1.70+).',
308
+ offsetOfSuggestion: 'Offset manual para campo — use std::mem::offset_of! (Rust 1.77+).',
309
+ letChainsPattern: 'Padrão let_chains detectado (estável desde Rust 1.78).',
310
+ assertMatchesSuggestion: 'Padrão assert!(matches!(...)) — considere assert_matches!(...) (nightly).',
311
+ isSomeAnd: '.is_some() && predicate — use .is_some_and(|x| ...) (Rust 1.70+).',
312
+ isOkAnd: '.is_ok() && predicate — use .is_ok_and(|x| ...) (Rust 1.70+).',
313
+ inspectMethod: 'map() com closure de efeito colateral — use .inspect() (Rust 1.76+).',
314
+ implicitFormatCapture: 'format!("...{var}...") pode usar captura implícita (Rust 1.80+).',
315
+ pointerCast: 'Uso de `as` para cast de ponteiro — use .cast() (Rust 1.72+).',
316
+ splitOnce: 'splitn(2, ...) com acesso por índice — use .split_once() (Rust 1.62+).',
317
+ okErrAntipattern: 'Antipadrão .ok()?.unwrap() — use ? diretamente no Result.',
318
+ collectOverPush: 'Construção de coleção com push() em loop — use .map().collect().'
291
319
  };
292
320
  // ─── MENSAGENS JAVA / KOTLIN ──────────────────────────────────
293
321
  export const JavaMensagens = {
@@ -13,9 +13,7 @@ class LogEngineAdaptativo {
13
13
  metricas = null;
14
14
  isCI = false;
15
15
  static getInstance() {
16
- if (!LogEngineAdaptativo.instance) {
17
- LogEngineAdaptativo.instance = new LogEngineAdaptativo();
18
- }
16
+ LogEngineAdaptativo.instance ??= new LogEngineAdaptativo();
19
17
  return LogEngineAdaptativo.instance;
20
18
  }
21
19
  /**
@@ -88,7 +86,7 @@ class LogEngineAdaptativo {
88
86
  * Detecta se está rodando em ambiente CI/CD
89
87
  */
90
88
  detectarCI() {
91
- return !!((process.env.CI || process.env.GITHUB_ACTIONS || (process.env.GITLAB_CI ?? process.env.JENKINS_URL)) ?? config.REPORT_SILENCE_LOGS);
89
+ return !!((process.env.CI ?? process.env.GITHUB_ACTIONS ?? (process.env.GITLAB_CI ?? process.env.JENKINS_URL)) ?? config.REPORT_SILENCE_LOGS);
92
90
  }
93
91
  /**
94
92
  * Calcula confiança da detecção de contexto
@@ -166,7 +164,7 @@ class LogEngineAdaptativo {
166
164
  // Aplica formatação de template
167
165
  return template.replace(/\{(\w+)\}/g, (match, key) => {
168
166
  const value = processedData[key];
169
- return value !== undefined ? String(value) : match;
167
+ return String(value);
170
168
  });
171
169
  }
172
170
  /**
@@ -194,7 +192,9 @@ class LogEngineAdaptativo {
194
192
  return console.error;
195
193
  case 'aviso':
196
194
  return console.warn;
197
- default:
195
+ case 'info':
196
+ case 'debug':
197
+ case 'sucesso':
198
198
  return console.log;
199
199
  }
200
200
  }
@@ -140,7 +140,7 @@ export function formatarLinha({ nivel, mensagem, sanitize = true }) {
140
140
  if (!process.env.VITEST && process.env.SUKUNA_CENTER === '1') {
141
141
  try {
142
142
  const cols = obterColunasTerm();
143
- const out = process.stdout && typeof process.stdout.isTTY !== 'undefined' ? process.stdout : undefined;
143
+ const out = typeof process.stdout.isTTY !== 'undefined' ? process.stdout : undefined;
144
144
  const isTty = !!out && out.isTTY;
145
145
  if (isTty && cols && cols > 0) {
146
146
  const ANSI_REGEX = /[\u001B\u009B][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
@@ -164,7 +164,7 @@ export function formatarLinha({ nivel, mensagem, sanitize = true }) {
164
164
  function obterColunasTerm() {
165
165
  // Tenta obter largura do terminal de forma segura
166
166
  try {
167
- const out = process.stdout && typeof process.stdout.columns !== 'undefined' ? process.stdout : undefined;
167
+ const out = typeof process.stdout.columns !== 'undefined' ? process.stdout : undefined;
168
168
  const cols = out?.columns;
169
169
  if (typeof cols === 'number' && cols > 0) {
170
170
  return cols;
@@ -414,7 +414,7 @@ export const log = {
414
414
  const visibleLen = (string) => string.replace(ANSI_REGEX, '').length;
415
415
  const frameWidth = Math.max(...lines.map(linha => visibleLen(linha)));
416
416
  const cols = obterColunasTerm() ?? 0;
417
- const outStream = process.stdout && typeof process.stdout.isTTY !== 'undefined' ? process.stdout : undefined;
417
+ const outStream = typeof process.stdout.isTTY !== 'undefined' ? process.stdout : undefined;
418
418
  const isTty = !!outStream && outStream.isTTY;
419
419
  if (isTty) {
420
420
  const pad = Math.floor(Math.max(0, cols - frameWidth) / 2);
@@ -221,7 +221,7 @@ export const AGRUPAMENTOS_MENSAGEM = [
221
221
  * Obtém a prioridade de um tipo de problema
222
222
  */
223
223
  export function getPrioridade(tipo) {
224
- return PRIORIDADES[tipo] || {
224
+ return PRIORIDADES[tipo] ?? {
225
225
  prioridade: 'baixa',
226
226
  icone: ICONES_ARQUIVO.arquivo,
227
227
  descricao: 'Problema não categorizado'
@@ -162,11 +162,11 @@ export const ICONES_ZELADOR = {
162
162
  export function getIcone(categoria, nome) {
163
163
  switch (categoria) {
164
164
  case 'nivel':
165
- return ICONES_NIVEL[nome] || ICONES_NIVEL.info;
165
+ return ICONES_NIVEL[nome];
166
166
  case 'status':
167
- return ICONES_STATUS[nome] || ICONES_STATUS.pendente;
167
+ return ICONES_STATUS[nome];
168
168
  case 'acao':
169
- return ICONES_ACAO[nome] || '[*]';
169
+ return ICONES_ACAO[nome];
170
170
  default:
171
171
  return '[*]';
172
172
  }
@@ -54,5 +54,5 @@ export const AnalistaGithubActionsMensagens = {
54
54
  pullRequestTargetGrantsWritePermissionsSugestao: '使用 pull_request 代替 pull_request_target,或仔细验证源分支',
55
55
  workflowDispatchWithoutInputs: 'workflow_dispatch 未定义 inputs',
56
56
  workflowDispatchWithoutInputsSugestao: '定义必需输入以控制手动工作流执行',
57
- erroAplicarCorrecao: (erro) => `应用修复错误: ${erro}`,
57
+ erroAplicarCorrecao: (erro) => `应用修复错误: ${String(erro)}`,
58
58
  };
@@ -16,5 +16,6 @@ export const PadroesUsoMensagens = {
16
16
  nonArrowCallback: "使用 'function' 的回调更适合使用箭头函数。建议使用 () => {}。",
17
17
  consoleLog: "在生产代码中检测到 console.log。请删除或替换为适当的日志记录器。",
18
18
  uselessConditional: "不必要的比较:if (x === true)。只需使用 if (x)。",
19
+ satisfiesUsage: "TypeScript 的 'satisfies' 关键字已使用 — 在不拓宽类型的情况下确保类型安全",
19
20
  erroAnalise: (relPath, erro) => `分析 ${relPath} 中的使用模式失败:${erro}`
20
21
  };
@@ -60,4 +60,19 @@ export const AnalistaShellMensagens = {
60
60
  loopOverCommandOutputSugestao: '使用glob: "for f in *"。',
61
61
  pipeOverTempfile: '管道可以替代临时文件。',
62
62
  pipeOverTempfileSugestao: '使用管道代替临时文件。',
63
+ // Modern Bash (2026)
64
+ missingSetU: '缺少 "set -u" — 未设置的变量将静默展开为空。',
65
+ missingSetUSugestao: '添加 "set -u" 以捕获变量名拼写错误。',
66
+ missingIso: '缺少 IFS=$\'\\n\\t\' — 分词可能导致意外行为。',
67
+ missingIsoSugestao: '在脚本开头添加 IFS=$\'\\n\\t\' 以确保安全分词。',
68
+ missingTrap: '未找到 trap 处理程序 — 信号时可能跳过清理。',
69
+ missingTrapSugestao: '添加 trap 处理程序: trap "cleanup" EXIT INT TERM。',
70
+ missingMainFn: '脚本缺少 main 函数模式。',
71
+ missingMainFnSugestao: '将逻辑包装在 main() 中并在底部调用 main "$@"。',
72
+ missingCommandV: '硬编码路径而非使用 command -v。',
73
+ missingCommandVSugestao: '使用 "command -v <工具>" 检查可用性。',
74
+ missingDebugMode: '脚本没有调试模式 — 故障排除更困难。',
75
+ missingDebugModeSugestao: '添加 [[ "${DEBUG:-}" == "true" ]] && set -x 以启用调试跟踪。',
76
+ missingInputValidation: '命令参数未验证 — 意外输入可能导致错误。',
77
+ missingInputValidationSugestao: '在开头验证参数: [[ -z "$1" ]] && { echo "用法: ..."; exit 1; }。',
63
78
  };
@@ -11,4 +11,10 @@ export const DetectorConstrucoesSintaticasMensagens = {
11
11
  templateLiteralOveruse: "简单拼接不需要使用模板字面量。请使用 '+' 运算符。",
12
12
  unnecessaryObjectSpread: "不必要的对象展开。直接赋值 'obj.prop = val' 更高效。",
13
13
  getterSetterWithoutValidation: "getter/setter 的 setter 中没有验证。请添加验证以防止无效数据。",
14
+ // ES2025/ES2026
15
+ explicitResourceManagement: "检测到使用 'using' 的显式资源管理 (ES2026)",
16
+ temporalApiUsage: "检测到 Temporal API 的使用 (ES2026) — 现代日期/时间替代 Date",
17
+ iteratorHelperUsage: "检测到迭代器辅助方法 (ES2025) — 可迭代对象的惰性求值",
18
+ setMethodUsage: "检测到新的 Set 方法 (ES2025) — 用于集合操作",
19
+ mapUpsertUsage: "检测到 Map 的 upsert 方法 (ES2026) — .getOrInsert() / .getOrInsertComputed()",
14
20
  };
@@ -54,4 +54,31 @@ export const DetectorJsTsMensagens = {
54
54
  observerWithoutDisconnect: 'Observer(MutationObserver/IntersectionObserver)没有 disconnect()。这会导致内存泄漏。',
55
55
  webSocketWithoutClose: 'WebSocket 没有对应的 close() 调用。连接可能保持打开状态。',
56
56
  workerWithoutTerminate: 'Worker 没有 terminate() 调用。worker 将继续在后台运行。',
57
+ // ES2025+ features
58
+ satisfiesAvailable: '类型可以使用 "satisfies" 替代 "as" 断言以获得更安全的窄化',
59
+ satisfiesAvailableSugestao: '将 "as Type" 替换为 "satisfies Type" 以验证而不拓宽类型',
60
+ usingResourceManagement: '检测到使用 "using" 的显式资源管理 (ES2026)',
61
+ usingResourceManagementSugestao: '确保资源实现了 Symbol.dispose 或 Symbol.asyncDispose',
62
+ temporalApi: '检测到 Temporal API 使用 (ES2026)',
63
+ temporalApiSugestao: 'Temporal 替代 Date — 使用 Temporal.Now, Temporal.PlainDate 等',
64
+ iteratorHelper: '检测到迭代器辅助方法 (ES2025)',
65
+ iteratorHelperSugestao: '迭代器辅助方法 (.map(), .filter(), .take()) 支持惰性求值',
66
+ setMethods: '检测到新的 Set 方法 (ES2025)',
67
+ setMethodsSugestao: '使用 Set.prototype.union(), .intersection(), .difference() 进行集合操作',
68
+ topLevelAwait: '检测到顶层 await',
69
+ topLevelAwaitSugestao: '确认顶层 await 不会不必要地阻塞导入',
70
+ promiseWithResolvers: '检测到 Promise.withResolvers() (ES2025)',
71
+ promiseWithResolversSugestao: '尽可能使用 async/await 而不是 Promise.withResolvers()',
72
+ promiseAllSettled: '检测到 Promise.allSettled() — 适合 all-settled 模式',
73
+ promiseAllSettledSugestao: '当你需要所有 promise 的结果(无论是否被拒绝)时使用 Promise.allSettled()',
74
+ forAwaitOf: '检测到 for await...of — 异步迭代',
75
+ forAwaitOfSugestao: '确保异步可迭代对象正确实现了 Symbol.asyncIterator',
76
+ regexpEscape: '检测到 RegExp.escape() (ES2025)',
77
+ regexpEscapeSugestao: '使用 RegExp.escape() 安全地转义正则表达式中的用户输入',
78
+ errorIsError: '检测到 Error.isError() (ES2026)',
79
+ errorIsErrorSugestao: '使用 Error.isError() 进行可靠的错误类型检查',
80
+ arrayFromAsync: '检测到 Array.fromAsync() (ES2026)',
81
+ arrayFromAsyncSugestao: '使用 Array.fromAsync() 从异步可迭代对象创建数组',
82
+ mapGetOrInsert: '检测到 Map.getOrInsert() / .getOrInsertComputed() (ES2026)',
83
+ mapGetOrInsertSugestao: '使用 getOrInsert() 进行原子化的 Map upsert 操作',
57
84
  };
@@ -57,4 +57,12 @@ export const DetectorReactMensagens = {
57
57
  contextTooBroadSugestao: '拆分为更小的context',
58
58
  liftingStateTooHigh: '状态提升到比所需更多的层级',
59
59
  liftingStateTooHighSugestao: '考虑使用context或局部状态',
60
+ react19ForwardRef: 'forwardRef 在 React 19 中已弃用',
61
+ react19ForwardRefSugestao: '将 ref 作为常规 prop 传递',
62
+ react19FC: 'React.FC 在 React 19 中已弃用',
63
+ react19FCSugestao: '直接键入 props,不要使用 React.FC',
64
+ react19UseClient: '缺少 \'use client\' 指令 (React 19)',
65
+ react19UseClientSugestao: '为客户端组件在文件顶部添加 \'use client\'',
66
+ react19DefaultProps: 'defaultProps 在 React 19 中已弃用',
67
+ react19DefaultPropsSugestao: '使用默认参数值代替',
60
68
  };
@@ -60,4 +60,21 @@ export const DetectorShellMensagens = {
60
60
  loopOverCommandOutputSugestao: '使用glob模式代替解析ls',
61
61
  pipeOverTempfile: '管道可以替代临时文件',
62
62
  pipeOverTempfileSugestao: '使用管道代替临时文件',
63
+ // Modern Bash (2026)
64
+ missingSetU: '缺少 "set -u" — 未设置的变量将静默展开为空',
65
+ missingSetUSugestao: '添加 "set -u" 以捕获变量名拼写错误',
66
+ missingIso: '缺少 IFS=$\'\\n\\t\' — 分词可能导致意外行为',
67
+ missingIsoSugestao: '在脚本开头添加 IFS=$\'\\n\\t\' 以确保安全分词',
68
+ missingTrap: '未找到 trap 处理程序 — 信号时可能跳过清理',
69
+ missingTrapSugestao: '添加 trap 处理程序: trap "cleanup" EXIT INT TERM',
70
+ missingMainFn: '脚本缺少 main 函数模式',
71
+ missingMainFnSugestao: '将逻辑包装在 main() 中并在底部调用 main "$@"',
72
+ missingCommandV: '硬编码路径而非使用 command -v',
73
+ missingCommandVSugestao: '使用 "command -v <工具>" 检查可用性',
74
+ missingDebugMode: '脚本没有调试模式 — 故障排除更困难',
75
+ missingDebugModeSugestao: '添加 [[ "${DEBUG:-}" == "true" ]] && set -x 以启用调试跟踪',
76
+ missingInputValidation: '命令参数未验证 — 意外输入可能导致错误',
77
+ missingInputValidationSugestao: '在开头验证参数: [[ -z "$1" ]] && { echo "用法: ..."; exit 1; }',
78
+ shellCheckRecommended: '考虑运行 ShellCheck 进行全面分析',
79
+ shellCheckRecommendedSugestao: '安装 shellcheck 并运行: shellcheck script.sh',
63
80
  };