tutanus 0.12.3 → 0.12.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/dist/analysts/converters/converter-base.js.map +1 -1
- package/dist/analysts/converters/engines/converter-gha-to-gitlab.js.map +1 -1
- package/dist/analysts/converters/index.js.map +1 -1
- package/dist/analysts/corrections/map-reversion.js +2 -2
- package/dist/analysts/corrections/map-reversion.js.map +1 -1
- package/dist/analysts/corrections/pruning.js +3 -3
- package/dist/analysts/corrections/pruning.js.map +1 -1
- package/dist/analysts/detectors/detector-recommendation-architecture.js +2 -2
- package/dist/analysts/detectors/detector-recommendation-architecture.js.map +1 -1
- package/dist/analysts/github-actions/detectors/org-verified.js.map +1 -1
- package/dist/analysts/github-actions/reports/generator-report-github-actions.js +4 -4
- package/dist/analysts/github-actions/reports/generator-report-github-actions.js.map +1 -1
- package/dist/analysts/js-ts/detectors/detector-context-smart.js +10 -10
- package/dist/analysts/js-ts/detectors/detector-context-smart.js.map +1 -1
- package/dist/analysts/js-ts/detectors/detector-types-unsafe.js +3 -3
- package/dist/analysts/js-ts/detectors/detector-types-unsafe.js.map +1 -1
- package/dist/analysts/plugins/detector-documentation.js.map +1 -1
- package/dist/analysts/plugins/index.js.map +1 -1
- package/dist/analysts/scorers/scorer.js +67 -67
- package/dist/analysts/scorers/scorer.js.map +1 -1
- package/dist/app/github/app/repo-downloader.d.ts +2 -0
- package/dist/app/github/app/repo-downloader.d.ts.map +1 -1
- package/dist/app/github/app/repo-downloader.js +2 -2
- package/dist/app/github/app/repo-downloader.js.map +1 -1
- package/dist/app/github/jobs/auto-fix-job.d.ts.map +1 -1
- package/dist/app/github/jobs/auto-fix-job.js +19 -3
- package/dist/app/github/jobs/auto-fix-job.js.map +1 -1
- package/dist/app/github/push-analysis/push-analysis-service.d.ts.map +1 -1
- package/dist/app/github/push-analysis/push-analysis-service.js +19 -7
- package/dist/app/github/push-analysis/push-analysis-service.js.map +1 -1
- package/dist/app/github/push-analysis/push-report.js +2 -2
- package/dist/app/github/push-analysis/push-report.js.map +1 -1
- package/dist/cli/commands/command-azure.js +1 -1
- package/dist/cli/commands/command-azure.js.map +1 -1
- package/dist/cli/commands/command-circleci.js +1 -1
- package/dist/cli/commands/command-circleci.js.map +1 -1
- package/dist/cli/commands/command-convert.js.map +1 -1
- package/dist/cli/commands/command-github-actions.js +1 -1
- package/dist/cli/commands/command-github-actions.js.map +1 -1
- package/dist/cli/commands/command-gitlab-ci.js +1 -1
- package/dist/cli/commands/command-gitlab-ci.js.map +1 -1
- package/dist/cli/commands/command-jenkins.js +1 -1
- package/dist/cli/commands/command-jenkins.js.map +1 -1
- package/dist/cli/diagnostic/exporters/compliance-exporter.js +2 -2
- package/dist/cli/diagnostic/exporters/compliance-exporter.js.map +1 -1
- package/dist/cli/diagnostic/exporters/markdown-exporter.js +7 -7
- package/dist/cli/diagnostic/exporters/markdown-exporter.js.map +1 -1
- package/dist/cli/diagnostic/handlers/archetype-handler.js.map +1 -1
- package/dist/cli/diagnostic/handlers/guardian-handler.js.map +1 -1
- package/dist/cli/diagnostic/processing-diagnostic.js +1 -1
- package/dist/cli/diagnostic/processing-diagnostic.js.map +1 -1
- package/dist/core/config/auto/fix-config.js.map +1 -1
- package/dist/core/execution/executor.js +4 -4
- package/dist/core/execution/executor.js.map +1 -1
- package/dist/core/execution/inquisitor.js +6 -6
- package/dist/core/execution/inquisitor.js.map +1 -1
- package/dist/core/execution/scanner.js.map +1 -1
- package/dist/core/messages/en/analysts/archetypes-extra-messages.d.ts +2 -2
- package/dist/core/messages/en/analysts/archetypes-extra-messages.js +2 -2
- package/dist/core/messages/en/analysts/archetypes-extra-messages.js.map +1 -1
- package/dist/core/messages/en/analysts/detector-clean-arch-messages.d.ts +4 -4
- package/dist/core/messages/en/analysts/detector-clean-arch-messages.js +4 -4
- package/dist/core/messages/en/analysts/detector-clean-arch-messages.js.map +1 -1
- package/dist/core/messages/en/analysts/detector-js-ts-messages.d.ts +2 -2
- package/dist/core/messages/en/analysts/detector-js-ts-messages.js +2 -2
- package/dist/core/messages/en/analysts/detector-js-ts-messages.js.map +1 -1
- package/dist/core/messages/en/analysts/map-reversion-extra-messages.d.ts +6 -6
- package/dist/core/messages/en/analysts/map-reversion-extra-messages.js +6 -6
- package/dist/core/messages/en/analysts/map-reversion-extra-messages.js.map +1 -1
- package/dist/core/messages/en/analysts/report-github-actions-messages.d.ts +2 -2
- package/dist/core/messages/en/analysts/report-github-actions-messages.js +2 -2
- package/dist/core/messages/en/analysts/report-github-actions-messages.js.map +1 -1
- package/dist/core/messages/en/analysts/scorer-messages.d.ts +45 -45
- package/dist/core/messages/en/analysts/scorer-messages.js +49 -49
- package/dist/core/messages/en/analysts/scorer-messages.js.map +1 -1
- package/dist/core/messages/en/cli/cli-command-convert-messages.d.ts +1 -1
- package/dist/core/messages/en/cli/cli-command-convert-messages.js +1 -1
- package/dist/core/messages/en/cli/cli-command-convert-messages.js.map +1 -1
- package/dist/core/messages/en/cli/cli-command-format-messages.d.ts +1 -1
- package/dist/core/messages/en/cli/cli-command-format-messages.js +1 -1
- package/dist/core/messages/en/cli/cli-command-format-messages.js.map +1 -1
- package/dist/core/messages/en/cli/cli-command-github-actions-messages.d.ts +1 -1
- package/dist/core/messages/en/cli/cli-command-github-actions-messages.js +4 -4
- package/dist/core/messages/en/cli/cli-command-github-actions-messages.js.map +1 -1
- package/dist/core/messages/en/cli/cli-command-update-messages.d.ts +2 -2
- package/dist/core/messages/en/cli/cli-command-update-messages.js +2 -2
- package/dist/core/messages/en/cli/cli-command-update-messages.js.map +1 -1
- package/dist/core/messages/en/cli/cli-flags-validator-messages.d.ts +3 -3
- package/dist/core/messages/en/cli/cli-flags-validator-messages.js +3 -3
- package/dist/core/messages/en/cli/cli-flags-validator-messages.js.map +1 -1
- package/dist/core/messages/en/core/correcoes-messages.js +2 -2
- package/dist/core/messages/en/core/correcoes-messages.js.map +1 -1
- package/dist/core/messages/en/core/inquisitor-extra-messages.d.ts +2 -2
- package/dist/core/messages/en/core/inquisitor-extra-messages.js +2 -2
- package/dist/core/messages/en/core/inquisitor-extra-messages.js.map +1 -1
- package/dist/core/messages/en/core/parser-extra-messages.d.ts +3 -3
- package/dist/core/messages/en/core/parser-extra-messages.js +3 -3
- package/dist/core/messages/en/core/parser-extra-messages.js.map +1 -1
- package/dist/core/messages/en/guardian/guardian-messages.d.ts +2 -2
- package/dist/core/messages/en/guardian/guardian-messages.js +2 -2
- package/dist/core/messages/en/guardian/guardian-messages.js.map +1 -1
- package/dist/core/messages/en/guardian/watcher-hidden-messages.d.ts +2 -2
- package/dist/core/messages/en/guardian/watcher-hidden-messages.js +2 -2
- package/dist/core/messages/en/guardian/watcher-hidden-messages.js.map +1 -1
- package/dist/core/messages/en/log/log-helper.js.map +1 -1
- package/dist/core/messages/en/reports/report-async-patterns-messages.d.ts +3 -3
- package/dist/core/messages/en/reports/report-async-patterns-messages.js +3 -3
- package/dist/core/messages/en/reports/report-async-patterns-messages.js.map +1 -1
- package/dist/core/messages/en/shared/plugin-core-messages.d.ts +2 -2
- package/dist/core/messages/en/shared/plugin-core-messages.js +2 -2
- package/dist/core/messages/en/shared/plugin-core-messages.js.map +1 -1
- package/dist/core/messages/en/shared/plugin-registry-messages.d.ts +4 -4
- package/dist/core/messages/en/shared/plugin-registry-messages.js +4 -4
- package/dist/core/messages/en/shared/plugin-registry-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/archetypes-extra-messages.d.ts +2 -2
- package/dist/core/messages/ja/analysts/archetypes-extra-messages.js +2 -2
- package/dist/core/messages/ja/analysts/archetypes-extra-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/detector-clean-arch-messages.d.ts +4 -4
- package/dist/core/messages/ja/analysts/detector-clean-arch-messages.js +4 -4
- package/dist/core/messages/ja/analysts/detector-clean-arch-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/detector-js-ts-messages.d.ts +2 -2
- package/dist/core/messages/ja/analysts/detector-js-ts-messages.js +2 -2
- package/dist/core/messages/ja/analysts/detector-js-ts-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/map-reversion-extra-messages.d.ts +6 -6
- package/dist/core/messages/ja/analysts/map-reversion-extra-messages.js +6 -6
- package/dist/core/messages/ja/analysts/map-reversion-extra-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/report-github-actions-messages.d.ts +2 -2
- package/dist/core/messages/ja/analysts/report-github-actions-messages.js +2 -2
- package/dist/core/messages/ja/analysts/report-github-actions-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/scorer-messages.d.ts +45 -45
- package/dist/core/messages/ja/analysts/scorer-messages.js +49 -49
- package/dist/core/messages/ja/analysts/scorer-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-command-analysts-messages.d.ts +2 -2
- package/dist/core/messages/ja/cli/cli-command-analysts-messages.js +2 -2
- package/dist/core/messages/ja/cli/cli-command-analysts-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-command-convert-messages.d.ts +1 -1
- package/dist/core/messages/ja/cli/cli-command-convert-messages.js +1 -1
- package/dist/core/messages/ja/cli/cli-command-convert-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-command-format-messages.d.ts +1 -1
- package/dist/core/messages/ja/cli/cli-command-format-messages.js +1 -1
- package/dist/core/messages/ja/cli/cli-command-format-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-command-github-actions-messages.d.ts +1 -1
- package/dist/core/messages/ja/cli/cli-command-github-actions-messages.js +4 -4
- package/dist/core/messages/ja/cli/cli-command-github-actions-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-command-update-messages.d.ts +2 -2
- package/dist/core/messages/ja/cli/cli-command-update-messages.js +2 -2
- package/dist/core/messages/ja/cli/cli-command-update-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-flags-validator-messages.d.ts +3 -3
- package/dist/core/messages/ja/cli/cli-flags-validator-messages.js +3 -3
- package/dist/core/messages/ja/cli/cli-flags-validator-messages.js.map +1 -1
- package/dist/core/messages/ja/core/correcoes-messages.js +2 -2
- package/dist/core/messages/ja/core/correcoes-messages.js.map +1 -1
- package/dist/core/messages/ja/core/inquisitor-extra-messages.d.ts +2 -2
- package/dist/core/messages/ja/core/inquisitor-extra-messages.js +2 -2
- package/dist/core/messages/ja/core/inquisitor-extra-messages.js.map +1 -1
- package/dist/core/messages/ja/core/parser-extra-messages.d.ts +3 -3
- package/dist/core/messages/ja/core/parser-extra-messages.js +3 -3
- package/dist/core/messages/ja/core/parser-extra-messages.js.map +1 -1
- package/dist/core/messages/ja/guardian/guardian-messages.d.ts +2 -2
- package/dist/core/messages/ja/guardian/guardian-messages.js +2 -2
- package/dist/core/messages/ja/guardian/guardian-messages.js.map +1 -1
- package/dist/core/messages/ja/guardian/watcher-hidden-messages.d.ts +2 -2
- package/dist/core/messages/ja/guardian/watcher-hidden-messages.js +2 -2
- package/dist/core/messages/ja/guardian/watcher-hidden-messages.js.map +1 -1
- package/dist/core/messages/ja/log/log-helper.js.map +1 -1
- package/dist/core/messages/ja/reports/report-async-patterns-messages.d.ts +3 -3
- package/dist/core/messages/ja/reports/report-async-patterns-messages.js +3 -3
- package/dist/core/messages/ja/reports/report-async-patterns-messages.js.map +1 -1
- package/dist/core/messages/ja/shared/plugin-core-messages.d.ts +2 -2
- package/dist/core/messages/ja/shared/plugin-core-messages.js +2 -2
- package/dist/core/messages/ja/shared/plugin-core-messages.js.map +1 -1
- package/dist/core/messages/ja/shared/plugin-registry-messages.d.ts +4 -4
- package/dist/core/messages/ja/shared/plugin-registry-messages.js +4 -4
- package/dist/core/messages/ja/shared/plugin-registry-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/archetypes-extra-messages.d.ts +2 -2
- package/dist/core/messages/pt/analysts/archetypes-extra-messages.js +2 -2
- package/dist/core/messages/pt/analysts/archetypes-extra-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/detector-clean-arch-messages.d.ts +4 -4
- package/dist/core/messages/pt/analysts/detector-clean-arch-messages.js +4 -4
- package/dist/core/messages/pt/analysts/detector-clean-arch-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/detector-js-ts-messages.d.ts +2 -2
- package/dist/core/messages/pt/analysts/detector-js-ts-messages.js +2 -2
- package/dist/core/messages/pt/analysts/detector-js-ts-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/map-reversion-extra-messages.d.ts +6 -6
- package/dist/core/messages/pt/analysts/map-reversion-extra-messages.js +6 -6
- package/dist/core/messages/pt/analysts/map-reversion-extra-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/report-github-actions-messages.d.ts +2 -2
- package/dist/core/messages/pt/analysts/report-github-actions-messages.js +2 -2
- package/dist/core/messages/pt/analysts/report-github-actions-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/scorer-messages.d.ts +45 -45
- package/dist/core/messages/pt/analysts/scorer-messages.js +49 -49
- package/dist/core/messages/pt/analysts/scorer-messages.js.map +1 -1
- package/dist/core/messages/pt/cli/cli-command-convert-messages.d.ts +1 -1
- package/dist/core/messages/pt/cli/cli-command-convert-messages.js +1 -1
- package/dist/core/messages/pt/cli/cli-command-convert-messages.js.map +1 -1
- package/dist/core/messages/pt/cli/cli-command-format-messages.d.ts +1 -1
- package/dist/core/messages/pt/cli/cli-command-format-messages.js +1 -1
- package/dist/core/messages/pt/cli/cli-command-format-messages.js.map +1 -1
- package/dist/core/messages/pt/cli/cli-command-github-actions-messages.d.ts +1 -1
- package/dist/core/messages/pt/cli/cli-command-github-actions-messages.js +4 -4
- package/dist/core/messages/pt/cli/cli-command-github-actions-messages.js.map +1 -1
- package/dist/core/messages/pt/cli/cli-command-update-messages.d.ts +2 -2
- package/dist/core/messages/pt/cli/cli-command-update-messages.js +2 -2
- package/dist/core/messages/pt/cli/cli-command-update-messages.js.map +1 -1
- package/dist/core/messages/pt/cli/cli-flags-validator-messages.d.ts +3 -3
- package/dist/core/messages/pt/cli/cli-flags-validator-messages.js +3 -3
- package/dist/core/messages/pt/cli/cli-flags-validator-messages.js.map +1 -1
- package/dist/core/messages/pt/core/correcoes-messages.js +2 -2
- package/dist/core/messages/pt/core/correcoes-messages.js.map +1 -1
- package/dist/core/messages/pt/core/inquisitor-extra-messages.d.ts +2 -2
- package/dist/core/messages/pt/core/inquisitor-extra-messages.js +2 -2
- package/dist/core/messages/pt/core/inquisitor-extra-messages.js.map +1 -1
- package/dist/core/messages/pt/core/parser-extra-messages.d.ts +3 -3
- package/dist/core/messages/pt/core/parser-extra-messages.js +3 -3
- package/dist/core/messages/pt/core/parser-extra-messages.js.map +1 -1
- package/dist/core/messages/pt/guardian/guardian-messages.d.ts +2 -2
- package/dist/core/messages/pt/guardian/guardian-messages.js +2 -2
- package/dist/core/messages/pt/guardian/guardian-messages.js.map +1 -1
- package/dist/core/messages/pt/guardian/watcher-hidden-messages.d.ts +2 -2
- package/dist/core/messages/pt/guardian/watcher-hidden-messages.js +2 -2
- package/dist/core/messages/pt/guardian/watcher-hidden-messages.js.map +1 -1
- package/dist/core/messages/pt/log/log-helper.js.map +1 -1
- package/dist/core/messages/pt/reports/report-async-patterns-messages.d.ts +3 -3
- package/dist/core/messages/pt/reports/report-async-patterns-messages.js +3 -3
- package/dist/core/messages/pt/reports/report-async-patterns-messages.js.map +1 -1
- package/dist/core/messages/pt/shared/plugin-core-messages.d.ts +2 -2
- package/dist/core/messages/pt/shared/plugin-core-messages.js +2 -2
- package/dist/core/messages/pt/shared/plugin-core-messages.js.map +1 -1
- package/dist/core/messages/pt/shared/plugin-registry-messages.d.ts +4 -4
- package/dist/core/messages/pt/shared/plugin-registry-messages.js +4 -4
- package/dist/core/messages/pt/shared/plugin-registry-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/archetypes-extra-messages.d.ts +2 -2
- package/dist/core/messages/zh/analysts/archetypes-extra-messages.js +2 -2
- package/dist/core/messages/zh/analysts/archetypes-extra-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/detector-clean-arch-messages.d.ts +4 -4
- package/dist/core/messages/zh/analysts/detector-clean-arch-messages.js +4 -4
- package/dist/core/messages/zh/analysts/detector-clean-arch-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/detector-js-ts-messages.d.ts +2 -2
- package/dist/core/messages/zh/analysts/detector-js-ts-messages.js +2 -2
- package/dist/core/messages/zh/analysts/detector-js-ts-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/map-reversion-extra-messages.d.ts +6 -6
- package/dist/core/messages/zh/analysts/map-reversion-extra-messages.js +6 -6
- package/dist/core/messages/zh/analysts/map-reversion-extra-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/report-github-actions-messages.d.ts +2 -2
- package/dist/core/messages/zh/analysts/report-github-actions-messages.js +2 -2
- package/dist/core/messages/zh/analysts/report-github-actions-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/scorer-messages.d.ts +45 -45
- package/dist/core/messages/zh/analysts/scorer-messages.js +49 -49
- package/dist/core/messages/zh/analysts/scorer-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-command-analysts-messages.d.ts +2 -2
- package/dist/core/messages/zh/cli/cli-command-analysts-messages.js +2 -2
- package/dist/core/messages/zh/cli/cli-command-analysts-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-command-convert-messages.d.ts +1 -1
- package/dist/core/messages/zh/cli/cli-command-convert-messages.js +1 -1
- package/dist/core/messages/zh/cli/cli-command-convert-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-command-format-messages.d.ts +1 -1
- package/dist/core/messages/zh/cli/cli-command-format-messages.js +1 -1
- package/dist/core/messages/zh/cli/cli-command-format-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-command-github-actions-messages.d.ts +1 -1
- package/dist/core/messages/zh/cli/cli-command-github-actions-messages.js +4 -4
- package/dist/core/messages/zh/cli/cli-command-github-actions-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-command-update-messages.d.ts +2 -2
- package/dist/core/messages/zh/cli/cli-command-update-messages.js +2 -2
- package/dist/core/messages/zh/cli/cli-command-update-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-flags-validator-messages.d.ts +3 -3
- package/dist/core/messages/zh/cli/cli-flags-validator-messages.js +3 -3
- package/dist/core/messages/zh/cli/cli-flags-validator-messages.js.map +1 -1
- package/dist/core/messages/zh/core/correcoes-messages.js +2 -2
- package/dist/core/messages/zh/core/correcoes-messages.js.map +1 -1
- package/dist/core/messages/zh/core/inquisitor-extra-messages.d.ts +2 -2
- package/dist/core/messages/zh/core/inquisitor-extra-messages.js +2 -2
- package/dist/core/messages/zh/core/inquisitor-extra-messages.js.map +1 -1
- package/dist/core/messages/zh/core/parser-extra-messages.d.ts +3 -3
- package/dist/core/messages/zh/core/parser-extra-messages.js +3 -3
- package/dist/core/messages/zh/core/parser-extra-messages.js.map +1 -1
- package/dist/core/messages/zh/guardian/guardian-messages.d.ts +2 -2
- package/dist/core/messages/zh/guardian/guardian-messages.js +2 -2
- package/dist/core/messages/zh/guardian/guardian-messages.js.map +1 -1
- package/dist/core/messages/zh/guardian/watcher-hidden-messages.d.ts +2 -2
- package/dist/core/messages/zh/guardian/watcher-hidden-messages.js +2 -2
- package/dist/core/messages/zh/guardian/watcher-hidden-messages.js.map +1 -1
- package/dist/core/messages/zh/log/log-helper.js.map +1 -1
- package/dist/core/messages/zh/reports/report-async-patterns-messages.d.ts +3 -3
- package/dist/core/messages/zh/reports/report-async-patterns-messages.js +3 -3
- package/dist/core/messages/zh/reports/report-async-patterns-messages.js.map +1 -1
- package/dist/core/messages/zh/shared/plugin-core-messages.d.ts +2 -2
- package/dist/core/messages/zh/shared/plugin-core-messages.js +2 -2
- package/dist/core/messages/zh/shared/plugin-core-messages.js.map +1 -1
- package/dist/core/messages/zh/shared/plugin-registry-messages.d.ts +4 -4
- package/dist/core/messages/zh/shared/plugin-registry-messages.js +4 -4
- package/dist/core/messages/zh/shared/plugin-registry-messages.js.map +1 -1
- package/dist/core/parsing/utils.d.ts +3 -3
- package/dist/core/workers/worker-pool.js +1 -1
- package/dist/core/workers/worker-pool.js.map +1 -1
- package/dist/guardian/baseline.js.map +1 -1
- package/dist/guardian/constants.js.map +1 -1
- package/dist/guardian/diff.js.map +1 -1
- package/dist/reports/analise-async-patterns.js +1 -1
- package/dist/reports/analise-async-patterns.js.map +1 -1
- package/dist/reports/filter-smart.js.map +1 -1
- package/dist/reports/report-caretaker-health.js +1 -1
- package/dist/reports/report-caretaker-health.js.map +1 -1
- package/dist/shared/plugins/init.js.map +1 -1
- package/package.json +6 -6
- package/out/404/index.html +0 -1
- package/out/404.html +0 -1
- package/out/__next.__PAGE__.txt +0 -9
- package/out/__next._full.txt +0 -18
- package/out/__next._head.txt +0 -5
- package/out/__next._index.txt +0 -6
- package/out/__next._tree.txt +0 -3
- package/out/_next/static/chunks/05-c3ty_6dwfk.js +0 -1
- package/out/_next/static/chunks/0cz1d0mv5g_q7.js +0 -1
- package/out/_next/static/chunks/1061ff024jzvu.js +0 -2
- package/out/_next/static/chunks/14mrh2-p_w84d.js +0 -1
- package/out/_next/static/chunks/15orcrkp-_9ct.js +0 -4
- package/out/_next/static/chunks/1jq4o6yq14o4c.js +0 -31
- package/out/_next/static/chunks/1l-dhswmn6dl_.js +0 -11
- package/out/_next/static/chunks/1rxncug86bump.js +0 -1
- package/out/_next/static/chunks/2n-4qa9h44lgj.js +0 -1
- package/out/_next/static/chunks/3n7dm2ojtyzwn.js +0 -1
- package/out/_next/static/chunks/3uta7d_6k863-.css +0 -1
- package/out/_next/static/chunks/turbopack-2xb6mmb6_q43u.js +0 -1
- package/out/_next/static/media/icon-1.008jpsm4iakzh.png +0 -0
- package/out/_next/static/sHP-sIMshwWXMCtdszRWm/_buildManifest.js +0 -11
- package/out/_next/static/sHP-sIMshwWXMCtdszRWm/_clientMiddlewareManifest.js +0 -1
- package/out/_next/static/sHP-sIMshwWXMCtdszRWm/_ssgManifest.js +0 -1
- package/out/_not-found/__next._full.txt +0 -16
- package/out/_not-found/__next._head.txt +0 -5
- package/out/_not-found/__next._index.txt +0 -6
- package/out/_not-found/__next._not-found.__PAGE__.txt +0 -5
- package/out/_not-found/__next._not-found.txt +0 -5
- package/out/_not-found/__next._tree.txt +0 -3
- package/out/_not-found/index.html +0 -1
- package/out/_not-found/index.txt +0 -16
- package/out/changelog/__next._full.txt +0 -573
- package/out/changelog/__next._head.txt +0 -5
- package/out/changelog/__next._index.txt +0 -6
- package/out/changelog/__next._tree.txt +0 -4
- package/out/changelog/__next.changelog.__PAGE__.txt +0 -560
- package/out/changelog/__next.changelog.txt +0 -5
- package/out/changelog/index.html +0 -550
- package/out/changelog/index.txt +0 -573
- package/out/github/dashboard/__next._full.txt +0 -20
- package/out/github/dashboard/__next._head.txt +0 -5
- package/out/github/dashboard/__next._index.txt +0 -6
- package/out/github/dashboard/__next._tree.txt +0 -3
- package/out/github/dashboard/__next.github.dashboard.__PAGE__.txt +0 -9
- package/out/github/dashboard/__next.github.dashboard.txt +0 -4
- package/out/github/dashboard/__next.github.txt +0 -5
- package/out/github/dashboard/index.html +0 -1
- package/out/github/dashboard/index.txt +0 -20
- package/out/index.html +0 -1
- package/out/index.txt +0 -18
- package/out/privacy-policy/__next._full.txt +0 -38
- package/out/privacy-policy/__next._head.txt +0 -5
- package/out/privacy-policy/__next._index.txt +0 -6
- package/out/privacy-policy/__next._tree.txt +0 -4
- package/out/privacy-policy/__next.privacy-policy.__PAGE__.txt +0 -23
- package/out/privacy-policy/__next.privacy-policy.txt +0 -5
- package/out/privacy-policy/index.html +0 -1
- package/out/privacy-policy/index.txt +0 -38
- package/out/terms-of-use/__next._full.txt +0 -37
- package/out/terms-of-use/__next._head.txt +0 -5
- package/out/terms-of-use/__next._index.txt +0 -6
- package/out/terms-of-use/__next._tree.txt +0 -4
- package/out/terms-of-use/__next.terms-of-use.__PAGE__.txt +0 -18
- package/out/terms-of-use/__next.terms-of-use.txt +0 -5
- package/out/terms-of-use/index.html +0 -1
- package/out/terms-of-use/index.txt +0 -37
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processing-diagnostic.js","sourceRoot":"","sources":["../../../src/cli/diagnostic/processing-diagnostic.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport { detectarArquetipos } from '@analysts/architects';\nimport { normalizarOcorrenciaParaJson } from '@cli/diagnostic';\nimport { traduzirRelatorioJson } from '@cli/diagnostic/exporters';\nimport { configurarFiltros, exibirBlocoFiltros, expandIncludes, listarAnalistas, processPatternGroups, processPatternListAchatado } from '@cli/processing';\nimport { chalk, config, isInsideConfigDirectory, isInsideSrc, isInsideTestsDirectory } from '@core/config';\nimport { executarInquisicao, iniciarInquisicao, registrarUltimasMetricas } from '@core/execution';\nimport { messages } from '@core/messages';\nimport { aplicarSupressaoOcorrencias } from '@core/parsing';\nimport { scanSystemIntegrity } from '@guardian';\nimport { emitirConselhoTutanus } from '@reports';\nimport { dedupeOcorrencias, stringifyJsonEscaped } from '@shared/data-processing';\n\n// Importar tipos centralizados (consolidado)\nimport { asTecnicas, converterResultadoGuardian, type FileEntry, type FileEntryWithAst, type FiltrosConfig, IntegridadeStatus, type LinguagensJson, type LogExtensions, type Ocorrencia, type OcorrenciaLimpa, type OpcoesProcessamentoDiagnostico, type ParseErrosJson, type ResultadoGuardian, type ResultadoProcessamentoDiagnostico, type SaidaJsonDiagnostico } from '@';\n\nimport type { ModuloPersistencia } from '../../types/shared/persistence.js';\n\n\nconst {\n log,\n logGuardian,\n logRelatorio,\n logSistema,\n MENSAGENS_AUTOFIX,\n CliProcessamentoExtraMensagens\n} = messages;\n\n// Persistência: usar helper centralizado, mas com resolver dinâmico para compat com mocks de teste\n\nlet salvarEstado: (caminho: string, dados: unknown) => Promise<void>;\n\ntype SalvarEstadoFn = ModuloPersistencia['salvarEstado'];\n\nasync function getSalvarEstado(): Promise<SalvarEstadoFn> {\n if (salvarEstado) return salvarEstado;\n const candidates = process.env.VITEST ? ['@shared/persistence/persistencia.js', '@shared/persistence/persistencia.ts'] : ['@shared/persistence/persistencia.js'];\n for (const caminho of candidates) {\n try {\n const mod: ModuloPersistencia | undefined = await import(caminho).catch(() => undefined);\n if (mod && typeof mod.salvarEstado === 'function') {\n salvarEstado = mod.salvarEstado;\n break;\n }\n } catch (err) {\n log.debug(`Erro em getSalvarEstado (importação dinâmica): ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n if (!salvarEstado) {\n const mod: ModuloPersistencia = await import('@shared/persistence');\n salvarEstado = mod.salvarEstado;\n }\n return salvarEstado;\n}\n// Reexports para compatibilidade com testes que importam utilitários diretamente deste módulo\nexport { configurarFiltros, getDefaultExcludes } from '@cli/processing';\n// registroAnalistas será importado dinamicamente quando necessário\n\n// Helpers deduplicação/agrupamento: agora centralizados em @shared/data-processing/ocorrencias\n\n// Constante para timeout de detecção de arquétipos (em milissegundos)\nconst DETECTAR_TEMPO_LIMITE_MS = process.env.VITEST ? 1000 : 30000;\n\n// Helper: detecção de arquétipos com timeout e absorção de rejeições\n\nasync function detectarArquetiposComTimeout(ctx: Parameters<typeof detectarArquetipos>[0], baseDir: Parameters<typeof detectarArquetipos>[1], options?: {\n quiet?: boolean;\n}): Promise<Awaited<ReturnType<typeof detectarArquetipos>> | undefined> {\n try {\n const detectPromise = detectarArquetipos(ctx, baseDir, options).catch(erro => {\n if (config.DEV_MODE) {\n const msg = erro instanceof Error ? erro.message : String(erro);\n log.erro(`Falha detector arquetipos: ${msg}`);\n }\n return undefined;\n });\n const timeoutPromise = new Promise<undefined>(resolve => setTimeout(() => resolve(undefined), DETECTAR_TEMPO_LIMITE_MS));\n return (await Promise.race([detectPromise, timeoutPromise])) as Awaited<ReturnType<typeof detectarArquetipos>> | undefined;\n } catch {\n return undefined;\n }\n}\n\n// Utilitários para processamento de filtros\n\n// Hook de teste: permite injetar uma ocorrência sintética mínima para\n// exercitar ramos de exportação e despedida sem custo alto de análise.\n\n// Expansão de includes: aceita diretórios sem curingas\n\n// Função para obter padrões de exclusão padrão do config\n// Função auxiliar para detectar o tipo de projeto (simplificada)\n\n// Função para configurar filtros no config global\n\n// Função auxiliar para sincronizar arrays de exclusão\n\n// Função para exibir bloco de filtros (verbose)\n\n// Helper: exporta ocorrências por nível (erro/aviso/info)\nasync function exportarPorNivel(\n ocorrenciasLimpas: OcorrenciaLimpa[],\n dir: string,\n id: string,\n salvar: (caminho: string, dados: unknown) => Promise<void>,\n): Promise<void> {\n const erros = ocorrenciasLimpas.filter(ocorrencia => ocorrencia.nivel === 'erro' || ocorrencia.tipo === 'PARSE_ERRO' || ocorrencia.nivel === 'critico');\n const avisos = ocorrenciasLimpas.filter(ocorrencia => ocorrencia.nivel === 'aviso' || ocorrencia.nivel === 'alto' || ocorrencia.nivel === 'media');\n const infos = ocorrenciasLimpas.filter(ocorrencia => ocorrencia.nivel === 'info' || ocorrencia.nivel === 'baixa' || !ocorrencia.nivel);\n if (erros.length > 0) {\n await salvar(path.join(dir, `erro-${id}.json`), {\n timestamp: new Date().toISOString(),\n total: erros.length,\n ocorrencias: erros,\n });\n }\n if (avisos.length > 0) {\n await salvar(path.join(dir, `aviso-${id}.json`), {\n timestamp: new Date().toISOString(),\n total: avisos.length,\n ocorrencias: avisos,\n });\n }\n if (infos.length > 0) {\n await salvar(path.join(dir, `info-${id}.json`), {\n timestamp: new Date().toISOString(),\n total: infos.length,\n ocorrencias: infos,\n });\n }\n}\n\n\nfunction computeLinguagens(fes: (FileEntry | FileEntryWithAst)[]): LinguagensJson {\n const extensoes: Record<string, number> = {};\n let sem_ext = 0;\n for (const arquivo of fes || []) {\n const rel = arquivo.relPath || arquivo.fullCaminho || '';\n const base = rel.split(/[\\\\/]/).pop() || '';\n const idx = base.lastIndexOf('.');\n if (idx === -1) {\n sem_ext++;\n } else {\n const ext = base.slice(idx + 1) || 'sem_ext';\n extensoes[ext] = (extensoes[ext] || 0) + 1;\n }\n }\n return { total: (fes || []).length, extensoes: { ...extensoes, sem_ext } };\n}\n\nfunction limparOcorrencia(oc: Ocorrencia): OcorrenciaLimpa {\n return {\n tipo: oc.tipo,\n nivel: oc.nivel,\n mensagem: oc.mensagem,\n relPath: oc.relPath,\n linha: oc.linha,\n coluna: oc.coluna,\n ...(oc.sugestao ? { sugestao: oc.sugestao } : {}),\n };\n}\n\nasync function executarAutoFixInterno(\n opts: OpcoesProcessamentoDiagnostico,\n ocorrenciasFiltradas: Ocorrencia[],\n fileEntriesComAst: FileEntryWithAst[],\n baseDir: string,\n totalOcorrencias: number,\n): Promise<{ ocorrenciasFiltradas: Ocorrencia[]; totalOcorrencias: number }> {\n if (!opts.autoFix) {\n return { ocorrenciasFiltradas, totalOcorrencias: ocorrenciasFiltradas.length };\n }\n try {\n const {\n findQuickFixes,\n applyQuickFix\n } = await import('@core/config/auto');\n const {\n getAutoFixConfig\n } = await import('@core/config/auto');\n\n let autoCorrecaoMode = opts.autoCorrecaoMode || 'balanced';\n if (opts.autoFixConservative) {\n autoCorrecaoMode = 'conservative';\n opts.autoFix = true;\n }\n const autoCorrecaoConfiguracao = getAutoFixConfig(autoCorrecaoMode);\n if (autoCorrecaoMode === 'conservative') {\n log.info(MENSAGENS_AUTOFIX.logs.modoConservador);\n } else if (autoCorrecaoMode === 'aggressive') {\n log.aviso(messages.CliProcessamentoDiagnosticoMensagens.autoFixModoAgressivo);\n }\n\n const quickFixesDisponiveis = ocorrenciasFiltradas.filter(occ => occ.tipo === 'auto-fix-disponivel' || occ.tipo === 'QUICK_FIX_DISPONIVEL');\n if (quickFixesDisponiveis.length === 0) {\n logSistema.autoFixNenhumaCorrecao();\n return { ocorrenciasFiltradas, totalOcorrencias: ocorrenciasFiltradas.length };\n }\n\n logSistema.autoFixAplicando(autoCorrecaoMode);\n let arquivosCorrigidos = 0;\n let totalCorrecoes = 0;\n let correcoesPuladas = 0;\n\n const correcoesPorArquivo = new Map<string, typeof quickFixesDisponiveis>();\n for (const fix of quickFixesDisponiveis) {\n const arquivo = fix.relPath || fix.arquivo;\n if (!arquivo) continue;\n if (!correcoesPorArquivo.has(arquivo)) {\n correcoesPorArquivo.set(arquivo, []);\n }\n correcoesPorArquivo.get(arquivo)?.push(fix);\n }\n\n const maxFixesPerArquivo = autoCorrecaoConfiguracao?.maxFixesPerArquivo ?? Infinity;\n for (const [arquivo, _fixes] of correcoesPorArquivo) {\n try {\n const fileEntrada = fileEntriesComAst?.find(fe => fe.relPath === arquivo || fe.fullCaminho === arquivo);\n if (!fileEntrada || typeof fileEntrada.content !== 'string') {\n logSistema.autoFixArquivoNaoEncontrado(arquivo);\n continue;\n }\n let codigoCorrigido = fileEntrada.content;\n let corrigiuAlgo = false;\n let correcoesPorArquivoContagem = 0;\n\n const quickFixesEncontrados = findQuickFixes(codigoCorrigido, undefined, autoCorrecaoConfiguracao, arquivo);\n for (const quickCorrecao of quickFixesEncontrados) {\n if (correcoesPorArquivoContagem >= maxFixesPerArquivo) {\n correcoesPuladas += quickCorrecao.matches.length;\n break;\n }\n for (const match of quickCorrecao.matches) {\n try {\n const novocodigo = applyQuickFix(codigoCorrigido, quickCorrecao, match);\n if (novocodigo !== codigoCorrigido) {\n codigoCorrigido = novocodigo;\n corrigiuAlgo = true;\n totalCorrecoes++;\n correcoesPorArquivoContagem++;\n if (config.VERBOSE) {\n logSistema.autoFixAplicada(quickCorrecao.title, quickCorrecao.confidence);\n }\n }\n } catch (err) {\n logSistema.autoFixFalha(quickCorrecao.id, err instanceof Error ? err.message : String(err));\n }\n if (correcoesPorArquivoContagem >= maxFixesPerArquivo) {\n break;\n }\n }\n }\n\n if (corrigiuAlgo) {\n const {\n promises: fs\n } = await import('node:fs');\n const caminhoCompleto = path.isAbsolute(arquivo) ? arquivo : path.join(baseDir, arquivo);\n await fs.writeFile(caminhoCompleto, codigoCorrigido, 'utf-8');\n arquivosCorrigidos++;\n if (config.VERBOSE) {\n logSistema.autoFixCorrigido(arquivo);\n }\n }\n } catch (err) {\n log.erro(CliProcessamentoExtraMensagens.erroAplicarCorrecoes.replace('{erro}', err instanceof Error ? err.message : String(err)));\n }\n }\n\n if (arquivosCorrigidos > 0) {\n const estatisticas = [`${totalCorrecoes} correções aplicadas em ${arquivosCorrigidos} arquivo(s)`];\n if (correcoesPuladas > 0) {\n estatisticas.push(`${correcoesPuladas} correções puladas (limite por arquivo: ${maxFixesPerArquivo === Infinity ? '∞' : maxFixesPerArquivo})`);\n }\n if (autoCorrecaoMode === 'conservative') {\n estatisticas.push('modo conservador (alta confiança apenas)');\n }\n logSistema.autoFixEstatisticas(estatisticas);\n\n if (process.env.TUTANUS_ESLINT_VALIDATION !== '0' && autoCorrecaoConfiguracao.validateAfterFix) {\n try {\n log.info(MENSAGENS_AUTOFIX.logs.validacaoEslint);\n const {\n spawn\n } = await import('node:child_process');\n\n const arquivosParaValidar = Array.from(correcoesPorArquivo.keys());\n if (arquivosParaValidar.length > 0) {\n const eslintArgs = ['--fix', ...arquivosParaValidar];\n const proc = spawn('npx', ['eslint', ...eslintArgs], {\n cwd: baseDir,\n stdio: 'pipe'\n });\n let stdout = '';\n let _stderr = '';\n proc.stdout?.on('data', data => {\n stdout += data;\n });\n proc.stderr?.on('data', data => {\n _stderr += data;\n });\n const ESLINT_TIMEOUT_MS = 30_000;\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n proc.kill();\n resolve();\n }, ESLINT_TIMEOUT_MS);\n const done = () => {\n clearTimeout(timer);\n resolve();\n };\n proc.on('close', code => {\n if (code === 0) {\n logSistema.autoFixESLintHarmonia();\n } else {\n if (config.VERBOSE && stdout) {\n logSistema.processamentoESLintOutput(stdout);\n }\n logSistema.autoFixESLintAjustes();\n }\n done();\n });\n proc.on('error', err => {\n logSistema.autoFixESLintFalha(err.message);\n done();\n });\n });\n }\n } catch (err) {\n log.aviso(`[AVISO] Validação ESLint não executada: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n } else {\n logSistema.autoFixNenhumaAplicada();\n }\n\n const ocorrenciasSemQuickFixes = ocorrenciasFiltradas.filter(occ => occ.tipo !== 'auto-fix-disponivel' && occ.tipo !== 'QUICK_FIX_DISPONIVEL');\n return { ocorrenciasFiltradas: ocorrenciasSemQuickFixes, totalOcorrencias: ocorrenciasSemQuickFixes.length };\n } catch (err) {\n log.erro(`[ERRO] Falha ao executar auto-fix: ${err instanceof Error ? err.message : String(err)}`);\n return { ocorrenciasFiltradas, totalOcorrencias };\n }\n}\n\n// Função principal de processamento do diagnóstico\n\nexport async function processarDiagnostico(opts: OpcoesProcessamentoDiagnostico): Promise<ResultadoProcessamentoDiagnostico> {\n // Modo monorepo: auto-descobre workspaces e analisa cada pacote\n if (opts.monorepo && !opts.paths?.length) {\n try {\n const { detectarMonorepo } = await import('@analysts/detectors');\n const info = detectarMonorepo(process.cwd());\n if (info.isMonorepo && info.workspaces.length > 0) {\n const dirs = info.workspaces.map(w => w.dir);\n opts.paths = dirs;\n log.sucesso(`Monorepo detectado: ${info.workspaces.length} workspaces (${info.type})`);\n } else {\n log.aviso('Modo monorepo ativado mas nenhum workspace foi encontrado');\n }\n } catch (err) {\n log.aviso(`Falha ao detectar monorepo: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Suporte a múltiplos projetos: se --path foi fornecido, executa para cada um e mescla resultados\n const projectPaths = opts.paths?.filter(Boolean) ?? [];\n if (projectPaths.length > 0) {\n const resultados: Ocorrencia[] = [];\n let totalArquivos = 0;\n const metricasAnalistas: import('@').MetricaAnalista[] = [];\n\n const analisarProjeto = async (projetoPath: string) => {\n const projetoNome = path.basename(projetoPath);\n const cwdAnterior = process.cwd();\n try {\n process.chdir(projetoPath);\n const subOpts = { ...opts, paths: undefined };\n const subResult = await processarDiagnosticoInterno(subOpts);\n if (subResult) {\n const ocorr = subResult.resultadoFinal?.ocorrencias ?? [];\n const tagged = ocorr.map(o => ({\n ...o,\n projeto: projetoNome,\n mensagem: `[${projetoNome}] ${o.mensagem}`\n }));\n return { tagged, totalArquivos: subResult.resultadoFinal?.metricas?.totalArquivos ?? 0, analistas: subResult.resultadoFinal?.metricas?.analistas ?? [] };\n }\n return { tagged: [], totalArquivos: 0, analistas: [] };\n } catch (err) {\n log.aviso(`Falha ao analisar projeto ${projetoNome}: ${err instanceof Error ? err.message : String(err)}`);\n return { tagged: [], totalArquivos: 0, analistas: [] };\n } finally {\n process.chdir(cwdAnterior);\n }\n };\n\n const resultadosProjetos = await Promise.all(projectPaths.map(analisarProjeto));\n for (const r of resultadosProjetos) {\n resultados.push(...r.tagged);\n totalArquivos += r.totalArquivos;\n metricasAnalistas.push(...r.analistas);\n }\n\n // Emite JSON consolidado com todos os projetos\n if (opts.json) {\n const saidaJson = {\n meta: { multiProjeto: true, projetos: projectPaths.length, totalOcorrencias: resultados.length },\n totalArquivos,\n ocorrencias: resultados,\n metricas: { analistas: metricasAnalistas }\n };\n console.log(JSON.stringify(saidaJson, null, 2));\n } else {\n log.sucesso(`Análise multi-projeto concluída: ${projectPaths.length} projetos, ${resultados.length} ocorrências`);\n }\n\n return {\n totalOcorrencias: resultados.length,\n temErro: false,\n fileEntriesComAst: [],\n resultadoFinal: { ocorrencias: resultados, metricas: { totalArquivos, tempoTotal: 0, analistas: metricasAnalistas } }\n };\n }\n\n const resultado = await processarDiagnosticoInterno(opts);\n return resultado ?? {\n totalOcorrencias: 0,\n temErro: false,\n guardianResultado: undefined,\n fileEntriesComAst: [],\n resultadoFinal: {\n ocorrencias: [],\n metricas: { totalArquivos: 0, tempoTotal: 0, analistas: [] }\n }\n };\n}\n\ntype OptsComExtras = OpcoesProcessamentoDiagnostico & {\n compact?: boolean;\n trustCompiler?: boolean;\n verifyCycles?: boolean;\n};\n\nasync function processarDiagnosticoInterno(opts: OpcoesProcessamentoDiagnostico): Promise<ResultadoProcessamentoDiagnostico | undefined> {\n const logExt = log as typeof log & LogExtensions;\n const optsDyn = opts as OptsComExtras;\n const configDyn = config as unknown as Record<string, unknown>;\n\n // Configurar flags globais\n config.GUARDIAN_ENABLED = opts.guardianCheck ?? false;\n config.VERBOSE = opts.full ?? false;\n if (optsDyn.compact !== undefined) {\n config.COMPACT_MODE = Boolean(optsDyn.compact);\n } else {\n config.COMPACT_MODE = !opts.full;\n }\n\n if (opts.logNivel && ['erro', 'aviso', 'info', 'debug'].includes(opts.logNivel)) {\n config.LOG_LEVEL = opts.logNivel as 'erro' | 'aviso' | 'info' | 'debug';\n }\n\n if (opts.stream) {\n config.REPORT_STREAM_ENABLED = true;\n }\n\n // Processar filtros\n const includeGroupsRaw = processPatternGroups(opts.include);\n const includeGroupsExpanded = includeGroupsRaw.map(grupo => expandIncludes(grupo));\n const includeListFlat = includeGroupsExpanded.flat();\n const excludeList = processPatternListAchatado(opts.exclude);\n const incluiNodeModules = includeListFlat.some(caminho => /node_modules/.test(caminho));\n\n // Exibir bloco de filtros se verbose\n exibirBlocoFiltros(includeGroupsExpanded, includeListFlat, excludeList, incluiNodeModules);\n\n // Configurar filtros no config global\n configurarFiltros(includeGroupsRaw, includeListFlat, excludeList, incluiNodeModules);\n const baseDir = process.cwd();\n let guardianResultado: ResultadoGuardian | undefined;\n let fileEntries: FileEntryWithAst[] = [];\n let totalOcorrencias = 0;\n let _jsonEmitted = false;\n\n // Listar analistas se solicitado\n if (opts.listarAnalistas && !opts.json) {\n await listarAnalistas();\n }\n\n // Nota: antigamente tentávamos resolver dinamicamente uma outra\n // instância de `log` aqui (usando casts para `any`) para compatibilidade\n // com mocks; atualmente usamos o `log` importado estaticamente e, quando\n // necessário, importamos dinamicamente nos trechos locais onde isto é\n // requisitado pelos testes. Isso evita uso de `any` e elimina variáveis\n // não utilizadas.\n\n try {\n // Fase inicial do diagnóstico\n if (opts.json) {\n // Suprime cabeçalhos verbosos no modo JSON\n } else if (!config.COMPACT_MODE) {\n logExt.fase?.('Iniciando diagnóstico completo');\n } else {\n logExt.fase?.('Diagnóstico (modo compacto)');\n }\n\n // 1) Primeira varredura rápida (sem AST) apenas para obter entries e opcionalmente rodar Guardian\n logExt.fase?.('Varredura');\n const leituraInicial = await iniciarInquisicao(baseDir, {\n incluirMetadados: false,\n skipExec: true\n });\n fileEntries = leituraInicial.fileEntries; // contém conteúdo mas sem AST\n\n // Criação e/ou salvamento de arquétipo personalizado sob demanda\n if (opts.criarArquetipo) {\n try {\n const norm = (caminho: string) => caminho.replace(/\\\\/g, '/');\n const dirSet = new Set<string>();\n const arquivosRaiz: string[] = [];\n for (const fe of fileEntries) {\n const rel = norm(fe.relPath || fe.fullCaminho || '');\n if (!rel) continue;\n if (!rel.includes('/')) {\n arquivosRaiz.push(rel);\n }\n const parts = rel.split('/');\n if (parts.length > 1) {\n // acumula prefixos de diretórios: ex.: src/a/b -> 'src', 'src/a', 'src/a/b'\n for (let indice = 1; indice < parts.length; indice++) {\n const dirPath = parts.slice(0, indice).join('/');\n if (dirPath) dirSet.add(dirPath);\n }\n }\n }\n\n // Tenta obter nome do projeto a partir do package.json (preferência: fileEntries; fallback: disco)\n let nomeProjeto = path.basename(baseDir);\n try {\n const pkg = fileEntries?.find(fe => /(^|[\\\\/])package\\.json$/.test(fe.relPath || fe.fullCaminho));\n if (pkg && typeof pkg.content === 'string' && pkg.content.trim()) {\n const parsed = JSON.parse(pkg.content);\n if (parsed && typeof parsed.name === 'string' && parsed.name.trim()) {\n nomeProjeto = parsed.name.trim();\n }\n } else {\n const pkgCaminho = path.join(baseDir, 'package.json');\n try {\n const raw = await fs.promises.readFile(pkgCaminho, 'utf-8');\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed.name === 'string' && parsed.name.trim()) {\n nomeProjeto = parsed.name.trim();\n }\n } catch (err) {\n log.debug(`Erro ao ler package.json (fallback): ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n } catch (err) {\n log.debug(`Erro ao obter nome do projeto do package.json: ${err instanceof Error ? err.message : String(err)}`);\n }\n const estruturaDetectada = Array.from(dirSet);\n const {\n criarTemplateArquetipoPersonalizado,\n salvarArquetipoPersonalizado\n } = await import('@analysts/architects');\n const arquetipo = criarTemplateArquetipoPersonalizado(nomeProjeto, estruturaDetectada, arquivosRaiz, 'generico');\n if (opts.salvarArquetipo) {\n await salvarArquetipoPersonalizado(arquetipo, baseDir);\n } else if (config.VERBOSE) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.templateArquetipoPreview);\n }\n } catch (erro) {\n log.aviso(`Falha ao gerar/salvar arquétipo personalizado: ${erro instanceof Error ? erro.message : String(erro)}`);\n }\n }\n\n // Executar Guardian se solicitado\n if (config.GUARDIAN_ENABLED) {\n // Usa optional chaining para evitar erro quando o mock não prover `fase`\n logExt.fase?.('Verificando integridade do Tutanus');\n try {\n const resultado = await scanSystemIntegrity(fileEntries, {\n suppressLogs: true\n });\n guardianResultado = resultado;\n switch (resultado.status) {\n case IntegridadeStatus.Ok:\n logGuardian.integridadeOk();\n break;\n case IntegridadeStatus.Criado:\n logGuardian.baselineCriado();\n break;\n case IntegridadeStatus.Aceito:\n logGuardian.baselineAceito();\n break;\n case IntegridadeStatus.AlteracoesDetectadas:\n logGuardian.alteracoesDetectadas();\n totalOcorrencias++;\n break;\n }\n } catch (err) {\n logGuardian.bloqueado();\n if (config.GUARDIAN_ENFORCE_PROTECTION && typeof err === 'object' && err && 'detalhes' in err && Array.isArray((err as {\n detalhes?: unknown;\n }).detalhes)) {\n (err as {\n detalhes: string[];\n }).detalhes.forEach(diretorio => {\n logGuardian.aviso(diretorio);\n });\n if (!process.env.VITEST) {\n try {\n process.exit(1);\n } catch (erro) {\n throw erro;\n }\n }\n } else {\n logGuardian.modoPermissivo();\n }\n }\n }\n\n // Se modo somente varredura estiver ativo, encerramos após coleta inicial\n if (config.SCAN_ONLY) {\n log.info(chalk.bold(`\\n`));\n logGuardian.scanOnly(fileEntries.length);\n if (config.REPORT_EXPORT_ENABLED) {\n try {\n const ts = new Date().toISOString().replace(/[:.]/g, '-');\n const dir = typeof config.REPORT_OUTPUT_DIR === 'string' ? config.REPORT_OUTPUT_DIR : path.join(baseDir, 'reports');\n const fs = await import('node:fs');\n await fs.promises.mkdir(dir, {\n recursive: true\n });\n const nome = `tutanus-scan-${ts}`;\n const resumo = {\n modo: 'scan-only',\n totalArquivos: fileEntries.length,\n timestamp: new Date().toISOString()\n };\n const salvar = await getSalvarEstado();\n await salvar(path.join(dir, `${nome}.json`), resumo);\n log.sucesso(messages.CliProcessamentoDiagnosticoMensagens.relatorioScanSalvo(dir));\n } catch (erro) {\n const msg = messages.CliProcessamentoDiagnosticoMensagens.falhaExportarRelatorioScanOnly(erro instanceof Error ? erro.message : String(erro));\n log.erro(msg);\n }\n }\n if (opts.json) {\n console.log(JSON.stringify({\n modo: 'scan-only',\n totalArquivos: fileEntries.length\n }));\n }\n // Evita encerramento forçado em testes/ambiente de automação\n if (!process.env.VITEST && !opts.json) process.exit(0); else if (!process.env.VITEST && opts.json) process.exitCode = 0;\n return {\n totalOcorrencias: 0,\n temErro: false,\n guardianResultado,\n fileEntriesComAst: [],\n resultadoFinal: {\n ocorrencias: [],\n metricas: {\n totalArquivos: 0,\n tempoTotal: 0,\n analistas: []\n }\n }\n };\n }\n // (bloco de criação de arquétipo removido)\n\n // Parsing lazy: ASTs são parseados sob demanda via ScopeAstCache\n // Suporte ao fast-mode: reduz carga (parcialmente) quando ativo\n const fastMode = Boolean(opts.fast);\n let fileEntriesComAst: FileEntryWithAst[] = fileEntries.map(entry => ({\n ...entry,\n ast: undefined\n }));\n if (fastMode) {\n // Se houver convenções específicas para fastMode no config, tenta aplicá-las (mesmo que simplificado)\n const fmConfig = configDyn.fastMode as Record<string, unknown> | undefined;\n if (fmConfig?.conventions && typeof fmConfig.conventions === 'object') {\n Object.assign(config.conventions, fmConfig.conventions);\n }\n\n // Heurística robusta: prioriza arquivos em src/ e ignora testes/configs/docs usando convenções\n fileEntriesComAst = fileEntriesComAst.filter(fe => {\n const rel = fe.relPath || fe.fullCaminho || '';\n if (!rel) return false;\n\n // Deve estar em src (ou equivalente como codigo/source)\n const isSrc = isInsideSrc(rel);\n // Não deve ser teste ou configuração\n const isTest = isInsideTestsDirectory(rel);\n const isConfig = isInsideConfigDirectory(rel);\n return isSrc && !isTest && !isConfig;\n });\n }\n\n // Detectar arquétipos (pode retornar undefined em casos mínimos)\n const arquetiposResultado: Awaited<ReturnType<typeof detectarArquetipos>> | undefined = await detectarArquetiposComTimeout({\n arquivos: fileEntriesComAst,\n baseDir\n }, baseDir, {\n quiet: opts.json\n });\n\n // Continuar com o processamento restante...\n // Em fast-mode, reduz o conjunto de analistas para acelerar\n const registro = (await import('@analysts/registry')).registroAnalistas;\n let tecnicas = asTecnicas(registro);\n if (fastMode) {\n const fmFastMode = configDyn.fastMode as Record<string, unknown> | undefined;\n const includeList = Array.isArray(fmFastMode?.analystsInclude) ? fmFastMode.analystsInclude as string[] : [];\n const excludeList = Array.isArray(fmFastMode?.analystsExclude) ? fmFastMode.analystsExclude as string[] : [];\n tecnicas = asTecnicas((registro as (import('@').Analista | import('@').Tecnica)[]).filter(arquivo => {\n const nomeRaw = arquivo.nome || '';\n const norm = (string: string) => string.toLowerCase().replace(/[^a-z0-9]+/g, '-');\n const nome = norm(nomeRaw);\n const matchIncluir = includeList.length ? includeList.some(node => {\n const nn = norm(node);\n return nome.includes(nn) || nomeRaw.toLowerCase().includes(node.toLowerCase());\n }) : true;\n const matchExcluir = excludeList.some(node => {\n const nn = norm(node);\n return nome.includes(nn) || nomeRaw.toLowerCase().includes(node.toLowerCase());\n });\n return matchIncluir && !matchExcluir;\n }));\n }\n logExt.fase?.('Executando analistas');\n\n // Flags especiais (disponíveis para detectores/analistas via config global)\n try {\n const verifyCycles = Boolean(optsDyn.verifyCycles || configDyn.SPECIAL_VERIFY_CYCLES);\n configDyn.SPECIAL_VERIFY_CYCLES = verifyCycles;\n } catch (err) {\n log.debug(`Erro ao configurar flags especiais (verifyCycles): ${err instanceof Error ? err.message : String(err)}`);\n }\n const resultadoExecucao = await executarInquisicao(fileEntriesComAst, tecnicas, baseDir, converterResultadoGuardian(guardianResultado), {\n verbose: config.VERBOSE,\n compact: config.COMPACT_MODE,\n fast: opts.fast, // undefined = auto (worker pool > threshold), true = força, false = sequencial\n });\n\n // Processar métricas e ocorrências\n registrarUltimasMetricas(resultadoExecucao.metricas);\n // Deduplica ocorrências repetidas para reduzir ruído no orquestrador\n let ocorrenciasFiltradas = dedupeOcorrencias(resultadoExecucao.ocorrencias || []);\n // Trust Compiler: se habilitado, reduzir ocorrências quando TS/ESLint não reportam\n const trustCompiler = Boolean(optsDyn.trustCompiler || configDyn.SPECIAL_TRUST_COMPILER);\n if (trustCompiler) {\n try {\n fs.statSync(path.join(baseDir, 'tsconfig.json'));\n ocorrenciasFiltradas = ocorrenciasFiltradas.filter(ocorrencia => {\n const regra = ocorrencia.tipo || '';\n // regras que o compilador/ESLint normalmente cobrem\n const cobertas = [/import.*nao.*usado/i, /tipo-inseguro.*unknown/i];\n return !cobertas.some(raiz => raiz.test(regra));\n });\n } catch (err) {\n log.debug(`Erro em processarDiagnostico (trustCompiler): ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n // Conciliação simples entre analistas: rebaixa severidade em casos de conflito\n try {\n const byLoc = new Map<string, {\n tipos: Set<string>;\n items: Ocorrencia[];\n }>();\n for (const ocorrencia of ocorrenciasFiltradas) {\n const key = `${ocorrencia.relPath || ''}:${ocorrencia.linha || 0}`;\n const tipo = ocorrencia.tipo || '';\n if (!byLoc.has(key)) byLoc.set(key, {\n tipos: new Set<string>(),\n items: []\n });\n const entry = byLoc.get(key);\n if (!entry) continue;\n entry.tipos.add(tipo);\n entry.items.push(ocorrencia);\n }\n for (const [, entry] of byLoc) {\n const tipos = Array.from(entry.tipos);\n const hasTipoUnsafe = tipos.some(t => t.startsWith('tipo-inseguro'));\n const hasComplexity = tipos.some(t => /complexidade|funcoes-longas/i.test(t));\n if (hasTipoUnsafe && hasComplexity) {\n for (const item of entry.items) {\n const tipo = String(item.tipo || '');\n if (tipo.startsWith('tipo-inseguro')) {\n item.nivel = 'aviso';\n item.mensagem = `${item.mensagem} | Conciliação: inferência e tipagem explícita em conflito; revisar caso`;\n }\n }\n }\n }\n } catch (err) {\n log.debug(`Erro em processarDiagnostico (conciliação analistas): ${err instanceof Error ? err.message : String(err)}`);\n }\n // Aplicar supressões configuradas em tutanus.config.json\n ocorrenciasFiltradas = aplicarSupressaoOcorrencias(ocorrenciasFiltradas, config as FiltrosConfig | undefined);\n const totalOcorrenciasProcessadas = ocorrenciasFiltradas.length;\n\n // [LANCAMENTO] PROCESSAMENTO DE FLAGS INTUITIVAS\n // Mapear flags intuitivas para as flags internas\n if (opts.fix && !opts.autoFix) {\n opts.autoFix = true;\n logSistema.processamentoFixDetectada();\n }\n if (opts.fixSafe && !opts.autoFixConservative) {\n opts.autoFixConservative = true;\n opts.autoFix = true;\n log.info(MENSAGENS_AUTOFIX.flags.fixSafe);\n }\n\n const autoFixResult = await executarAutoFixInterno(opts, ocorrenciasFiltradas, fileEntriesComAst, baseDir, totalOcorrencias);\n ocorrenciasFiltradas = autoFixResult.ocorrenciasFiltradas;\n totalOcorrencias = autoFixResult.totalOcorrencias;\n\n // Logging básico sempre, detalhado para --verbose e --debug\n const tiposOcorrencias = new Map<string, number>();\n const nivelOcorrencias = new Map<string, number>();\n ocorrenciasFiltradas.forEach(ocorrencia => {\n const tipo = ocorrencia.tipo || 'DESCONHECIDO';\n const nivel = ocorrencia.nivel || 'info';\n tiposOcorrencias.set(tipo, (tiposOcorrencias.get(tipo) || 0) + 1);\n nivelOcorrencias.set(nivel, (nivelOcorrencias.get(nivel) || 0) + 1);\n });\n if (tiposOcorrencias.size > 0 && !opts.json) {\n // Modo executivo: mostrar resumo executivo conciso e acionável\n if (opts.executive) {\n try {\n const criticos = nivelOcorrencias.get('erro') || 0;\n const altos = nivelOcorrencias.get('alto') || 0;\n const total = totalOcorrenciasProcessadas;\n\n // Top arquivos por ocorrências (somente erros/avisos críticos para executivo)\n const arquivoContagem = new Map<string, number>();\n for (const oc of ocorrenciasFiltradas) {\n const pathChave = (oc.relPath || oc.arquivo || 'desconhecido') as string;\n const nivel = oc.nivel || 'info';\n if (nivel === 'erro' || nivel === 'alto') {\n arquivoContagem.set(pathChave, (arquivoContagem.get(pathChave) || 0) + 1);\n }\n }\n const topArquivos = Array.from(arquivoContagem.entries()).sort((arquivo, base) => base[1] - arquivo[1]).slice(0, 5);\n const header = messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoHeader(total, criticos, altos);\n if (typeof logExt.imprimirBloco === 'function') {\n const linhas = [messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoCriticos(criticos), messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoAltos(altos), messages.CliProcessamentoDiagnosticoMensagens.linhaEmBranco, messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoTopArquivosErrosAltos, ...topArquivos.map(([arquivo, elem]) => messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoBulletTopArquivo(arquivo, elem)), messages.CliProcessamentoDiagnosticoMensagens.linhaEmBranco, messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoAcaoSugerida];\n logExt.imprimirBloco(header, linhas);\n } else {\n log.info(header);\n if (topArquivos.length > 0) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoTopArquivosErrosAltos);\n topArquivos.forEach(([arquivo, elem]) => log.info(messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoBulletTopArquivo(arquivo, elem)));\n }\n log.info(messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoAcaoSugerida);\n }\n } catch {\n // não crítico\n }\n }\n // Resumo básico sempre (não verbose e não executive)\n else if (!config.VERBOSE && !config.DEV_MODE) {\n logSistema.processamentoResumoOcorrencias(totalOcorrenciasProcessadas);\n\n // Top 5 tipos mais comuns\n const topTipos = Array.from(tiposOcorrencias.entries()).sort((arquivo, base) => base[1] - arquivo[1]).slice(0, 10);\n console.log(messages.CliProcessamentoDiagnosticoMensagens.linhaEmBranco);\n console.log(messages.CliProcessamentoDiagnosticoMensagens.principaisTiposTitulo);\n topTipos.forEach(([tipo, count]) => {\n console.log(messages.CliProcessamentoDiagnosticoMensagens.principaisTiposLinha(tipo, count));\n });\n\n // Mini top arquivos (10) para ação rápida\n try {\n const arquivoContagem = new Map<string, number>();\n for (const oc of ocorrenciasFiltradas) {\n const pathChave = (oc.relPath || oc.arquivo || 'desconhecido') as string;\n arquivoContagem.set(pathChave, (arquivoContagem.get(pathChave) || 0) + 1);\n }\n const topArquivos = Array.from(arquivoContagem.entries()).sort((arquivo, base) => base[1] - arquivo[1]).slice(0, 10);\n if (topArquivos.length > 0) {\n console.log(messages.CliProcessamentoDiagnosticoMensagens.linhaEmBranco);\n console.log(messages.CliProcessamentoDiagnosticoMensagens.topArquivosTitulo);\n topArquivos.forEach(([arquivo, elem]) => console.log(messages.CliProcessamentoDiagnosticoMensagens.topArquivosLinha(arquivo, elem)));\n }\n } catch {\n /* ignore */\n }\n console.log(messages.CliProcessamentoDiagnosticoMensagens.linhaEmBranco);\n logSistema.processamentoDicasContextuais();\n\n // Dicas baseadas no conteúdo real encontrado\n const totalTodos = tiposOcorrencias.get('TODO_PENDENTE') || 0;\n const totalQuickFixes = (tiposOcorrencias.get('QUICK_FIX_DISPONIVEL') || 0) + (tiposOcorrencias.get('auto-fix-disponivel') || 0);\n const totalErros = nivelOcorrencias.get('erro') || 0;\n const totalAvisos = nivelOcorrencias.get('aviso') || 0;\n if (totalErros > 0) {\n logSistema.processamentoErrosCriticos(totalErros);\n }\n if (totalAvisos > 0) {\n logSistema.processamentoAvisosEncontrados(totalAvisos);\n }\n if (totalQuickFixes > 10) {\n logSistema.processamentoQuickFixesMuitos(totalQuickFixes);\n logSistema.processamentoQuickFixesComando();\n logSistema.processamentoQuickFixesExecutar();\n } else if (totalQuickFixes > 0) {\n logSistema.processamentoQuickFixesMuitos(totalQuickFixes);\n logSistema.processamentoQuickFixesComando();\n logSistema.processamentoQuickFixesExecutar();\n }\n if (totalTodos > 50) {\n logSistema.processamentoTodosMuitos(totalTodos);\n } else if (totalTodos > 0) {\n logSistema.processamentoTodosPoucos(totalTodos);\n }\n const MAX_OCORRENCIAS_WARN_THRESHOLD = 1000;\n if (totalOcorrenciasProcessadas > MAX_OCORRENCIAS_WARN_THRESHOLD) {\n logSistema.processamentoMuitasOcorrencias();\n logSistema.processamentoFiltrarPasta();\n }\n logSistema.processamentoUsarFull();\n logSistema.processamentoUsarJson();\n if (totalOcorrenciasProcessadas < 100) {\n logSistema.processamentoProjetoLimpo();\n }\n } else {\n // Detalhamento completo para --verbose (ou quando --full ativo)\n logSistema.processamentoDetalhamentoOcorrencias(totalOcorrenciasProcessadas);\n\n // Mostrar por tipo\n log.info(messages.CliProcessamentoDiagnosticoMensagens.porTipoTitulo);\n Array.from(tiposOcorrencias.entries()).sort((arquivo, base) => base[1] - arquivo[1]).forEach(([tipo, count]) => {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.porTipoLinha(tipo, count));\n });\n\n // Mostrar por nível de severidade\n log.info(messages.CliProcessamentoDiagnosticoMensagens.porSeveridadeTitulo);\n Array.from(nivelOcorrencias.entries()).sort((arquivo, base) => base[1] - arquivo[1]).forEach(([nivel, count]) => {\n const emoji = nivel === 'erro' ? '🔴' : nivel === 'aviso' ? '🟡' : '🔵';\n log.info(messages.CliProcessamentoDiagnosticoMensagens.porSeveridadeLinha(emoji, nivel, count));\n });\n\n // Adicionar top arquivos com contagem (útil para investigação)\n try {\n const arquivosContagem = new Map<string, number>();\n for (const oc of ocorrenciasFiltradas) {\n const key = (oc.relPath || oc.arquivo || 'desconhecido') as string;\n arquivosContagem.set(key, (arquivosContagem.get(key) || 0) + 1);\n }\n const topArquivosAll = Array.from(arquivosContagem.entries()).sort((arquivo, base) => base[1] - arquivo[1]).slice(0, 10);\n if (topArquivosAll.length) {\n if (typeof logExt.imprimirBloco === 'function') {\n const linhas = [messages.CliProcessamentoDiagnosticoMensagens.topArquivosPorOcorrenciasTitulo, ...topArquivosAll.map(([arquivo, elem]) => messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoBulletTopArquivo(arquivo, elem))];\n logExt.imprimirBloco(messages.CliProcessamentoDiagnosticoMensagens.arquivosMaisOcorrenciasTitulo, linhas);\n } else {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.topArquivosPorOcorrenciasTitulo);\n topArquivosAll.forEach(([arquivo, elem]) => log.info(messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoBulletTopArquivo(arquivo, elem)));\n }\n }\n\n // Top críticos imediatos (erros/alto) para ação rápida\n const criticosOuAltos: Array<{\n arquivo: string;\n tipo: string;\n nivel: string;\n linha?: number;\n coluna?: number;\n }> = [];\n for (const oc of ocorrenciasFiltradas) {\n const nivel = (oc.nivel || 'info').toString().toLowerCase();\n if (nivel === 'erro' || nivel === 'alto') {\n criticosOuAltos.push({\n arquivo: oc.relPath || oc.arquivo || 'desconhecido',\n tipo: oc.tipo || 'desconhecido',\n nivel,\n linha: typeof oc.linha === 'number' ? oc.linha : undefined,\n coluna: typeof oc.coluna === 'number' ? oc.coluna : undefined\n });\n }\n }\n // Ordenação por severidade: erro > alto > aviso (se houver)\n const ordemNivel = (node: string) => node === 'erro' ? 3 : node === 'alto' ? 2 : node === 'aviso' ? 1 : 0;\n const topCriticos = criticosOuAltos.sort((arquivo, base) => ordemNivel(base.nivel) - ordemNivel(arquivo.nivel)).slice(0, 10);\n if (topCriticos.length) {\n if (typeof logExt.imprimirBloco === 'function') {\n const linhas = topCriticos.map(elem => {\n const pos = typeof elem.linha === 'number' ? `:${elem.linha}${typeof elem.coluna === 'number' ? `:${elem.coluna}` : ''}` : '';\n return messages.CliProcessamentoDiagnosticoMensagens.topCriticosLinha(elem.nivel.toUpperCase(), elem.tipo, elem.arquivo, pos);\n });\n logExt.imprimirBloco(messages.CliProcessamentoDiagnosticoMensagens.topCriticosTitulo, linhas);\n } else {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.topCriticosTituloComDoisPontos);\n topCriticos.forEach(elem => {\n const pos = typeof elem.linha === 'number' ? `:${elem.linha}${typeof elem.coluna === 'number' ? `:${elem.coluna}` : ''}` : '';\n log.info(messages.CliProcessamentoDiagnosticoMensagens.topCriticosLinha(elem.nivel.toUpperCase(), elem.tipo, elem.arquivo, pos));\n });\n }\n }\n\n // Amostra de ocorrências (limite para não poluir o terminal)\n const SAMPLE_MAX = 50;\n const sample = ocorrenciasFiltradas.slice(0, SAMPLE_MAX).map(ocorrencia => `${ocorrencia.relPath}:${ocorrencia.linha ?? ''} [${ocorrencia.nivel ?? ''}] ${String(ocorrencia.mensagem ?? '').replace(/\\n/g, ' ')}`);\n if (sample.length) {\n if (typeof logExt.imprimirBloco === 'function') {\n logExt.imprimirBloco(messages.CliProcessamentoDiagnosticoMensagens.amostraBlocoTitulo(sample.length), sample.slice(0, 20));\n } else {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.amostraOcorrenciasTitulo);\n sample.slice(0, 20).forEach(string => log.info(messages.CliProcessamentoDiagnosticoMensagens.amostraLinhaIndentada(string)));\n }\n if (ocorrenciasFiltradas.length > SAMPLE_MAX) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.amostraMaisLinhas(SAMPLE_MAX, ocorrenciasFiltradas.length));\n }\n }\n } catch {\n // ignore\n }\n }\n }\n\n // Logging adicional para DEBUG\n if (config.VERBOSE || config.DEV_MODE) {\n if (config.DEV_MODE && !opts.json && resultadoExecucao.metricas) {\n if (resultadoExecucao.metricas.analistas) {\n const analistasComOcorrencias = resultadoExecucao.metricas.analistas.filter(arquivo => (arquivo.ocorrencias ?? 0) > 0);\n logSistema.processamentoAnalistasProblemas(analistasComOcorrencias.length);\n analistasComOcorrencias.forEach(analista => {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.analistaOcorrenciasLinha(analista.nome, analista.ocorrencias, analista.duracaoMs.toFixed(1)));\n });\n }\n }\n }\n\n // Mensagem final apenas quando repositório está limpo\n try {\n if (!opts.json && !config.SCAN_ONLY && totalOcorrencias === 0) {\n logRelatorio.repositorioImpecavel();\n }\n } catch (err) {\n log.debug(`Erro ao emitir log de repositório impecável: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Em ambiente de testes (Vitest) também invocar via import dinâmico o módulo\n // que os testes normalmente mockam (`../../src/nucleo/constelacao/log.js`).\n // Isso garante que, mesmo que haja alguma diferença de instância entre o\n // import estático e o mock aplicado pelo Vitest, as spies do teste sejam\n // chamadas e asserções sobre `logMock` passem.\n // (removed temporary vitest dynamic invocations)\n\n // Log de diagnóstico concluído para testes\n if (process.env.VITEST && !opts.json) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.diagnosticoConcluido);\n }\n\n // Processar arquétipos se disponível\n if (arquetiposResultado) {\n // Lógica de processamento de arquétipos seria implementada aqui\n // Por enquanto, apenas log se verbose\n if (config.VERBOSE && arquetiposResultado.candidatos?.length > 0) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.arquetiposDetectados(arquetiposResultado.candidatos.length));\n }\n\n // Em modo compacto, mostrar informação resumida sobre arquétipos\n if (!config.VERBOSE && config.COMPACT_MODE && arquetiposResultado.candidatos?.length > 0) {\n const topCandidato = arquetiposResultado.candidatos[0];\n log.info(messages.CliProcessamentoDiagnosticoMensagens.arquetiposCompact(topCandidato.nome, topCandidato.confidence));\n }\n\n // Exibir informações sobre candidatos mesmo quando não verbose (para testes)\n if (!config.VERBOSE && arquetiposResultado.candidatos?.length > 0) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.arquetiposCandidatosEncontrados(arquetiposResultado.candidatos.length));\n }\n\n // Exibir informações detalhadas dos arquetipos se verbose\n if (config.VERBOSE && arquetiposResultado.candidatos?.length > 0) {\n const candidatoTop = arquetiposResultado.candidatos[0];\n\n // Log dos candidatos\n log.info(messages.CliProcessamentoDiagnosticoMensagens.arquetiposCandidatosTitulo);\n for (const candidato of arquetiposResultado.candidatos.slice(0, 3)) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.arquetiposCandidatoLinha(candidato.nome, candidato.confidence));\n }\n\n // Log do planoSugestao se existir\n if (candidatoTop.planoSugestao) {\n const plano = candidatoTop.planoSugestao;\n if (plano.mover && plano.mover.length > 0) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.planoSugestaoMove(plano.mover.length));\n } else {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.planoSugestaoNenhumMove);\n }\n if (plano.conflitos && plano.conflitos.length > 0) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.conflitos(plano.conflitos.length));\n }\n }\n\n // Log de anomalias se existirem\n if (candidatoTop.anomalias && candidatoTop.anomalias.length > 0) {\n const tituloAnomalias = messages.CliProcessamentoDiagnosticoMensagens.anomaliasTitulo;\n const linhasAnomalias: string[] = [];\n for (const anomalia of candidatoTop.anomalias.slice(0, 8)) {\n linhasAnomalias.push(messages.CliProcessamentoDiagnosticoMensagens.anomaliaLinha(anomalia.path, anomalia.motivo));\n }\n if (candidatoTop.anomalias.length > 8) {\n linhasAnomalias.push(messages.CliProcessamentoDiagnosticoMensagens.anomaliasMais(candidatoTop.anomalias.length - 8));\n }\n if (typeof logExt.imprimirBloco === 'function') {\n logExt.imprimirBloco(tituloAnomalias, linhasAnomalias);\n } else {\n // Fallback para logs simples se imprimirBloco não estiver disponível\n log.info(messages.CliProcessamentoDiagnosticoMensagens.anomaliasTituloComDoisPontos);\n for (const linha of linhasAnomalias) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.amostraLinhaIndentada(linha));\n }\n }\n\n // Log adicional sobre anomalias ocultas se houver mais de 8\n if (candidatoTop.anomalias.length > 8) {\n log.aviso(messages.CliProcessamentoDiagnosticoMensagens.anomaliasOcultasAviso(candidatoTop.anomalias.length - 8));\n }\n }\n\n // Log de drift se existir\n if (arquetiposResultado.drift) {\n const drift = arquetiposResultado.drift;\n if (drift.alterouArquetipo) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.driftAlterou(drift.anterior, drift.atual));\n } else {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.driftMantido(drift.atual));\n }\n if (drift.arquivosRaizNovos && drift.arquivosRaizNovos.length > 0) {\n const novosStr = drift.arquivosRaizNovos.length > 3 ? `${drift.arquivosRaizNovos.slice(0, 3).join(', ')}...` : drift.arquivosRaizNovos.join(', ');\n log.info(messages.CliProcessamentoDiagnosticoMensagens.driftNovos(novosStr));\n }\n if (drift.arquivosRaizRemovidos && drift.arquivosRaizRemovidos.length > 0) {\n const removidosStr = drift.arquivosRaizRemovidos.length > 3 ? `${drift.arquivosRaizRemovidos.slice(0, 3).join(', ')}...` : drift.arquivosRaizRemovidos.join(', ');\n log.info(messages.CliProcessamentoDiagnosticoMensagens.driftRemovidos(removidosStr));\n }\n }\n } else if (config.VERBOSE) {\n // Debug: log se não há candidatos ou arquetiposResultado é undefined\n const candidatosContagem = arquetiposResultado ? (arquetiposResultado as Awaited<ReturnType<typeof detectarArquetipos>>).candidatos?.length || 0 : 0;\n log.info(`DEBUG: arquetiposResultado=${!!arquetiposResultado}, candidatos=${candidatosContagem}`);\n }\n\n // Imprimir bloco de resumo de estrutura se houver baseline/drift (fora de JSON)\n if (!opts.json && arquetiposResultado && (arquetiposResultado.baseline || arquetiposResultado.drift)) {\n const linhasEstrutura: string[] = [];\n if (arquetiposResultado.baseline) {\n const baseline = arquetiposResultado.baseline;\n linhasEstrutura.push(messages.CliProcessamentoDiagnosticoMensagens.baselineArquetipo(baseline.arquetipo, baseline.confidence));\n linhasEstrutura.push(messages.CliProcessamentoDiagnosticoMensagens.baselineCriadoEm(new Date(baseline.timestamp).toLocaleString('pt-BR')));\n } else {\n // Log de aviso quando não há baseline\n log.aviso(messages.CliProcessamentoDiagnosticoMensagens.baselineDesconhecidoAviso);\n linhasEstrutura.push(messages.CliProcessamentoDiagnosticoMensagens.baselineArquetipoDesconhecido);\n }\n if (arquetiposResultado.drift) {\n const drift = arquetiposResultado.drift;\n if (drift.alterouArquetipo) {\n linhasEstrutura.push(messages.CliProcessamentoDiagnosticoMensagens.driftDetectado(drift.anterior, drift.atual));\n } else {\n linhasEstrutura.push(messages.CliProcessamentoDiagnosticoMensagens.arquetipoMantido(drift.atual));\n }\n if (drift.arquivosRaizNovos && drift.arquivosRaizNovos.length > 0) {\n linhasEstrutura.push(messages.CliProcessamentoDiagnosticoMensagens.novosArquivosRaiz(drift.arquivosRaizNovos.join(', ')));\n }\n if (drift.arquivosRaizRemovidos && drift.arquivosRaizRemovidos.length > 0) {\n linhasEstrutura.push(messages.CliProcessamentoDiagnosticoMensagens.arquivosRemovidosRaiz(drift.arquivosRaizRemovidos.join(', ')));\n }\n }\n if (arquetiposResultado.candidatos && arquetiposResultado.candidatos.length > 0) {\n const top = arquetiposResultado.candidatos[0];\n linhasEstrutura.push(messages.CliProcessamentoDiagnosticoMensagens.candidatoPrincipal(top.nome, top.confidence));\n }\n const tituloEstrutura = messages.CliProcessamentoDiagnosticoMensagens.resumoEstruturaTitulo;\n if (typeof logExt.imprimirBloco === 'function') {\n // Calcular largura como nos outros blocos\n let larguraEstrutura: number | undefined;\n if (typeof logExt.calcularLargura === 'function') {\n larguraEstrutura = logExt.calcularLargura(tituloEstrutura, linhasEstrutura, config.COMPACT_MODE ? 84 : 96);\n // Se calcularLargura retornar undefined, usar fallback\n if (typeof larguraEstrutura !== 'number' || isNaN(larguraEstrutura)) {\n larguraEstrutura = config.COMPACT_MODE ? 84 : 96;\n }\n } else {\n larguraEstrutura = config.COMPACT_MODE ? 84 : 96;\n }\n logExt.imprimirBloco(tituloEstrutura, linhasEstrutura, undefined, larguraEstrutura);\n }\n }\n\n // Saída JSON se solicitado\n // Não imprimir logs arbitrários antes do JSON final - isso quebra os testes que\n // esperam JSON puro em stdout. Em ambiente de desenvolvimento, registrar via\n // logger debug para auxiliar diagnóstico local.\n if (config.DEV_MODE) {\n logExt.debug?.(messages.CliProcessamentoDiagnosticoMensagens.debugAboutToEmitJson(JSON.stringify(opts)));\n }\n if (opts.json) {\n // Agregar ocorrências de TODO_PENDENTE por arquivo\n const ocorrenciasOriginais = ocorrenciasFiltradas;\n const todosPorArquivo = new Map<string, typeof ocorrenciasOriginais>();\n\n // Separar TODOs dos outros tipos de ocorrência\n const naoTodos: typeof ocorrenciasOriginais = [];\n for (const ocorrencia of ocorrenciasOriginais) {\n if (ocorrencia.tipo === 'TODO_PENDENTE') {\n const relPath = ocorrencia.relPath || 'desconhecido';\n if (!todosPorArquivo.has(relPath)) {\n todosPorArquivo.set(relPath, []);\n }\n const todosArray = todosPorArquivo.get(relPath);\n if (todosArray) {\n todosArray.push(ocorrencia);\n }\n } else {\n naoTodos.push(ocorrencia);\n }\n }\n\n // Agregar TODOs por arquivo\n const todosAgregados: typeof ocorrenciasOriginais = [];\n for (const [, todos] of todosPorArquivo) {\n if (todos.length === 1) {\n todosAgregados.push(todos[0]);\n } else if (todos.length > 1) {\n // Criar ocorrência agregada\n const primeira = todos[0];\n const mensagemAgregada = messages.CliProcessamentoDiagnosticoMensagens.todosPendentesEncontrados(todos.length);\n todosAgregados.push({\n ...primeira,\n mensagem: mensagemAgregada,\n linha: Math.min(...todos.map(textoTitulo => textoTitulo.linha || 0))\n });\n }\n }\n\n // Combinar ocorrências agregadas e deduplicar para reduzir ruído\n let todasOcorrencias = [...naoTodos, ...todosAgregados];\n todasOcorrencias = dedupeOcorrencias(todasOcorrencias);\n\n // Em modo --json: emitir apenas erros e localizações (sem métricas/caches/tempos).\n // Antes, normaliza para enriquecer `linha/coluna` quando disponível via `loc`.\n const ocorrenciasParaJson = todasOcorrencias.map(ocorrencia => normalizarOcorrenciaParaJson(ocorrencia)).filter(ocorrencia => {\n const nivel = (ocorrencia.nivel || 'info') as string;\n return nivel === 'erro' || ocorrencia.tipo === 'PARSE_ERRO';\n });\n const totalOcorrenciasJson = ocorrenciasParaJson.length;\n\n // Agregar tipos de ocorrências\n const tiposOcorrencias: Record<string, number> = {};\n const parseErros: ParseErrosJson = {\n totalOriginais: 0,\n totalExibidos: 0,\n agregados: 0\n };\n\n // Contar tipos de ocorrências e parse erros\n for (const ocorrencia of ocorrenciasParaJson) {\n const tipo = ocorrencia.tipo || 'desconhecido';\n tiposOcorrencias[tipo] = (tiposOcorrencias[tipo] || 0) + 1;\n\n // Contar parse erros\n if (tipo === 'PARSE_ERRO') {\n parseErros.totalOriginais++;\n parseErros.totalExibidos++;\n }\n }\n\n // Ler parse erros das variáveis globais (para testes e cenários especiais)\n const globalThisExt = globalThis as {\n __TUTANUS_PARSE_ERROS__?: unknown[];\n __TUTANUS_PARSE_ERROS_ORIGINAIS__?: number;\n };\n const parseErrosGlobais = globalThisExt.__TUTANUS_PARSE_ERROS__ || [];\n const parseErrosOriginais = globalThisExt.__TUTANUS_PARSE_ERROS_ORIGINAIS__ || 0;\n\n // Adicionar parse erros globais à contagem\n if (parseErrosGlobais.length > 0 || parseErrosOriginais > 0) {\n parseErros.totalOriginais = Math.max(parseErros.totalOriginais, parseErrosOriginais);\n\n // Se há array global, usar seu tamanho; senão, manter o valor atual (que vem das ocorrências reais)\n if (parseErrosGlobais.length > 0) {\n parseErros.totalExibidos = Math.min(parseErros.totalOriginais, parseErrosGlobais.length);\n }\n // Se não há array global, totalExibidos já foi definido com o número de ocorrências reais\n\n // Atualizar totalOcorrencias se há parse erros\n if (parseErrosOriginais > 0) {\n totalOcorrencias = Math.max(totalOcorrencias, parseErrosOriginais);\n }\n }\n\n // Calcular agregados\n parseErros.agregados = Math.max(0, parseErros.totalOriginais - parseErros.totalExibidos);\n\n // Determinar status baseado nas regras\n let status = 'ok';\n if (totalOcorrenciasJson > 0) {\n status = 'problemas';\n // Se há PARSE_ERRO e PARSE_ERRO_FALHA está ativo, marcar como erro\n if (parseErros.totalOriginais > 0 && config.PARSE_ERRO_FALHA) {\n status = 'erro';\n }\n }\n const saidaJson: SaidaJsonDiagnostico = {\n status: status as 'ok' | 'problemas' | 'erro',\n totalOcorrencias: totalOcorrenciasJson,\n guardian: guardianResultado ? 'verificado' : 'nao-verificado',\n tiposOcorrencias,\n parseErros,\n ocorrencias: ocorrenciasParaJson,\n linguagens: {\n total: 0,\n extensoes: {}\n } // será preenchido depois\n };\n\n // Só incluir estruturaIdentificada se houver resultado de arquetipos\n if (arquetiposResultado) {\n saidaJson.estruturaIdentificada = {\n melhores: arquetiposResultado.candidatos || [],\n baseline: arquetiposResultado.baseline || null,\n drift: arquetiposResultado.drift || {\n alterouArquetipo: false,\n deltaConfidence: 0,\n arquivosRaizNovos: [],\n arquivosRaizRemovidos: []\n }\n };\n }\n\n // JSON será emitido usando helper centralizado que aplica escapes Unicode\n\n const linguagensFinal = computeLinguagens(fileEntriesComAst || fileEntries);\n\n // Anexa valores calculados\n saidaJson.linguagens = linguagensFinal;\n\n // Gerar JSON usando utilitário comum com escape Unicode\n try {\n // Adicionar metadados de versão do schema e timestamp para compatibilidade\n const schemaMeta = {\n schemaVersion: '1.0.0',\n tutanusVersion: '0.0.0',\n timestamp: new Date().toISOString()\n };\n const saidaComMeta = {\n ...schemaMeta,\n ...saidaJson\n };\n // Verificar flag CLI/opt para ascii-only\n const asciiOnly = Boolean(opts && (opts as OpcoesProcessamentoDiagnostico).jsonAscii || false);\n let jsonOutput = stringifyJsonEscaped(saidaComMeta, 2, {\n asciiOnly\n });\n jsonOutput = traduzirRelatorioJson(jsonOutput);\n console.log(jsonOutput);\n _jsonEmitted = true;\n } catch (erro) {\n console.error(messages.CliProcessamentoDiagnosticoMensagens.errorGeneratingJson, erro);\n console.log(messages.CliProcessamentoDiagnosticoMensagens.fallbackJson, JSON.stringify(saidaJson));\n _jsonEmitted = true;\n }\n // Exit codes padronizados: 0=ok/avisos, 1=erros, 2=critico (parse erros fatais)\n if (!process.env.VITEST) {\n const erros = (nivelOcorrencias.get('erro') || 0) as number;\n const exitCode = parseErros.totalOriginais > 0 && config.PARSE_ERRO_FALHA ? 2 : erros > 0 ? 1 : 0;\n process.exit(exitCode);\n }\n }\n\n // Logs finais fora do modo JSON e quando não é scan-only\n if (!opts.json && !config.SCAN_ONLY) {\n // Imprimir bloco de resumo de tipos se houver ocorrências\n if (totalOcorrencias > 0 && ocorrenciasFiltradas) {\n // Modo executivo: apenas problemas críticos e altos\n if (opts.executive) {\n const {\n gerarResumoExecutivo\n } = await import('@reports');\n const resumoExec = gerarResumoExecutivo(ocorrenciasFiltradas);\n if (resumoExec.detalhes.length > 0) {\n const linhasExec = resumoExec.detalhes.map(problema => `${problema.icone} ${problema.titulo.padEnd(25)} ${problema.quantidade.toString().padStart(6)}`);\n const tituloExec = messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoTitulo(resumoExec.problemasCriticos + resumoExec.problemasAltos);\n const cabecalhoExec = [`${messages.CliProcessamentoDiagnosticoMensagens.cabecalhoExecProblema.padEnd(30)}${messages.CliProcessamentoDiagnosticoMensagens.cabecalhoExecQtd.padStart(6)}`];\n if ('imprimirBloco' in log && typeof log.imprimirBloco === 'function') {\n log.imprimirBloco(tituloExec, [...cabecalhoExec, ...linhasExec]);\n }\n console.log(messages.CliProcessamentoDiagnosticoMensagens.dicaUseFull(totalOcorrencias));\n } else {\n console.log(messages.CliProcessamentoDiagnosticoMensagens.projetoBomEstado(totalOcorrencias));\n if (resumoExec.quickFixes > 0) {\n console.log(messages.CliProcessamentoDiagnosticoMensagens.quickFixesDisponiveis(resumoExec.quickFixes));\n }\n }\n } else {\n // Modo padrão: todos os tipos\n const tiposResumo: Record<string, number> = {};\n for (const ocorrencia of ocorrenciasFiltradas) {\n const tipo = ocorrencia.tipo || 'desconhecido';\n tiposResumo[tipo] = (tiposResumo[tipo] || 0) + 1;\n }\n const linhasResumo = Object.entries(tiposResumo).map(([tipo, qtd]) => `${tipo.padEnd(20)} ${qtd.toString().padStart(8)}`);\n const tituloResumo = messages.CliProcessamentoDiagnosticoMensagens.resumoTiposTitulo;\n const cabecalho = [`${messages.CliProcessamentoDiagnosticoMensagens.cabecalhoResumoTipo.padEnd(20)}${messages.CliProcessamentoDiagnosticoMensagens.cabecalhoResumoQuantidade.padStart(8)}`];\n if ('imprimirBloco' in log && typeof log.imprimirBloco === 'function') {\n log.imprimirBloco(tituloResumo, [...cabecalho, ...linhasResumo]);\n }\n }\n }\n\n // Mensagem final\n // Emitir 'Tudo pronto' apenas uma vez\n if (!config.COMPACT_MODE && !process.env.__TUTANUS_TUDO_PRONTO_EMITIDO) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.tudoPronto);\n process.env['__TUTANUS_TUDO_PRONTO_EMITIDO'] = '1';\n }\n\n // Log de diagnóstico concluído para testes\n if (process.env.VITEST) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.diagnosticoConcluido);\n }\n }\n }\n\n // Relatórios e exportação (executa mesmo quando arquetiposResultado undefined)\n if (!opts.json && !config.SCAN_ONLY) {\n logExt.fase?.('Gerando relatórios');\n try {\n const contextoConselho = {\n hora: new Date().getHours(),\n arquivosParaCorrigir: totalOcorrencias,\n arquivosParaPodar: 0,\n totalOcorrenciasAnaliticas: totalOcorrencias,\n integridadeGuardian: guardianResultado?.status || 'nao-verificado'\n };\n emitirConselhoTutanus(contextoConselho);\n if (config.REPORT_EXPORT_ENABLED) {\n try {\n const dir = typeof config.REPORT_OUTPUT_DIR === 'string' ? config.REPORT_OUTPUT_DIR : path.join(baseDir, 'reports');\n fs.mkdirSync(dir, {\n recursive: true\n });\n\n // Determinar o próximo número sequencial baseado nos arquivos existentes\n const arquivosNoDir = fs.readdirSync(dir);\n const obterProximoId = () => {\n const ids = arquivosNoDir.filter(arquivo => arquivo.endsWith('.json')).map(arquivo => {\n const match = arquivo.match(/-(\\d+)\\.json$/);\n return match ? parseInt(match[1], 10) : 0;\n });\n const maxId = Math.max(0, ...ids);\n return (maxId + 1).toString().padStart(3, '0');\n };\n const id = obterProximoId();\n const salvar = await getSalvarEstado();\n\n // 1. Métricas Separadas\n const metricasOriginais = resultadoExecucao.metricas;\n const analistasAgregados: Record<string, {\n duracaoMs: number;\n ocorrencias: number;\n execucoes: number;\n }> = {};\n for (const arquivo of metricasOriginais?.analistas || []) {\n const nome = arquivo.nome || 'desconhecido';\n if (!analistasAgregados[nome]) {\n analistasAgregados[nome] = {\n duracaoMs: 0,\n ocorrencias: 0,\n execucoes: 0\n };\n }\n analistasAgregados[nome].duracaoMs += arquivo.duracaoMs || 0;\n analistasAgregados[nome].ocorrencias += arquivo.ocorrencias || 0;\n analistasAgregados[nome].execucoes += 1;\n }\n const analistasResumidos = Object.entries(analistasAgregados).map(([nome, dados]) => ({\n nome,\n duracaoTotalMs: Math.round(dados.duracaoMs * 100) / 100,\n ocorrenciasTotal: dados.ocorrencias,\n execucoes: dados.execucoes\n })).sort((arquivo, base) => base.ocorrenciasTotal - arquivo.ocorrenciasTotal);\n const relatorioMetricas = {\n timestamp: new Date().toISOString(),\n metricas: {\n totalArquivos: metricasOriginais?.totalArquivos,\n tempoParsingMs: metricasOriginais?.tempoParsingMs,\n tempoAnaliseMs: metricasOriginais?.tempoAnaliseMs,\n cacheAstHits: metricasOriginais?.cacheAstHits,\n cacheAstMiss: metricasOriginais?.cacheAstMiss,\n analistas: analistasResumidos\n }\n };\n await salvar(path.join(dir, `metricas-${id}.json`), relatorioMetricas);\n\n // 2. Ocorrências (streaming ou separadas por nível)\n const todasOcorrencias = dedupeOcorrencias(resultadoExecucao.ocorrencias || []);\n const ocorrenciasLimpas = todasOcorrencias.map(oc => limparOcorrencia(oc));\n\n const usarStream = config.REPORT_STREAM_ENABLED && ocorrenciasLimpas.length >= config.REPORT_STREAM_AUTO_THRESHOLD;\n\n if (usarStream) {\n // Streaming: grava ocorrências incrementalmente em shards NDJSON\n try {\n const { RelatorioStream } = await import('@reports');\n const stream = new RelatorioStream({\n outputDir: dir,\n prefix: `tutanus-stream-${id}`,\n maxOcorrenciasPerShard: config.REPORT_STREAM_MAX_OCCURRENCES_PER_SHARD,\n maxBytesPerShard: config.REPORT_STREAM_MAX_BYTES_PER_SHARD,\n compress: config.REPORT_STREAM_COMPRESS,\n });\n\n // Alimenta o stream com ocorrências em lotes\n const TAMANHO_LOTE = 500;\n for (let i = 0; i < ocorrenciasLimpas.length; i += TAMANHO_LOTE) {\n const lote = ocorrenciasLimpas.slice(i, i + TAMANHO_LOTE) as unknown as import('@').Ocorrencia[];\n stream.writeBatch(lote);\n }\n\n const { manifest, manifestFile } = await stream.end({\n projectDir: baseDir,\n timestamp: new Date().toISOString(),\n totalArquivos: resultadoExecucao.totalArquivos,\n totalOcorrencias: ocorrenciasLimpas.length,\n });\n\n log.sucesso(`Relatório streaming salvo: ${manifestFile} (${manifest.totalShards} shards, ${manifest.totalOcorrencias} ocorrências)`);\n } catch (streamErr) {\n log.aviso(`Streaming de relatório falhou, usando export padrão: ${(streamErr as Error).message}`);\n // Fallback: export padrão por nível\n await exportarPorNivel(ocorrenciasLimpas, dir, id, salvar);\n }\n } else {\n await exportarPorNivel(ocorrenciasLimpas, dir, id, salvar);\n }\n\n // Gerar sugestões de organização estrutural\n try {\n const { OperarioEstrutura } = await import('@analysts/strategists');\n const { plano: planoOrg, origem: origemOrg } = await OperarioEstrutura.planejar(baseDir, fileEntriesComAst, {\n preferEstrategista: true,\n });\n if (planoOrg && planoOrg.mover && planoOrg.mover.length > 0) {\n const sugestoes = planoOrg.mover.map(m => ({\n tipo: 'organizacao',\n origem: origemOrg,\n arquivo: m.de,\n destinoSugerido: m.para,\n mensagem: `Sugestão: mover ${m.de} para ${m.para}`,\n }));\n await salvar(path.join(dir, `sugestoes-${id}.json`), {\n timestamp: new Date().toISOString(),\n total: sugestoes.length,\n sugestoes,\n });\n }\n } catch (erro) {\n log.debug(`Erro ao gerar sugestões de organização: ${erro instanceof Error ? erro.message : String(erro)}`);\n }\n\n log.sucesso(messages.CliProcessamentoDiagnosticoMensagens.relatoriosExportadosPara(dir));\n } catch (erro) {\n log.erro(messages.CliProcessamentoDiagnosticoMensagens.falhaExportarRelatorios(erro instanceof Error ? erro.message : String(erro)));\n }\n }\n } catch (erro) {\n log.erro(messages.CliProcessamentoDiagnosticoMensagens.falhaExportarRelatorios((erro as Error).message));\n }\n }\n\n // Garantir impressão de resumo e despedida caso ainda não tenham sido exibidos\n if (!opts.json && !config.SCAN_ONLY) {\n try {\n // Se houver ocorrências, exibe resumo de tipos (mesma lógica usada acima)\n if (totalOcorrencias > 0 && resultadoExecucao && ocorrenciasFiltradas) {\n const tiposResumo: Record<string, number> = {};\n for (const ocorrencia of ocorrenciasFiltradas) {\n const tipo = ocorrencia.tipo || 'desconhecido';\n tiposResumo[tipo] = (tiposResumo[tipo] || 0) + 1;\n }\n const linhasResumo = Object.entries(tiposResumo).map(([tipo, qtd]) => `${tipo.padEnd(20)} ${qtd.toString().padStart(8)}`);\n const tituloResumo = messages.CliProcessamentoDiagnosticoMensagens.resumoTiposTitulo;\n const cabecalho = [`${messages.CliProcessamentoDiagnosticoMensagens.cabecalhoResumoTipo.padEnd(20)}${messages.CliProcessamentoDiagnosticoMensagens.cabecalhoResumoQuantidade.padStart(8)}`];\n if ('imprimirBloco' in log && typeof log.imprimirBloco === 'function') {\n log.imprimirBloco(tituloResumo, [...cabecalho, ...linhasResumo]);\n }\n }\n if (!config.COMPACT_MODE && !process.env.__TUTANUS_TUDO_PRONTO_EMITIDO) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.tudoPronto);\n process.env['__TUTANUS_TUDO_PRONTO_EMITIDO'] = '1';\n }\n } catch { }\n }\n\n // Quando não houve `arquetiposResultado`, ainda precisamos suportar\n // `--json`: emitir o JSON final mesmo sem os dados de arquetipos.\n if (opts.json) {\n // Reproduz o mesmo comportamento de geração de JSON usado acima,\n // mas tolera arquetiposResultado undefined.\n const ocorrenciasOriginais = dedupeOcorrencias(resultadoExecucao.ocorrencias || []);\n const todosPorArquivo = new Map<string, typeof ocorrenciasOriginais>();\n const naoTodos: typeof ocorrenciasOriginais = [];\n for (const ocorrencia of ocorrenciasOriginais) {\n if (ocorrencia.tipo === 'TODO_PENDENTE') {\n const relPath = ocorrencia.relPath || 'desconhecido';\n if (!todosPorArquivo.has(relPath)) todosPorArquivo.set(relPath, []);\n const ocorrenciasArquivo = todosPorArquivo.get(relPath);\n if (ocorrenciasArquivo) ocorrenciasArquivo.push(ocorrencia);\n } else {\n naoTodos.push(ocorrencia);\n }\n }\n\n // Mensagem final apenas quando repositório está limpo\n try {\n if (!opts.json && !config.SCAN_ONLY && totalOcorrencias === 0) {\n logRelatorio.repositorioImpecavel();\n }\n } catch { }\n const todosAgregados: typeof ocorrenciasOriginais = [];\n for (const [, todos] of todosPorArquivo) {\n if (todos.length === 1) todosAgregados.push(todos[0]); else if (todos.length > 1) {\n const primeira = todos[0];\n const mensagemAgregada = messages.CliProcessamentoDiagnosticoMensagens.todosPendentesEncontrados(todos.length);\n todosAgregados.push({\n ...primeira,\n mensagem: mensagemAgregada,\n linha: Math.min(...todos.map(textoTitulo => textoTitulo.linha || 0))\n });\n }\n }\n let todasOcorrencias = [...naoTodos, ...todosAgregados];\n todasOcorrencias = dedupeOcorrencias(todasOcorrencias);\n\n // Em modo --json, queremos reduzir o payload ao essencial.\n // Emitimos apenas ocorrências de nível \"erro\" (inclui PARSE_ERRO).\n const ocorrenciasParaJson = todasOcorrencias.filter(ocorrencia => {\n const nivel = (ocorrencia.nivel || 'info') as string;\n return nivel === 'erro' || ocorrencia.tipo === 'PARSE_ERRO';\n });\n const tiposOcorrencias: Record<string, number> = {};\n const parseErros: ParseErrosJson = {\n totalOriginais: 0,\n totalExibidos: 0,\n agregados: 0\n };\n for (const ocorrencia of ocorrenciasParaJson) {\n const tipo = ocorrencia.tipo || 'desconhecido';\n tiposOcorrencias[tipo] = (tiposOcorrencias[tipo] || 0) + 1;\n if (tipo === 'PARSE_ERRO') {\n parseErros.totalOriginais++;\n parseErros.totalExibidos++;\n }\n }\n const globalThisExt = globalThis as {\n __TUTANUS_PARSE_ERROS__?: unknown[];\n __TUTANUS_PARSE_ERROS_ORIGINAIS__?: number;\n };\n const parseErrosGlobais = globalThisExt.__TUTANUS_PARSE_ERROS__ || [];\n const parseErrosOriginais = globalThisExt.__TUTANUS_PARSE_ERROS_ORIGINAIS__ || 0;\n if (parseErrosGlobais.length > 0 || parseErrosOriginais > 0) {\n parseErros.totalOriginais = Math.max(parseErros.totalOriginais, parseErrosOriginais);\n if (parseErrosGlobais.length > 0) {\n parseErros.totalExibidos = Math.min(parseErros.totalOriginais, parseErrosGlobais.length);\n }\n if (parseErrosOriginais > 0) {\n totalOcorrencias = Math.max(totalOcorrencias, parseErrosOriginais);\n }\n }\n parseErros.agregados = Math.max(0, parseErros.totalOriginais - parseErros.totalExibidos);\n let status = 'ok';\n if (ocorrenciasParaJson.length > 0) {\n status = 'problemas';\n if (parseErros.totalOriginais > 0 && config.PARSE_ERRO_FALHA) status = 'erro';\n }\n const saidaJson: SaidaJsonDiagnostico = {\n status: status as 'ok' | 'problemas' | 'erro',\n totalOcorrencias: ocorrenciasParaJson.length,\n guardian: guardianResultado ? 'verificado' : 'nao-verificado',\n tiposOcorrencias,\n parseErros,\n ocorrencias: ocorrenciasParaJson,\n linguagens: {\n total: 0,\n extensoes: {}\n }\n };\n\n // Quando não há dados de arquetipos, omitimos `estruturaIdentificada` no JSON\n // (o fluxo principal já trata de incluí-lo quando disponível).\n\n const linguagensFinal = computeLinguagens(fileEntriesComAst || fileEntries);\n saidaJson.linguagens = linguagensFinal;\n if (!_jsonEmitted) {\n try {\n // Adicionar metadados de versão do schema e timestamp para compatibilidade\n let pkgVersion = '0.0.0';\n try {\n const pkgRaw = await fs.promises.readFile(path.join(process.cwd(), 'package.json'), 'utf-8');\n const pkgObj = JSON.parse(pkgRaw) as {\n version?: string;\n };\n if (pkgObj && typeof pkgObj.version === 'string') pkgVersion = pkgObj.version;\n } catch { }\n const schemaMeta = {\n schemaVersion: '1.0.0',\n tutanusVersion: pkgVersion,\n timestamp: new Date().toISOString()\n };\n const saidaComMeta = {\n ...schemaMeta,\n ...saidaJson\n };\n const asciiOnly = Boolean(opts && (opts as OpcoesProcessamentoDiagnostico).jsonAscii || false);\n let jsonOutput = stringifyJsonEscaped(saidaComMeta, 2, {\n asciiOnly\n });\n jsonOutput = traduzirRelatorioJson(jsonOutput);\n console.log(jsonOutput);\n\n // Se a exportação estiver habilitada via flags globais/locais, salvamos o JSON em disco\n if (config.REPORT_EXPORT_ENABLED) {\n try {\n const dir = typeof config.REPORT_OUTPUT_DIR === 'string' ? config.REPORT_OUTPUT_DIR : path.join(baseDir, 'reports');\n fs.mkdirSync(dir, {\n recursive: true\n });\n const arquivosNoDir = fs.readdirSync(dir);\n const ids = arquivosNoDir.filter(arquivo => arquivo.endsWith('.json')).map(arquivo => {\n const match = arquivo.match(/-(\\d+)\\.json$/);\n return match ? parseInt(match[1], 10) : 0;\n });\n const maxId = Math.max(0, ...ids);\n const id = (maxId + 1).toString().padStart(3, '0');\n const caminhoArquivo = path.join(dir, `tutanus-diagnostico-${id}.json`);\n fs.writeFileSync(caminhoArquivo, jsonOutput, 'utf-8');\n log.sucesso(messages.CliProcessamentoDiagnosticoMensagens.relatoriosExportadosPara(dir));\n } catch (erro) {\n log.erro(messages.CliProcessamentoDiagnosticoMensagens.falhaSalvarRelatorioJson(erro instanceof Error ? erro.message : String(erro)));\n }\n }\n } catch (erro) {\n console.error(messages.CliProcessamentoDiagnosticoMensagens.errorGeneratingJson, erro);\n console.log(messages.CliProcessamentoDiagnosticoMensagens.fallbackJson, JSON.stringify(saidaJson));\n }\n }\n // Exit codes padronizados: 0=ok/avisos, 1=erros, 2=critico (parse erros fatais)\n if (!process.env.VITEST) {\n const erros = (nivelOcorrencias.get('erro') || 0) as number;\n const exitCode = parseErros.totalOriginais > 0 && config.PARSE_ERRO_FALHA ? 2 : erros > 0 ? 1 : 0;\n process.exit(exitCode);\n }\n }\n } catch (error) {\n // Se o erro for resultado de um process.exit mocked (ex.: Error('exit:1'))\n // devemos repropagar para que os testes possam capturá-lo. Evitamos\n // engolir erros que representam encerramento do processo.\n try {\n if (error && typeof error === 'object' && 'message' in error && typeof (error as {\n message?: unknown;\n }).message === 'string' && String((error as {\n message: string;\n }).message).startsWith('exit:')) {\n throw error;\n }\n } catch (re) {\n throw re;\n }\n // Tratamento de erro geral para o processamento do diagnóstico\n // Normaliza mensagens que podem ser string, Error ou outro objeto\n const errMsg = typeof error === 'string' ? error : error instanceof Error ? error.message : (() => {\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n })();\n log.erro(messages.CliProcessamentoDiagnosticoMensagens.erroFatalDiagnostico(errMsg));\n\n // Em modo de desenvolvimento, mostrar stack trace\n if (config.DEV_MODE) {\n console.error(error);\n }\n\n // Retornar resultado com erro\n return {\n totalOcorrencias: 1,\n temErro: true,\n guardianResultado,\n fileEntriesComAst: [],\n resultadoFinal: {\n ocorrencias: [],\n metricas: {\n totalArquivos: 0,\n tempoTotal: 0,\n analistas: []\n }\n }\n };\n }\n\n // Mensagem final apenas quando repositório está limpo (fallback)\n try {\n if (!opts.json && !config.SCAN_ONLY && totalOcorrencias === 0) {\n logRelatorio.repositorioImpecavel();\n }\n } catch { }\n\n // Fallback para garantir que a função sempre retorna um valor\n return {\n totalOcorrencias: totalOcorrencias || 0,\n temErro: false,\n guardianResultado,\n fileEntriesComAst: [],\n resultadoFinal: {\n ocorrencias: [],\n metricas: {\n totalArquivos: 0,\n tempoTotal: 0,\n analistas: []\n }\n }\n };\n}\n\n// Re-exporta o resultado do processamento interno como resultado do diagnóstico\nexport type { ResultadoProcessamentoDiagnostico } from '@';\n"]}
|
|
1
|
+
{"version":3,"file":"processing-diagnostic.js","sourceRoot":"","sources":["../../../src/cli/diagnostic/processing-diagnostic.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport { detectarArquetipos } from '@analysts/architects';\nimport { normalizarOcorrenciaParaJson } from '@cli/diagnostic';\nimport { traduzirRelatorioJson } from '@cli/diagnostic/exporters';\nimport { configurarFiltros, exibirBlocoFiltros, expandIncludes, listarAnalistas, processPatternGroups, processPatternListAchatado } from '@cli/processing';\nimport { chalk, config, isInsideConfigDirectory, isInsideSrc, isInsideTestsDirectory } from '@core/config';\nimport { executarInquisicao, iniciarInquisicao, registrarUltimasMetricas } from '@core/execution';\nimport { messages } from '@core/messages';\nimport { aplicarSupressaoOcorrencias } from '@core/parsing';\nimport { scanSystemIntegrity } from '@guardian';\nimport { emitirConselhoTutanus } from '@reports';\nimport { dedupeOcorrencias, stringifyJsonEscaped } from '@shared/data-processing';\n\n// Importar tipos centralizados (consolidado)\nimport { asTecnicas, converterResultadoGuardian, type FileEntry, type FileEntryWithAst, type FiltrosConfig, IntegridadeStatus, type LinguagensJson, type LogExtensions, type Ocorrencia, type OcorrenciaLimpa, type OpcoesProcessamentoDiagnostico, type ParseErrosJson, type ResultadoGuardian, type ResultadoProcessamentoDiagnostico, type SaidaJsonDiagnostico } from '@';\n\nimport type { ModuloPersistencia } from '../../types/shared/persistence.js';\n\n\nconst {\n log,\n logGuardian,\n logRelatorio,\n logSistema,\n MENSAGENS_AUTOFIX,\n CliProcessamentoExtraMensagens\n} = messages;\n\n// Persistência: usar helper centralizado, mas com resolver dinâmico para compat com mocks de teste\n\nlet salvarEstado: (caminho: string, dados: unknown) => Promise<void>;\n\ntype SalvarEstadoFn = ModuloPersistencia['salvarEstado'];\n\nasync function getSalvarEstado(): Promise<SalvarEstadoFn> {\n if (salvarEstado) return salvarEstado;\n const candidates = process.env.VITEST ? ['@shared/persistence/persistencia.js', '@shared/persistence/persistencia.ts'] : ['@shared/persistence/persistencia.js'];\n for (const caminho of candidates) {\n try {\n const mod: ModuloPersistencia | undefined = await import(caminho).catch(() => undefined);\n if (mod && typeof mod.salvarEstado === 'function') {\n salvarEstado = mod.salvarEstado;\n break;\n }\n } catch (err) {\n log.debug(`Erro em getSalvarEstado (importação dinâmica): ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n if (!salvarEstado) {\n const mod: ModuloPersistencia = await import('@shared/persistence');\n salvarEstado = mod.salvarEstado;\n }\n return salvarEstado;\n}\n// Reexports para compatibilidade com testes que importam utilitários diretamente deste módulo\nexport { configurarFiltros, getDefaultExcludes } from '@cli/processing';\n// registroAnalistas será importado dinamicamente quando necessário\n\n// Helpers deduplicação/agrupamento: agora centralizados em @shared/data-processing/ocorrencias\n\n// Constante para timeout de detecção de arquétipos (em milissegundos)\nconst DETECTAR_TEMPO_LIMITE_MS = process.env.VITEST ? 1000 : 30000;\n\n// Helper: detecção de arquétipos com timeout e absorção de rejeições\n\nasync function detectarArquetiposComTimeout(ctx: Parameters<typeof detectarArquetipos>[0], baseDir: Parameters<typeof detectarArquetipos>[1], options?: {\n quiet?: boolean;\n}): Promise<Awaited<ReturnType<typeof detectarArquetipos>> | undefined> {\n try {\n const detectPromise = detectarArquetipos(ctx, baseDir, options).catch(erro => {\n if (config.DEV_MODE) {\n const msg = erro instanceof Error ? erro.message : String(erro);\n log.erro(`Falha detector arquetipos: ${msg}`);\n }\n return undefined;\n });\n const timeoutPromise = new Promise<undefined>(resolve => setTimeout(() => resolve(undefined), DETECTAR_TEMPO_LIMITE_MS));\n return (await Promise.race([detectPromise, timeoutPromise])) as Awaited<ReturnType<typeof detectarArquetipos>> | undefined;\n } catch {\n return undefined;\n }\n}\n\n// Utilitários para processamento de filtros\n\n// Hook de teste: permite injetar uma ocorrência sintética mínima para\n// exercitar ramos de exportação e despedida sem custo alto de análise.\n\n// Expansão de includes: aceita diretórios sem curingas\n\n// Função para obter padrões de exclusão padrão do config\n// Função auxiliar para detectar o tipo de projeto (simplificada)\n\n// Função para configurar filtros no config global\n\n// Função auxiliar para sincronizar arrays de exclusão\n\n// Função para exibir bloco de filtros (verbose)\n\n// Helper: exporta ocorrências por nível (erro/aviso/info)\nasync function exportarPorNivel(\n ocorrenciasLimpas: OcorrenciaLimpa[],\n dir: string,\n id: string,\n salvar: (caminho: string, dados: unknown) => Promise<void>,\n): Promise<void> {\n const erros = ocorrenciasLimpas.filter(ocorrencia => ocorrencia.nivel === 'erro' || ocorrencia.tipo === 'PARSE_ERRO' || ocorrencia.nivel === 'critico');\n const avisos = ocorrenciasLimpas.filter(ocorrencia => ocorrencia.nivel === 'aviso' || ocorrencia.nivel === 'alto' || ocorrencia.nivel === 'media');\n const infos = ocorrenciasLimpas.filter(ocorrencia => ocorrencia.nivel === 'info' || ocorrencia.nivel === 'baixa' || !ocorrencia.nivel);\n if (erros.length > 0) {\n await salvar(path.join(dir, `erro-${id}.json`), {\n timestamp: new Date().toISOString(),\n total: erros.length,\n ocorrencias: erros,\n });\n }\n if (avisos.length > 0) {\n await salvar(path.join(dir, `aviso-${id}.json`), {\n timestamp: new Date().toISOString(),\n total: avisos.length,\n ocorrencias: avisos,\n });\n }\n if (infos.length > 0) {\n await salvar(path.join(dir, `info-${id}.json`), {\n timestamp: new Date().toISOString(),\n total: infos.length,\n ocorrencias: infos,\n });\n }\n}\n\n\nfunction computeLinguagens(fes: (FileEntry | FileEntryWithAst)[]): LinguagensJson {\n const extensoes: Record<string, number> = {};\n let sem_ext = 0;\n for (const arquivo of fes || []) {\n const rel = arquivo.relPath || arquivo.fullCaminho || '';\n const base = rel.split(/[\\\\/]/).pop() || '';\n const idx = base.lastIndexOf('.');\n if (idx === -1) {\n sem_ext++;\n } else {\n const ext = base.slice(idx + 1) || 'sem_ext';\n extensoes[ext] = (extensoes[ext] || 0) + 1;\n }\n }\n return { total: (fes || []).length, extensoes: { ...extensoes, sem_ext } };\n}\n\nfunction limparOcorrencia(oc: Ocorrencia): OcorrenciaLimpa {\n return {\n tipo: oc.tipo,\n nivel: oc.nivel,\n mensagem: oc.mensagem,\n relPath: oc.relPath,\n linha: oc.linha,\n coluna: oc.coluna,\n ...(oc.sugestao ? { sugestao: oc.sugestao } : {}),\n };\n}\n\nasync function executarAutoFixInterno(\n opts: OpcoesProcessamentoDiagnostico,\n ocorrenciasFiltradas: Ocorrencia[],\n fileEntriesComAst: FileEntryWithAst[],\n baseDir: string,\n totalOcorrencias: number,\n): Promise<{ ocorrenciasFiltradas: Ocorrencia[]; totalOcorrencias: number }> {\n if (!opts.autoFix) {\n return { ocorrenciasFiltradas, totalOcorrencias: ocorrenciasFiltradas.length };\n }\n try {\n const {\n findQuickFixes,\n applyQuickFix\n } = await import('@core/config/auto');\n const {\n getAutoFixConfig\n } = await import('@core/config/auto');\n\n let autoCorrecaoMode = opts.autoCorrecaoMode || 'balanced';\n if (opts.autoFixConservative) {\n autoCorrecaoMode = 'conservative';\n opts.autoFix = true;\n }\n const autoCorrecaoConfiguracao = getAutoFixConfig(autoCorrecaoMode);\n if (autoCorrecaoMode === 'conservative') {\n log.info(MENSAGENS_AUTOFIX.logs.modoConservador);\n } else if (autoCorrecaoMode === 'aggressive') {\n log.aviso(messages.CliProcessamentoDiagnosticoMensagens.autoFixModoAgressivo);\n }\n\n const quickFixesDisponiveis = ocorrenciasFiltradas.filter(occ => occ.tipo === 'auto-fix-disponivel' || occ.tipo === 'QUICK_FIX_DISPONIVEL');\n if (quickFixesDisponiveis.length === 0) {\n logSistema.autoFixNenhumaCorrecao();\n return { ocorrenciasFiltradas, totalOcorrencias: ocorrenciasFiltradas.length };\n }\n\n logSistema.autoFixAplicando(autoCorrecaoMode);\n let arquivosCorrigidos = 0;\n let totalCorrecoes = 0;\n let correcoesPuladas = 0;\n\n const correcoesPorArquivo = new Map<string, typeof quickFixesDisponiveis>();\n for (const fix of quickFixesDisponiveis) {\n const arquivo = fix.relPath || fix.arquivo;\n if (!arquivo) continue;\n if (!correcoesPorArquivo.has(arquivo)) {\n correcoesPorArquivo.set(arquivo, []);\n }\n correcoesPorArquivo.get(arquivo)?.push(fix);\n }\n\n const maxFixesPerArquivo = autoCorrecaoConfiguracao?.maxFixesPerArquivo ?? Infinity;\n for (const [arquivo, _fixes] of correcoesPorArquivo) {\n try {\n const fileEntrada = fileEntriesComAst?.find(fe => fe.relPath === arquivo || fe.fullCaminho === arquivo);\n if (!fileEntrada || typeof fileEntrada.content !== 'string') {\n logSistema.autoFixArquivoNaoEncontrado(arquivo);\n continue;\n }\n let codigoCorrigido = fileEntrada.content;\n let corrigiuAlgo = false;\n let correcoesPorArquivoContagem = 0;\n\n const quickFixesEncontrados = findQuickFixes(codigoCorrigido, undefined, autoCorrecaoConfiguracao, arquivo);\n for (const quickCorrecao of quickFixesEncontrados) {\n if (correcoesPorArquivoContagem >= maxFixesPerArquivo) {\n correcoesPuladas += quickCorrecao.matches.length;\n break;\n }\n for (const match of quickCorrecao.matches) {\n try {\n const novocodigo = applyQuickFix(codigoCorrigido, quickCorrecao, match);\n if (novocodigo !== codigoCorrigido) {\n codigoCorrigido = novocodigo;\n corrigiuAlgo = true;\n totalCorrecoes++;\n correcoesPorArquivoContagem++;\n if (config.VERBOSE) {\n logSistema.autoFixAplicada(quickCorrecao.title, quickCorrecao.confidence);\n }\n }\n } catch (err) {\n logSistema.autoFixFalha(quickCorrecao.id, err instanceof Error ? err.message : String(err));\n }\n if (correcoesPorArquivoContagem >= maxFixesPerArquivo) {\n break;\n }\n }\n }\n\n if (corrigiuAlgo) {\n const {\n promises: fs\n } = await import('node:fs');\n const caminhoCompleto = path.isAbsolute(arquivo) ? arquivo : path.join(baseDir, arquivo);\n await fs.writeFile(caminhoCompleto, codigoCorrigido, 'utf-8');\n arquivosCorrigidos++;\n if (config.VERBOSE) {\n logSistema.autoFixCorrigido(arquivo);\n }\n }\n } catch (err) {\n log.erro(CliProcessamentoExtraMensagens.erroAplicarCorrecoes.replace('{erro}', err instanceof Error ? err.message : String(err)));\n }\n }\n\n if (arquivosCorrigidos > 0) {\n const estatisticas = [`${totalCorrecoes} correções aplicadas em ${arquivosCorrigidos} arquivo(s)`];\n if (correcoesPuladas > 0) {\n estatisticas.push(`${correcoesPuladas} correções puladas (limite por arquivo: ${maxFixesPerArquivo === Infinity ? '∞' : maxFixesPerArquivo})`);\n }\n if (autoCorrecaoMode === 'conservative') {\n estatisticas.push('modo conservador (alta confiança apenas)');\n }\n logSistema.autoFixEstatisticas(estatisticas);\n\n if (process.env.TUTANUS_ESLINT_VALIDATION !== '0' && autoCorrecaoConfiguracao.validateAfterFix) {\n try {\n log.info(MENSAGENS_AUTOFIX.logs.validacaoEslint);\n const {\n spawn\n } = await import('node:child_process');\n\n const arquivosParaValidar = Array.from(correcoesPorArquivo.keys());\n if (arquivosParaValidar.length > 0) {\n const eslintArgs = ['--fix', ...arquivosParaValidar];\n const proc = spawn('npx', ['eslint', ...eslintArgs], {\n cwd: baseDir,\n stdio: 'pipe'\n });\n let stdout = '';\n let _stderr = '';\n proc.stdout?.on('data', data => {\n stdout += data;\n });\n proc.stderr?.on('data', data => {\n _stderr += data;\n });\n const ESLINT_TIMEOUT_MS = 30_000;\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n proc.kill();\n resolve();\n }, ESLINT_TIMEOUT_MS);\n const done = () => {\n clearTimeout(timer);\n resolve();\n };\n proc.on('close', code => {\n if (code === 0) {\n logSistema.autoFixESLintHarmonia();\n } else {\n if (config.VERBOSE && stdout) {\n logSistema.processamentoESLintOutput(stdout);\n }\n logSistema.autoFixESLintAjustes();\n }\n done();\n });\n proc.on('error', err => {\n logSistema.autoFixESLintFalha(err.message);\n done();\n });\n });\n }\n } catch (err) {\n log.aviso(`[AVISO] Validação ESLint não executada: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n } else {\n logSistema.autoFixNenhumaAplicada();\n }\n\n const ocorrenciasSemQuickFixes = ocorrenciasFiltradas.filter(occ => occ.tipo !== 'auto-fix-disponivel' && occ.tipo !== 'QUICK_FIX_DISPONIVEL');\n return { ocorrenciasFiltradas: ocorrenciasSemQuickFixes, totalOcorrencias: ocorrenciasSemQuickFixes.length };\n } catch (err) {\n log.erro(`[ERRO] Falha ao executar auto-fix: ${err instanceof Error ? err.message : String(err)}`);\n return { ocorrenciasFiltradas, totalOcorrencias };\n }\n}\n\n// Função principal de processamento do diagnóstico\n\nexport async function processarDiagnostico(opts: OpcoesProcessamentoDiagnostico): Promise<ResultadoProcessamentoDiagnostico> {\n // Modo monorepo: auto-descobre workspaces e analisa cada pacote\n if (opts.monorepo && !opts.paths?.length) {\n try {\n const { detectarMonorepo } = await import('@analysts/detectors');\n const info = detectarMonorepo(process.cwd());\n if (info.isMonorepo && info.workspaces.length > 0) {\n const dirs = info.workspaces.map(w => w.dir);\n opts.paths = dirs;\n log.sucesso(`Monorepo detectado: ${info.workspaces.length} workspaces (${info.type})`);\n } else {\n log.aviso('Modo monorepo ativado mas nenhum workspace foi encontrado');\n }\n } catch (err) {\n log.aviso(`Falha ao detectar monorepo: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Suporte a múltiplos projetos: se --path foi fornecido, executa para cada um e mescla resultados\n const projectPaths = opts.paths?.filter(Boolean) ?? [];\n if (projectPaths.length > 0) {\n const resultados: Ocorrencia[] = [];\n let totalArquivos = 0;\n const metricasAnalistas: import('@').MetricaAnalista[] = [];\n\n const analisarProjeto = async (projetoPath: string) => {\n const projetoNome = path.basename(projetoPath);\n const cwdAnterior = process.cwd();\n try {\n process.chdir(projetoPath);\n const subOpts = { ...opts, paths: undefined };\n const subResult = await processarDiagnosticoInterno(subOpts);\n if (subResult) {\n const ocorr = subResult.resultadoFinal?.ocorrencias ?? [];\n const tagged = ocorr.map(o => ({\n ...o,\n projeto: projetoNome,\n mensagem: `[${projetoNome}] ${o.mensagem}`\n }));\n return { tagged, totalArquivos: subResult.resultadoFinal?.metricas?.totalArquivos ?? 0, analistas: subResult.resultadoFinal?.metricas?.analistas ?? [] };\n }\n return { tagged: [], totalArquivos: 0, analistas: [] };\n } catch (err) {\n log.aviso(`Falha ao analisar projeto ${projetoNome}: ${err instanceof Error ? err.message : String(err)}`);\n return { tagged: [], totalArquivos: 0, analistas: [] };\n } finally {\n process.chdir(cwdAnterior);\n }\n };\n\n const resultadosProjetos = await Promise.all(projectPaths.map(analisarProjeto));\n for (const r of resultadosProjetos) {\n resultados.push(...r.tagged);\n totalArquivos += r.totalArquivos;\n metricasAnalistas.push(...r.analistas);\n }\n\n // Emite JSON consolidado com todos os projetos\n if (opts.json) {\n const saidaJson = {\n meta: { multiProjeto: true, projetos: projectPaths.length, totalOcorrencias: resultados.length },\n totalArquivos,\n ocorrencias: resultados,\n metricas: { analistas: metricasAnalistas }\n };\n console.log(JSON.stringify(saidaJson, null, 2));\n } else {\n log.sucesso(`Análise multi-projeto concluída: ${projectPaths.length} projetos, ${resultados.length} ocorrências`);\n }\n\n return {\n totalOcorrencias: resultados.length,\n temErro: false,\n fileEntriesComAst: [],\n resultadoFinal: { ocorrencias: resultados, metricas: { totalArquivos, tempoTotal: 0, analistas: metricasAnalistas } }\n };\n }\n\n const resultado = await processarDiagnosticoInterno(opts);\n return resultado ?? {\n totalOcorrencias: 0,\n temErro: false,\n guardianResultado: undefined,\n fileEntriesComAst: [],\n resultadoFinal: {\n ocorrencias: [],\n metricas: { totalArquivos: 0, tempoTotal: 0, analistas: [] }\n }\n };\n}\n\ntype OptsComExtras = OpcoesProcessamentoDiagnostico & {\n compact?: boolean;\n trustCompiler?: boolean;\n verifyCycles?: boolean;\n};\n\nasync function processarDiagnosticoInterno(opts: OpcoesProcessamentoDiagnostico): Promise<ResultadoProcessamentoDiagnostico | undefined> {\n const logExt = log as typeof log & LogExtensions;\n const optsDyn = opts as OptsComExtras;\n const configDyn = config as unknown as Record<string, unknown>;\n\n // Configurar flags globais\n config.GUARDIAN_ENABLED = opts.guardianCheck ?? false;\n config.VERBOSE = opts.full ?? false;\n if (optsDyn.compact !== undefined) {\n config.COMPACT_MODE = Boolean(optsDyn.compact);\n } else {\n config.COMPACT_MODE = !opts.full;\n }\n\n if (opts.logNivel && ['erro', 'aviso', 'info', 'debug'].includes(opts.logNivel)) {\n config.LOG_LEVEL = opts.logNivel as 'erro' | 'aviso' | 'info' | 'debug';\n }\n\n if (opts.stream) {\n config.REPORT_STREAM_ENABLED = true;\n }\n\n // Processar filtros\n const includeGroupsRaw = processPatternGroups(opts.include);\n const includeGroupsExpanded = includeGroupsRaw.map(grupo => expandIncludes(grupo));\n const includeListFlat = includeGroupsExpanded.flat();\n const excludeList = processPatternListAchatado(opts.exclude);\n const incluiNodeModules = includeListFlat.some(caminho => /node_modules/.test(caminho));\n\n // Exibir bloco de filtros se verbose\n exibirBlocoFiltros(includeGroupsExpanded, includeListFlat, excludeList, incluiNodeModules);\n\n // Configurar filtros no config global\n configurarFiltros(includeGroupsRaw, includeListFlat, excludeList, incluiNodeModules);\n const baseDir = process.cwd();\n let guardianResultado: ResultadoGuardian | undefined;\n let fileEntries: FileEntryWithAst[] = [];\n let totalOcorrencias = 0;\n let _jsonEmitted = false;\n\n // Listar analistas se solicitado\n if (opts.listarAnalistas && !opts.json) {\n await listarAnalistas();\n }\n\n // Nota: antigamente tentávamos resolver dinamicamente uma outra\n // instância de `log` aqui (usando casts para `any`) para compatibilidade\n // com mocks; atualmente usamos o `log` importado estaticamente e, quando\n // necessário, importamos dinamicamente nos trechos locais onde isto é\n // requisitado pelos testes. Isso evita uso de `any` e elimina variáveis\n // não utilizadas.\n\n try {\n // Fase inicial do diagnóstico\n if (opts.json) {\n // Suprime cabeçalhos verbosos no modo JSON\n } else if (!config.COMPACT_MODE) {\n logExt.fase?.('Iniciando diagnóstico completo');\n } else {\n logExt.fase?.('Diagnóstico (modo compacto)');\n }\n\n // 1) Primeira varredura rápida (sem AST) apenas para obter entries e opcionalmente rodar Guardian\n logExt.fase?.('Varredura');\n const leituraInicial = await iniciarInquisicao(baseDir, {\n incluirMetadados: false,\n skipExec: true\n });\n fileEntries = leituraInicial.fileEntries; // contém conteúdo mas sem AST\n\n // Criação e/ou salvamento de arquétipo personalizado sob demanda\n if (opts.criarArquetipo) {\n try {\n const norm = (caminho: string) => caminho.replace(/\\\\/g, '/');\n const dirSet = new Set<string>();\n const arquivosRaiz: string[] = [];\n for (const fe of fileEntries) {\n const rel = norm(fe.relPath || fe.fullCaminho || '');\n if (!rel) continue;\n if (!rel.includes('/')) {\n arquivosRaiz.push(rel);\n }\n const parts = rel.split('/');\n if (parts.length > 1) {\n // acumula prefixos de diretórios: ex.: src/a/b -> 'src', 'src/a', 'src/a/b'\n for (let indice = 1; indice < parts.length; indice++) {\n const dirPath = parts.slice(0, indice).join('/');\n if (dirPath) dirSet.add(dirPath);\n }\n }\n }\n\n // Tenta obter nome do projeto a partir do package.json (preferência: fileEntries; fallback: disco)\n let nomeProjeto = path.basename(baseDir);\n try {\n const pkg = fileEntries?.find(fe => /(^|[\\\\/])package\\.json$/.test(fe.relPath || fe.fullCaminho));\n if (pkg && typeof pkg.content === 'string' && pkg.content.trim()) {\n const parsed = JSON.parse(pkg.content);\n if (parsed && typeof parsed.name === 'string' && parsed.name.trim()) {\n nomeProjeto = parsed.name.trim();\n }\n } else {\n const pkgCaminho = path.join(baseDir, 'package.json');\n try {\n const raw = await fs.promises.readFile(pkgCaminho, 'utf-8');\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed.name === 'string' && parsed.name.trim()) {\n nomeProjeto = parsed.name.trim();\n }\n } catch (err) {\n log.debug(`Erro ao ler package.json (fallback): ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n } catch (err) {\n log.debug(`Erro ao obter nome do projeto do package.json: ${err instanceof Error ? err.message : String(err)}`);\n }\n const estruturaDetectada = Array.from(dirSet);\n const {\n criarTemplateArquetipoPersonalizado,\n salvarArquetipoPersonalizado\n } = await import('@analysts/architects');\n const arquetipo = criarTemplateArquetipoPersonalizado(nomeProjeto, estruturaDetectada, arquivosRaiz, 'generico');\n if (opts.salvarArquetipo) {\n await salvarArquetipoPersonalizado(arquetipo, baseDir);\n } else if (config.VERBOSE) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.templateArquetipoPreview);\n }\n } catch (erro) {\n log.aviso(`Falha ao gerar/salvar arquétipo personalizado: ${erro instanceof Error ? erro.message : String(erro)}`);\n }\n }\n\n // Executar Guardian se solicitado\n if (config.GUARDIAN_ENABLED) {\n // Usa optional chaining para evitar erro quando o mock não prover `fase`\n logExt.fase?.('Verificando integridade do Tutanus');\n try {\n const resultado = await scanSystemIntegrity(fileEntries, {\n suppressLogs: true\n });\n guardianResultado = resultado;\n switch (resultado.status) {\n case IntegridadeStatus.Ok:\n logGuardian.integridadeOk();\n break;\n case IntegridadeStatus.Criado:\n logGuardian.baselineCriado();\n break;\n case IntegridadeStatus.Aceito:\n logGuardian.baselineAceito();\n break;\n case IntegridadeStatus.AlteracoesDetectadas:\n logGuardian.alteracoesDetectadas();\n totalOcorrencias++;\n break;\n }\n } catch (err) {\n logGuardian.bloqueado();\n if (config.GUARDIAN_ENFORCE_PROTECTION && typeof err === 'object' && err && 'detalhes' in err && Array.isArray((err as {\n detalhes?: unknown;\n }).detalhes)) {\n (err as {\n detalhes: string[];\n }).detalhes.forEach(diretorio => {\n logGuardian.aviso(diretorio);\n });\n if (!process.env.VITEST) {\n try {\n process.exit(1);\n } catch (erro) {\n throw erro;\n }\n }\n } else {\n logGuardian.modoPermissivo();\n }\n }\n }\n\n // Se modo somente varredura estiver ativo, encerramos após coleta inicial\n if (config.SCAN_ONLY) {\n log.info(chalk.bold(`\\n`));\n logGuardian.scanOnly(fileEntries.length);\n if (config.REPORT_EXPORT_ENABLED) {\n try {\n const ts = new Date().toISOString().replace(/[:.]/g, '-');\n const dir = typeof config.REPORT_OUTPUT_DIR === 'string' ? config.REPORT_OUTPUT_DIR : path.join(baseDir, 'reports');\n const fs = await import('node:fs');\n await fs.promises.mkdir(dir, {\n recursive: true\n });\n const nome = `tutanus-scan-${ts}`;\n const resumo = {\n modo: 'scan-only',\n totalArquivos: fileEntries.length,\n timestamp: new Date().toISOString()\n };\n const salvar = await getSalvarEstado();\n await salvar(path.join(dir, `${nome}.json`), resumo);\n log.sucesso(messages.CliProcessamentoDiagnosticoMensagens.relatorioScanSalvo(dir));\n } catch (erro) {\n const msg = messages.CliProcessamentoDiagnosticoMensagens.falhaExportarRelatorioScanOnly(erro instanceof Error ? erro.message : String(erro));\n log.erro(msg);\n }\n }\n if (opts.json) {\n console.log(JSON.stringify({\n modo: 'scan-only',\n totalArquivos: fileEntries.length\n }));\n }\n // Evita encerramento forçado em testes/ambiente de automação\n if (!process.env.VITEST && !opts.json) process.exit(0); else if (!process.env.VITEST && opts.json) process.exitCode = 0;\n return {\n totalOcorrencias: 0,\n temErro: false,\n guardianResultado,\n fileEntriesComAst: [],\n resultadoFinal: {\n ocorrencias: [],\n metricas: {\n totalArquivos: 0,\n tempoTotal: 0,\n analistas: []\n }\n }\n };\n }\n // (bloco de criação de arquétipo removido)\n\n // Parsing lazy: ASTs são parseados sob demanda via ScopeAstCache\n // Suporte ao fast-mode: reduz carga (parcialmente) quando ativo\n const fastMode = Boolean(opts.fast);\n let fileEntriesComAst: FileEntryWithAst[] = fileEntries.map(entry => ({\n ...entry,\n ast: undefined\n }));\n if (fastMode) {\n // Se houver convenções específicas para fastMode no config, tenta aplicá-las (mesmo que simplificado)\n const fmConfig = configDyn.fastMode as Record<string, unknown> | undefined;\n if (fmConfig?.conventions && typeof fmConfig.conventions === 'object') {\n Object.assign(config.conventions, fmConfig.conventions);\n }\n\n // Heurística robusta: prioriza arquivos em src/ e ignora testes/configs/docs usando convenções\n fileEntriesComAst = fileEntriesComAst.filter(fe => {\n const rel = fe.relPath || fe.fullCaminho || '';\n if (!rel) return false;\n\n // Deve estar em src (ou equivalente como codigo/source)\n const isSrc = isInsideSrc(rel);\n // Não deve ser teste ou configuração\n const isTest = isInsideTestsDirectory(rel);\n const isConfig = isInsideConfigDirectory(rel);\n return isSrc && !isTest && !isConfig;\n });\n }\n\n // Detectar arquétipos (pode retornar undefined em casos mínimos)\n const arquetiposResultado: Awaited<ReturnType<typeof detectarArquetipos>> | undefined = await detectarArquetiposComTimeout({\n arquivos: fileEntriesComAst,\n baseDir\n }, baseDir, {\n quiet: opts.json\n });\n\n // Continuar com o processamento restante...\n // Em fast-mode, reduz o conjunto de analistas para acelerar\n const registro = (await import('@analysts/registry')).registroAnalistas;\n let tecnicas = asTecnicas(registro);\n if (fastMode) {\n const fmFastMode = configDyn.fastMode as Record<string, unknown> | undefined;\n const includeList = Array.isArray(fmFastMode?.analystsInclude) ? fmFastMode.analystsInclude as string[] : [];\n const excludeList = Array.isArray(fmFastMode?.analystsExclude) ? fmFastMode.analystsExclude as string[] : [];\n tecnicas = asTecnicas((registro as (import('@').Analista | import('@').Tecnica)[]).filter(arquivo => {\n const nomeRaw = arquivo.nome || '';\n const norm = (string: string) => string.toLowerCase().replace(/[^a-z0-9]+/g, '-');\n const nome = norm(nomeRaw);\n const matchIncluir = includeList.length ? includeList.some(node => {\n const nn = norm(node);\n return nome.includes(nn) || nomeRaw.toLowerCase().includes(node.toLowerCase());\n }) : true;\n const matchExcluir = excludeList.some(node => {\n const nn = norm(node);\n return nome.includes(nn) || nomeRaw.toLowerCase().includes(node.toLowerCase());\n });\n return matchIncluir && !matchExcluir;\n }));\n }\n logExt.fase?.('Executando analistas');\n\n // Flags especiais (disponíveis para detectores/analistas via config global)\n try {\n const verifyCycles = Boolean(optsDyn.verifyCycles || configDyn.SPECIAL_VERIFY_CYCLES);\n configDyn.SPECIAL_VERIFY_CYCLES = verifyCycles;\n } catch (err) {\n log.debug(`Erro ao configurar flags especiais (verifyCycles): ${err instanceof Error ? err.message : String(err)}`);\n }\n const resultadoExecucao = await executarInquisicao(fileEntriesComAst, tecnicas, baseDir, converterResultadoGuardian(guardianResultado), {\n verbose: config.VERBOSE,\n compact: config.COMPACT_MODE,\n fast: opts.fast, // undefined = auto (worker pool > threshold), true = força, false = sequencial\n });\n\n // Processar métricas e ocorrências\n registrarUltimasMetricas(resultadoExecucao.metricas);\n // Deduplica ocorrências repetidas para reduzir ruído no orquestrador\n let ocorrenciasFiltradas = dedupeOcorrencias(resultadoExecucao.ocorrencias || []);\n // Trust Compiler: se habilitado, reduzir ocorrências quando TS/ESLint não reportam\n const trustCompiler = Boolean(optsDyn.trustCompiler || configDyn.SPECIAL_TRUST_COMPILER);\n if (trustCompiler) {\n try {\n fs.statSync(path.join(baseDir, 'tsconfig.json'));\n ocorrenciasFiltradas = ocorrenciasFiltradas.filter(ocorrencia => {\n const regra = ocorrencia.tipo || '';\n // regras que o compilador/ESLint normalmente cobrem\n const cobertas = [/import.*nao.*usado/i, /tipo-inseguro.*unknown/i];\n return !cobertas.some(raiz => raiz.test(regra));\n });\n } catch (err) {\n log.debug(`Erro em processarDiagnostico (trustCompiler): ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n // Conciliação simples entre analistas: rebaixa severidade em casos de conflito\n try {\n const byLoc = new Map<string, {\n tipos: Set<string>;\n items: Ocorrencia[];\n }>();\n for (const ocorrencia of ocorrenciasFiltradas) {\n const key = `${ocorrencia.relPath || ''}:${ocorrencia.linha || 0}`;\n const tipo = ocorrencia.tipo || '';\n if (!byLoc.has(key)) byLoc.set(key, {\n tipos: new Set<string>(),\n items: []\n });\n const entry = byLoc.get(key);\n if (!entry) continue;\n entry.tipos.add(tipo);\n entry.items.push(ocorrencia);\n }\n for (const [, entry] of byLoc) {\n const tipos = Array.from(entry.tipos);\n const hasTipoUnsafe = tipos.some(t => t.startsWith('tipo-inseguro'));\n const hasComplexity = tipos.some(t => /complexidade|funcoes-longas/i.test(t));\n if (hasTipoUnsafe && hasComplexity) {\n for (const item of entry.items) {\n const tipo = String(item.tipo || '');\n if (tipo.startsWith('tipo-inseguro')) {\n item.nivel = 'aviso';\n item.mensagem = `${item.mensagem} | Conciliação: inferência e tipagem explícita em conflito; revisar caso`;\n }\n }\n }\n }\n } catch (err) {\n log.debug(`Erro em processarDiagnostico (conciliação analistas): ${err instanceof Error ? err.message : String(err)}`);\n }\n // Aplicar supressões configuradas em tutanus.config.json\n ocorrenciasFiltradas = aplicarSupressaoOcorrencias(ocorrenciasFiltradas, config as FiltrosConfig | undefined);\n const totalOcorrenciasProcessadas = ocorrenciasFiltradas.length;\n\n // [LANCAMENTO] PROCESSAMENTO DE FLAGS INTUITIVAS\n // Mapear flags intuitivas para as flags internas\n if (opts.fix && !opts.autoFix) {\n opts.autoFix = true;\n logSistema.processamentoFixDetectada();\n }\n if (opts.fixSafe && !opts.autoFixConservative) {\n opts.autoFixConservative = true;\n opts.autoFix = true;\n log.info(MENSAGENS_AUTOFIX.flags.fixSafe);\n }\n\n const autoFixResult = await executarAutoFixInterno(opts, ocorrenciasFiltradas, fileEntriesComAst, baseDir, totalOcorrencias);\n ocorrenciasFiltradas = autoFixResult.ocorrenciasFiltradas;\n totalOcorrencias = autoFixResult.totalOcorrencias;\n\n // Logging básico sempre, detalhado para --verbose e --debug\n const tiposOcorrencias = new Map<string, number>();\n const nivelOcorrencias = new Map<string, number>();\n ocorrenciasFiltradas.forEach(ocorrencia => {\n const tipo = ocorrencia.tipo || 'DESCONHECIDO';\n const nivel = ocorrencia.nivel || 'info';\n tiposOcorrencias.set(tipo, (tiposOcorrencias.get(tipo) || 0) + 1);\n nivelOcorrencias.set(nivel, (nivelOcorrencias.get(nivel) || 0) + 1);\n });\n if (tiposOcorrencias.size > 0 && !opts.json) {\n // Modo executivo: mostrar resumo executivo conciso e acionável\n if (opts.executive) {\n try {\n const criticos = nivelOcorrencias.get('erro') || 0;\n const altos = nivelOcorrencias.get('alto') || 0;\n const total = totalOcorrenciasProcessadas;\n\n // Top arquivos por ocorrências (somente erros/avisos críticos para executivo)\n const arquivoContagem = new Map<string, number>();\n for (const oc of ocorrenciasFiltradas) {\n const pathChave = (oc.relPath || oc.arquivo || 'desconhecido') as string;\n const nivel = oc.nivel || 'info';\n if (nivel === 'erro' || nivel === 'alto') {\n arquivoContagem.set(pathChave, (arquivoContagem.get(pathChave) || 0) + 1);\n }\n }\n const topArquivos = Array.from(arquivoContagem.entries()).sort((arquivo, base) => base[1] - arquivo[1]).slice(0, 5);\n const header = messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoHeader(total, criticos, altos);\n if (typeof logExt.imprimirBloco === 'function') {\n const linhas = [messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoCriticos(criticos), messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoAltos(altos), messages.CliProcessamentoDiagnosticoMensagens.linhaEmBranco, messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoTopArquivosErrosAltos, ...topArquivos.map(([arquivo, elem]) => messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoBulletTopArquivo(arquivo, elem)), messages.CliProcessamentoDiagnosticoMensagens.linhaEmBranco, messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoAcaoSugerida];\n logExt.imprimirBloco(header, linhas);\n } else {\n log.info(header);\n if (topArquivos.length > 0) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoTopArquivosErrosAltos);\n topArquivos.forEach(([arquivo, elem]) => log.info(messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoBulletTopArquivo(arquivo, elem)));\n }\n log.info(messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoAcaoSugerida);\n }\n } catch {\n // não crítico\n }\n }\n // Resumo básico sempre (não verbose e não executive)\n else if (!config.VERBOSE && !config.DEV_MODE) {\n logSistema.processamentoResumoOcorrencias(totalOcorrenciasProcessadas);\n\n // Top 5 tipos mais comuns\n const topTipos = Array.from(tiposOcorrencias.entries()).sort((arquivo, base) => base[1] - arquivo[1]).slice(0, 10);\n console.log(messages.CliProcessamentoDiagnosticoMensagens.linhaEmBranco);\n console.log(messages.CliProcessamentoDiagnosticoMensagens.principaisTiposTitulo);\n topTipos.forEach(([tipo, count]) => {\n console.log(messages.CliProcessamentoDiagnosticoMensagens.principaisTiposLinha(tipo, count));\n });\n\n // Mini top arquivos (10) para ação rápida\n try {\n const arquivoContagem = new Map<string, number>();\n for (const oc of ocorrenciasFiltradas) {\n const pathChave = (oc.relPath || oc.arquivo || 'desconhecido') as string;\n arquivoContagem.set(pathChave, (arquivoContagem.get(pathChave) || 0) + 1);\n }\n const topArquivos = Array.from(arquivoContagem.entries()).sort((arquivo, base) => base[1] - arquivo[1]).slice(0, 10);\n if (topArquivos.length > 0) {\n console.log(messages.CliProcessamentoDiagnosticoMensagens.linhaEmBranco);\n console.log(messages.CliProcessamentoDiagnosticoMensagens.topArquivosTitulo);\n topArquivos.forEach(([arquivo, elem]) => console.log(messages.CliProcessamentoDiagnosticoMensagens.topArquivosLinha(arquivo, elem)));\n }\n } catch {\n /* ignore */\n }\n console.log(messages.CliProcessamentoDiagnosticoMensagens.linhaEmBranco);\n logSistema.processamentoDicasContextuais();\n\n // Dicas baseadas no conteúdo real encontrado\n const totalTodos = tiposOcorrencias.get('TODO_PENDENTE') || 0;\n const totalQuickFixes = (tiposOcorrencias.get('QUICK_FIX_DISPONIVEL') || 0) + (tiposOcorrencias.get('auto-fix-disponivel') || 0);\n const totalErros = nivelOcorrencias.get('erro') || 0;\n const totalAvisos = nivelOcorrencias.get('aviso') || 0;\n if (totalErros > 0) {\n logSistema.processamentoErrosCriticos(totalErros);\n }\n if (totalAvisos > 0) {\n logSistema.processamentoAvisosEncontrados(totalAvisos);\n }\n if (totalQuickFixes > 10) {\n logSistema.processamentoQuickFixesMuitos(totalQuickFixes);\n logSistema.processamentoQuickFixesComando();\n logSistema.processamentoQuickFixesExecutar();\n } else if (totalQuickFixes > 0) {\n logSistema.processamentoQuickFixesMuitos(totalQuickFixes);\n logSistema.processamentoQuickFixesComando();\n logSistema.processamentoQuickFixesExecutar();\n }\n if (totalTodos > 50) {\n logSistema.processamentoTodosMuitos(totalTodos);\n } else if (totalTodos > 0) {\n logSistema.processamentoTodosPoucos(totalTodos);\n }\n const MAX_OCORRENCIAS_WARN_THRESHOLD = 1000;\n if (totalOcorrenciasProcessadas > MAX_OCORRENCIAS_WARN_THRESHOLD) {\n logSistema.processamentoMuitasOcorrencias();\n logSistema.processamentoFiltrarPasta();\n }\n logSistema.processamentoUsarFull();\n logSistema.processamentoUsarJson();\n if (totalOcorrenciasProcessadas < 100) {\n logSistema.processamentoProjetoLimpo();\n }\n } else {\n // Detalhamento completo para --verbose (ou quando --full ativo)\n logSistema.processamentoDetalhamentoOcorrencias(totalOcorrenciasProcessadas);\n\n // Mostrar por tipo\n log.info(messages.CliProcessamentoDiagnosticoMensagens.porTipoTitulo);\n Array.from(tiposOcorrencias.entries()).sort((arquivo, base) => base[1] - arquivo[1]).forEach(([tipo, count]) => {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.porTipoLinha(tipo, count));\n });\n\n // Mostrar por nível de severidade\n log.info(messages.CliProcessamentoDiagnosticoMensagens.porSeveridadeTitulo);\n Array.from(nivelOcorrencias.entries()).sort((arquivo, base) => base[1] - arquivo[1]).forEach(([nivel, count]) => {\n const emoji = nivel === 'erro' ? '[RED]' : nivel === 'aviso' ? '[YELLOW]' : '[BLUE]';\n log.info(messages.CliProcessamentoDiagnosticoMensagens.porSeveridadeLinha(emoji, nivel, count));\n });\n\n // Adicionar top arquivos com contagem (útil para investigação)\n try {\n const arquivosContagem = new Map<string, number>();\n for (const oc of ocorrenciasFiltradas) {\n const key = (oc.relPath || oc.arquivo || 'desconhecido') as string;\n arquivosContagem.set(key, (arquivosContagem.get(key) || 0) + 1);\n }\n const topArquivosAll = Array.from(arquivosContagem.entries()).sort((arquivo, base) => base[1] - arquivo[1]).slice(0, 10);\n if (topArquivosAll.length) {\n if (typeof logExt.imprimirBloco === 'function') {\n const linhas = [messages.CliProcessamentoDiagnosticoMensagens.topArquivosPorOcorrenciasTitulo, ...topArquivosAll.map(([arquivo, elem]) => messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoBulletTopArquivo(arquivo, elem))];\n logExt.imprimirBloco(messages.CliProcessamentoDiagnosticoMensagens.arquivosMaisOcorrenciasTitulo, linhas);\n } else {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.topArquivosPorOcorrenciasTitulo);\n topArquivosAll.forEach(([arquivo, elem]) => log.info(messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoBulletTopArquivo(arquivo, elem)));\n }\n }\n\n // Top críticos imediatos (erros/alto) para ação rápida\n const criticosOuAltos: Array<{\n arquivo: string;\n tipo: string;\n nivel: string;\n linha?: number;\n coluna?: number;\n }> = [];\n for (const oc of ocorrenciasFiltradas) {\n const nivel = (oc.nivel || 'info').toString().toLowerCase();\n if (nivel === 'erro' || nivel === 'alto') {\n criticosOuAltos.push({\n arquivo: oc.relPath || oc.arquivo || 'desconhecido',\n tipo: oc.tipo || 'desconhecido',\n nivel,\n linha: typeof oc.linha === 'number' ? oc.linha : undefined,\n coluna: typeof oc.coluna === 'number' ? oc.coluna : undefined\n });\n }\n }\n // Ordenação por severidade: erro > alto > aviso (se houver)\n const ordemNivel = (node: string) => node === 'erro' ? 3 : node === 'alto' ? 2 : node === 'aviso' ? 1 : 0;\n const topCriticos = criticosOuAltos.sort((arquivo, base) => ordemNivel(base.nivel) - ordemNivel(arquivo.nivel)).slice(0, 10);\n if (topCriticos.length) {\n if (typeof logExt.imprimirBloco === 'function') {\n const linhas = topCriticos.map(elem => {\n const pos = typeof elem.linha === 'number' ? `:${elem.linha}${typeof elem.coluna === 'number' ? `:${elem.coluna}` : ''}` : '';\n return messages.CliProcessamentoDiagnosticoMensagens.topCriticosLinha(elem.nivel.toUpperCase(), elem.tipo, elem.arquivo, pos);\n });\n logExt.imprimirBloco(messages.CliProcessamentoDiagnosticoMensagens.topCriticosTitulo, linhas);\n } else {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.topCriticosTituloComDoisPontos);\n topCriticos.forEach(elem => {\n const pos = typeof elem.linha === 'number' ? `:${elem.linha}${typeof elem.coluna === 'number' ? `:${elem.coluna}` : ''}` : '';\n log.info(messages.CliProcessamentoDiagnosticoMensagens.topCriticosLinha(elem.nivel.toUpperCase(), elem.tipo, elem.arquivo, pos));\n });\n }\n }\n\n // Amostra de ocorrências (limite para não poluir o terminal)\n const SAMPLE_MAX = 50;\n const sample = ocorrenciasFiltradas.slice(0, SAMPLE_MAX).map(ocorrencia => `${ocorrencia.relPath}:${ocorrencia.linha ?? ''} [${ocorrencia.nivel ?? ''}] ${String(ocorrencia.mensagem ?? '').replace(/\\n/g, ' ')}`);\n if (sample.length) {\n if (typeof logExt.imprimirBloco === 'function') {\n logExt.imprimirBloco(messages.CliProcessamentoDiagnosticoMensagens.amostraBlocoTitulo(sample.length), sample.slice(0, 20));\n } else {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.amostraOcorrenciasTitulo);\n sample.slice(0, 20).forEach(string => log.info(messages.CliProcessamentoDiagnosticoMensagens.amostraLinhaIndentada(string)));\n }\n if (ocorrenciasFiltradas.length > SAMPLE_MAX) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.amostraMaisLinhas(SAMPLE_MAX, ocorrenciasFiltradas.length));\n }\n }\n } catch {\n // ignore\n }\n }\n }\n\n // Logging adicional para DEBUG\n if (config.VERBOSE || config.DEV_MODE) {\n if (config.DEV_MODE && !opts.json && resultadoExecucao.metricas) {\n if (resultadoExecucao.metricas.analistas) {\n const analistasComOcorrencias = resultadoExecucao.metricas.analistas.filter(arquivo => (arquivo.ocorrencias ?? 0) > 0);\n logSistema.processamentoAnalistasProblemas(analistasComOcorrencias.length);\n analistasComOcorrencias.forEach(analista => {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.analistaOcorrenciasLinha(analista.nome, analista.ocorrencias, analista.duracaoMs.toFixed(1)));\n });\n }\n }\n }\n\n // Mensagem final apenas quando repositório está limpo\n try {\n if (!opts.json && !config.SCAN_ONLY && totalOcorrencias === 0) {\n logRelatorio.repositorioImpecavel();\n }\n } catch (err) {\n log.debug(`Erro ao emitir log de repositório impecável: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Em ambiente de testes (Vitest) também invocar via import dinâmico o módulo\n // que os testes normalmente mockam (`../../src/nucleo/constelacao/log.js`).\n // Isso garante que, mesmo que haja alguma diferença de instância entre o\n // import estático e o mock aplicado pelo Vitest, as spies do teste sejam\n // chamadas e asserções sobre `logMock` passem.\n // (removed temporary vitest dynamic invocations)\n\n // Log de diagnóstico concluído para testes\n if (process.env.VITEST && !opts.json) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.diagnosticoConcluido);\n }\n\n // Processar arquétipos se disponível\n if (arquetiposResultado) {\n // Lógica de processamento de arquétipos seria implementada aqui\n // Por enquanto, apenas log se verbose\n if (config.VERBOSE && arquetiposResultado.candidatos?.length > 0) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.arquetiposDetectados(arquetiposResultado.candidatos.length));\n }\n\n // Em modo compacto, mostrar informação resumida sobre arquétipos\n if (!config.VERBOSE && config.COMPACT_MODE && arquetiposResultado.candidatos?.length > 0) {\n const topCandidato = arquetiposResultado.candidatos[0];\n log.info(messages.CliProcessamentoDiagnosticoMensagens.arquetiposCompact(topCandidato.nome, topCandidato.confidence));\n }\n\n // Exibir informações sobre candidatos mesmo quando não verbose (para testes)\n if (!config.VERBOSE && arquetiposResultado.candidatos?.length > 0) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.arquetiposCandidatosEncontrados(arquetiposResultado.candidatos.length));\n }\n\n // Exibir informações detalhadas dos arquetipos se verbose\n if (config.VERBOSE && arquetiposResultado.candidatos?.length > 0) {\n const candidatoTop = arquetiposResultado.candidatos[0];\n\n // Log dos candidatos\n log.info(messages.CliProcessamentoDiagnosticoMensagens.arquetiposCandidatosTitulo);\n for (const candidato of arquetiposResultado.candidatos.slice(0, 3)) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.arquetiposCandidatoLinha(candidato.nome, candidato.confidence));\n }\n\n // Log do planoSugestao se existir\n if (candidatoTop.planoSugestao) {\n const plano = candidatoTop.planoSugestao;\n if (plano.mover && plano.mover.length > 0) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.planoSugestaoMove(plano.mover.length));\n } else {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.planoSugestaoNenhumMove);\n }\n if (plano.conflitos && plano.conflitos.length > 0) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.conflitos(plano.conflitos.length));\n }\n }\n\n // Log de anomalias se existirem\n if (candidatoTop.anomalias && candidatoTop.anomalias.length > 0) {\n const tituloAnomalias = messages.CliProcessamentoDiagnosticoMensagens.anomaliasTitulo;\n const linhasAnomalias: string[] = [];\n for (const anomalia of candidatoTop.anomalias.slice(0, 8)) {\n linhasAnomalias.push(messages.CliProcessamentoDiagnosticoMensagens.anomaliaLinha(anomalia.path, anomalia.motivo));\n }\n if (candidatoTop.anomalias.length > 8) {\n linhasAnomalias.push(messages.CliProcessamentoDiagnosticoMensagens.anomaliasMais(candidatoTop.anomalias.length - 8));\n }\n if (typeof logExt.imprimirBloco === 'function') {\n logExt.imprimirBloco(tituloAnomalias, linhasAnomalias);\n } else {\n // Fallback para logs simples se imprimirBloco não estiver disponível\n log.info(messages.CliProcessamentoDiagnosticoMensagens.anomaliasTituloComDoisPontos);\n for (const linha of linhasAnomalias) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.amostraLinhaIndentada(linha));\n }\n }\n\n // Log adicional sobre anomalias ocultas se houver mais de 8\n if (candidatoTop.anomalias.length > 8) {\n log.aviso(messages.CliProcessamentoDiagnosticoMensagens.anomaliasOcultasAviso(candidatoTop.anomalias.length - 8));\n }\n }\n\n // Log de drift se existir\n if (arquetiposResultado.drift) {\n const drift = arquetiposResultado.drift;\n if (drift.alterouArquetipo) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.driftAlterou(drift.anterior, drift.atual));\n } else {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.driftMantido(drift.atual));\n }\n if (drift.arquivosRaizNovos && drift.arquivosRaizNovos.length > 0) {\n const novosStr = drift.arquivosRaizNovos.length > 3 ? `${drift.arquivosRaizNovos.slice(0, 3).join(', ')}...` : drift.arquivosRaizNovos.join(', ');\n log.info(messages.CliProcessamentoDiagnosticoMensagens.driftNovos(novosStr));\n }\n if (drift.arquivosRaizRemovidos && drift.arquivosRaizRemovidos.length > 0) {\n const removidosStr = drift.arquivosRaizRemovidos.length > 3 ? `${drift.arquivosRaizRemovidos.slice(0, 3).join(', ')}...` : drift.arquivosRaizRemovidos.join(', ');\n log.info(messages.CliProcessamentoDiagnosticoMensagens.driftRemovidos(removidosStr));\n }\n }\n } else if (config.VERBOSE) {\n // Debug: log se não há candidatos ou arquetiposResultado é undefined\n const candidatosContagem = arquetiposResultado ? (arquetiposResultado as Awaited<ReturnType<typeof detectarArquetipos>>).candidatos?.length || 0 : 0;\n log.info(`DEBUG: arquetiposResultado=${!!arquetiposResultado}, candidatos=${candidatosContagem}`);\n }\n\n // Imprimir bloco de resumo de estrutura se houver baseline/drift (fora de JSON)\n if (!opts.json && arquetiposResultado && (arquetiposResultado.baseline || arquetiposResultado.drift)) {\n const linhasEstrutura: string[] = [];\n if (arquetiposResultado.baseline) {\n const baseline = arquetiposResultado.baseline;\n linhasEstrutura.push(messages.CliProcessamentoDiagnosticoMensagens.baselineArquetipo(baseline.arquetipo, baseline.confidence));\n linhasEstrutura.push(messages.CliProcessamentoDiagnosticoMensagens.baselineCriadoEm(new Date(baseline.timestamp).toLocaleString('pt-BR')));\n } else {\n // Log de aviso quando não há baseline\n log.aviso(messages.CliProcessamentoDiagnosticoMensagens.baselineDesconhecidoAviso);\n linhasEstrutura.push(messages.CliProcessamentoDiagnosticoMensagens.baselineArquetipoDesconhecido);\n }\n if (arquetiposResultado.drift) {\n const drift = arquetiposResultado.drift;\n if (drift.alterouArquetipo) {\n linhasEstrutura.push(messages.CliProcessamentoDiagnosticoMensagens.driftDetectado(drift.anterior, drift.atual));\n } else {\n linhasEstrutura.push(messages.CliProcessamentoDiagnosticoMensagens.arquetipoMantido(drift.atual));\n }\n if (drift.arquivosRaizNovos && drift.arquivosRaizNovos.length > 0) {\n linhasEstrutura.push(messages.CliProcessamentoDiagnosticoMensagens.novosArquivosRaiz(drift.arquivosRaizNovos.join(', ')));\n }\n if (drift.arquivosRaizRemovidos && drift.arquivosRaizRemovidos.length > 0) {\n linhasEstrutura.push(messages.CliProcessamentoDiagnosticoMensagens.arquivosRemovidosRaiz(drift.arquivosRaizRemovidos.join(', ')));\n }\n }\n if (arquetiposResultado.candidatos && arquetiposResultado.candidatos.length > 0) {\n const top = arquetiposResultado.candidatos[0];\n linhasEstrutura.push(messages.CliProcessamentoDiagnosticoMensagens.candidatoPrincipal(top.nome, top.confidence));\n }\n const tituloEstrutura = messages.CliProcessamentoDiagnosticoMensagens.resumoEstruturaTitulo;\n if (typeof logExt.imprimirBloco === 'function') {\n // Calcular largura como nos outros blocos\n let larguraEstrutura: number | undefined;\n if (typeof logExt.calcularLargura === 'function') {\n larguraEstrutura = logExt.calcularLargura(tituloEstrutura, linhasEstrutura, config.COMPACT_MODE ? 84 : 96);\n // Se calcularLargura retornar undefined, usar fallback\n if (typeof larguraEstrutura !== 'number' || isNaN(larguraEstrutura)) {\n larguraEstrutura = config.COMPACT_MODE ? 84 : 96;\n }\n } else {\n larguraEstrutura = config.COMPACT_MODE ? 84 : 96;\n }\n logExt.imprimirBloco(tituloEstrutura, linhasEstrutura, undefined, larguraEstrutura);\n }\n }\n\n // Saída JSON se solicitado\n // Não imprimir logs arbitrários antes do JSON final - isso quebra os testes que\n // esperam JSON puro em stdout. Em ambiente de desenvolvimento, registrar via\n // logger debug para auxiliar diagnóstico local.\n if (config.DEV_MODE) {\n logExt.debug?.(messages.CliProcessamentoDiagnosticoMensagens.debugAboutToEmitJson(JSON.stringify(opts)));\n }\n if (opts.json) {\n // Agregar ocorrências de TODO_PENDENTE por arquivo\n const ocorrenciasOriginais = ocorrenciasFiltradas;\n const todosPorArquivo = new Map<string, typeof ocorrenciasOriginais>();\n\n // Separar TODOs dos outros tipos de ocorrência\n const naoTodos: typeof ocorrenciasOriginais = [];\n for (const ocorrencia of ocorrenciasOriginais) {\n if (ocorrencia.tipo === 'TODO_PENDENTE') {\n const relPath = ocorrencia.relPath || 'desconhecido';\n if (!todosPorArquivo.has(relPath)) {\n todosPorArquivo.set(relPath, []);\n }\n const todosArray = todosPorArquivo.get(relPath);\n if (todosArray) {\n todosArray.push(ocorrencia);\n }\n } else {\n naoTodos.push(ocorrencia);\n }\n }\n\n // Agregar TODOs por arquivo\n const todosAgregados: typeof ocorrenciasOriginais = [];\n for (const [, todos] of todosPorArquivo) {\n if (todos.length === 1) {\n todosAgregados.push(todos[0]);\n } else if (todos.length > 1) {\n // Criar ocorrência agregada\n const primeira = todos[0];\n const mensagemAgregada = messages.CliProcessamentoDiagnosticoMensagens.todosPendentesEncontrados(todos.length);\n todosAgregados.push({\n ...primeira,\n mensagem: mensagemAgregada,\n linha: Math.min(...todos.map(textoTitulo => textoTitulo.linha || 0))\n });\n }\n }\n\n // Combinar ocorrências agregadas e deduplicar para reduzir ruído\n let todasOcorrencias = [...naoTodos, ...todosAgregados];\n todasOcorrencias = dedupeOcorrencias(todasOcorrencias);\n\n // Em modo --json: emitir apenas erros e localizações (sem métricas/caches/tempos).\n // Antes, normaliza para enriquecer `linha/coluna` quando disponível via `loc`.\n const ocorrenciasParaJson = todasOcorrencias.map(ocorrencia => normalizarOcorrenciaParaJson(ocorrencia)).filter(ocorrencia => {\n const nivel = (ocorrencia.nivel || 'info') as string;\n return nivel === 'erro' || ocorrencia.tipo === 'PARSE_ERRO';\n });\n const totalOcorrenciasJson = ocorrenciasParaJson.length;\n\n // Agregar tipos de ocorrências\n const tiposOcorrencias: Record<string, number> = {};\n const parseErros: ParseErrosJson = {\n totalOriginais: 0,\n totalExibidos: 0,\n agregados: 0\n };\n\n // Contar tipos de ocorrências e parse erros\n for (const ocorrencia of ocorrenciasParaJson) {\n const tipo = ocorrencia.tipo || 'desconhecido';\n tiposOcorrencias[tipo] = (tiposOcorrencias[tipo] || 0) + 1;\n\n // Contar parse erros\n if (tipo === 'PARSE_ERRO') {\n parseErros.totalOriginais++;\n parseErros.totalExibidos++;\n }\n }\n\n // Ler parse erros das variáveis globais (para testes e cenários especiais)\n const globalThisExt = globalThis as {\n __TUTANUS_PARSE_ERROS__?: unknown[];\n __TUTANUS_PARSE_ERROS_ORIGINAIS__?: number;\n };\n const parseErrosGlobais = globalThisExt.__TUTANUS_PARSE_ERROS__ || [];\n const parseErrosOriginais = globalThisExt.__TUTANUS_PARSE_ERROS_ORIGINAIS__ || 0;\n\n // Adicionar parse erros globais à contagem\n if (parseErrosGlobais.length > 0 || parseErrosOriginais > 0) {\n parseErros.totalOriginais = Math.max(parseErros.totalOriginais, parseErrosOriginais);\n\n // Se há array global, usar seu tamanho; senão, manter o valor atual (que vem das ocorrências reais)\n if (parseErrosGlobais.length > 0) {\n parseErros.totalExibidos = Math.min(parseErros.totalOriginais, parseErrosGlobais.length);\n }\n // Se não há array global, totalExibidos já foi definido com o número de ocorrências reais\n\n // Atualizar totalOcorrencias se há parse erros\n if (parseErrosOriginais > 0) {\n totalOcorrencias = Math.max(totalOcorrencias, parseErrosOriginais);\n }\n }\n\n // Calcular agregados\n parseErros.agregados = Math.max(0, parseErros.totalOriginais - parseErros.totalExibidos);\n\n // Determinar status baseado nas regras\n let status = 'ok';\n if (totalOcorrenciasJson > 0) {\n status = 'problemas';\n // Se há PARSE_ERRO e PARSE_ERRO_FALHA está ativo, marcar como erro\n if (parseErros.totalOriginais > 0 && config.PARSE_ERRO_FALHA) {\n status = 'erro';\n }\n }\n const saidaJson: SaidaJsonDiagnostico = {\n status: status as 'ok' | 'problemas' | 'erro',\n totalOcorrencias: totalOcorrenciasJson,\n guardian: guardianResultado ? 'verificado' : 'nao-verificado',\n tiposOcorrencias,\n parseErros,\n ocorrencias: ocorrenciasParaJson,\n linguagens: {\n total: 0,\n extensoes: {}\n } // será preenchido depois\n };\n\n // Só incluir estruturaIdentificada se houver resultado de arquetipos\n if (arquetiposResultado) {\n saidaJson.estruturaIdentificada = {\n melhores: arquetiposResultado.candidatos || [],\n baseline: arquetiposResultado.baseline || null,\n drift: arquetiposResultado.drift || {\n alterouArquetipo: false,\n deltaConfidence: 0,\n arquivosRaizNovos: [],\n arquivosRaizRemovidos: []\n }\n };\n }\n\n // JSON será emitido usando helper centralizado que aplica escapes Unicode\n\n const linguagensFinal = computeLinguagens(fileEntriesComAst || fileEntries);\n\n // Anexa valores calculados\n saidaJson.linguagens = linguagensFinal;\n\n // Gerar JSON usando utilitário comum com escape Unicode\n try {\n // Adicionar metadados de versão do schema e timestamp para compatibilidade\n const schemaMeta = {\n schemaVersion: '1.0.0',\n tutanusVersion: '0.0.0',\n timestamp: new Date().toISOString()\n };\n const saidaComMeta = {\n ...schemaMeta,\n ...saidaJson\n };\n // Verificar flag CLI/opt para ascii-only\n const asciiOnly = Boolean(opts && (opts as OpcoesProcessamentoDiagnostico).jsonAscii || false);\n let jsonOutput = stringifyJsonEscaped(saidaComMeta, 2, {\n asciiOnly\n });\n jsonOutput = traduzirRelatorioJson(jsonOutput);\n console.log(jsonOutput);\n _jsonEmitted = true;\n } catch (erro) {\n console.error(messages.CliProcessamentoDiagnosticoMensagens.errorGeneratingJson, erro);\n console.log(messages.CliProcessamentoDiagnosticoMensagens.fallbackJson, JSON.stringify(saidaJson));\n _jsonEmitted = true;\n }\n // Exit codes padronizados: 0=ok/avisos, 1=erros, 2=critico (parse erros fatais)\n if (!process.env.VITEST) {\n const erros = (nivelOcorrencias.get('erro') || 0) as number;\n const exitCode = parseErros.totalOriginais > 0 && config.PARSE_ERRO_FALHA ? 2 : erros > 0 ? 1 : 0;\n process.exit(exitCode);\n }\n }\n\n // Logs finais fora do modo JSON e quando não é scan-only\n if (!opts.json && !config.SCAN_ONLY) {\n // Imprimir bloco de resumo de tipos se houver ocorrências\n if (totalOcorrencias > 0 && ocorrenciasFiltradas) {\n // Modo executivo: apenas problemas críticos e altos\n if (opts.executive) {\n const {\n gerarResumoExecutivo\n } = await import('@reports');\n const resumoExec = gerarResumoExecutivo(ocorrenciasFiltradas);\n if (resumoExec.detalhes.length > 0) {\n const linhasExec = resumoExec.detalhes.map(problema => `${problema.icone} ${problema.titulo.padEnd(25)} ${problema.quantidade.toString().padStart(6)}`);\n const tituloExec = messages.CliProcessamentoDiagnosticoMensagens.resumoExecutivoTitulo(resumoExec.problemasCriticos + resumoExec.problemasAltos);\n const cabecalhoExec = [`${messages.CliProcessamentoDiagnosticoMensagens.cabecalhoExecProblema.padEnd(30)}${messages.CliProcessamentoDiagnosticoMensagens.cabecalhoExecQtd.padStart(6)}`];\n if ('imprimirBloco' in log && typeof log.imprimirBloco === 'function') {\n log.imprimirBloco(tituloExec, [...cabecalhoExec, ...linhasExec]);\n }\n console.log(messages.CliProcessamentoDiagnosticoMensagens.dicaUseFull(totalOcorrencias));\n } else {\n console.log(messages.CliProcessamentoDiagnosticoMensagens.projetoBomEstado(totalOcorrencias));\n if (resumoExec.quickFixes > 0) {\n console.log(messages.CliProcessamentoDiagnosticoMensagens.quickFixesDisponiveis(resumoExec.quickFixes));\n }\n }\n } else {\n // Modo padrão: todos os tipos\n const tiposResumo: Record<string, number> = {};\n for (const ocorrencia of ocorrenciasFiltradas) {\n const tipo = ocorrencia.tipo || 'desconhecido';\n tiposResumo[tipo] = (tiposResumo[tipo] || 0) + 1;\n }\n const linhasResumo = Object.entries(tiposResumo).map(([tipo, qtd]) => `${tipo.padEnd(20)} ${qtd.toString().padStart(8)}`);\n const tituloResumo = messages.CliProcessamentoDiagnosticoMensagens.resumoTiposTitulo;\n const cabecalho = [`${messages.CliProcessamentoDiagnosticoMensagens.cabecalhoResumoTipo.padEnd(20)}${messages.CliProcessamentoDiagnosticoMensagens.cabecalhoResumoQuantidade.padStart(8)}`];\n if ('imprimirBloco' in log && typeof log.imprimirBloco === 'function') {\n log.imprimirBloco(tituloResumo, [...cabecalho, ...linhasResumo]);\n }\n }\n }\n\n // Mensagem final\n // Emitir 'Tudo pronto' apenas uma vez\n if (!config.COMPACT_MODE && !process.env.__TUTANUS_TUDO_PRONTO_EMITIDO) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.tudoPronto);\n process.env['__TUTANUS_TUDO_PRONTO_EMITIDO'] = '1';\n }\n\n // Log de diagnóstico concluído para testes\n if (process.env.VITEST) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.diagnosticoConcluido);\n }\n }\n }\n\n // Relatórios e exportação (executa mesmo quando arquetiposResultado undefined)\n if (!opts.json && !config.SCAN_ONLY) {\n logExt.fase?.('Gerando relatórios');\n try {\n const contextoConselho = {\n hora: new Date().getHours(),\n arquivosParaCorrigir: totalOcorrencias,\n arquivosParaPodar: 0,\n totalOcorrenciasAnaliticas: totalOcorrencias,\n integridadeGuardian: guardianResultado?.status || 'nao-verificado'\n };\n emitirConselhoTutanus(contextoConselho);\n if (config.REPORT_EXPORT_ENABLED) {\n try {\n const dir = typeof config.REPORT_OUTPUT_DIR === 'string' ? config.REPORT_OUTPUT_DIR : path.join(baseDir, 'reports');\n fs.mkdirSync(dir, {\n recursive: true\n });\n\n // Determinar o próximo número sequencial baseado nos arquivos existentes\n const arquivosNoDir = fs.readdirSync(dir);\n const obterProximoId = () => {\n const ids = arquivosNoDir.filter(arquivo => arquivo.endsWith('.json')).map(arquivo => {\n const match = arquivo.match(/-(\\d+)\\.json$/);\n return match ? parseInt(match[1], 10) : 0;\n });\n const maxId = Math.max(0, ...ids);\n return (maxId + 1).toString().padStart(3, '0');\n };\n const id = obterProximoId();\n const salvar = await getSalvarEstado();\n\n // 1. Métricas Separadas\n const metricasOriginais = resultadoExecucao.metricas;\n const analistasAgregados: Record<string, {\n duracaoMs: number;\n ocorrencias: number;\n execucoes: number;\n }> = {};\n for (const arquivo of metricasOriginais?.analistas || []) {\n const nome = arquivo.nome || 'desconhecido';\n if (!analistasAgregados[nome]) {\n analistasAgregados[nome] = {\n duracaoMs: 0,\n ocorrencias: 0,\n execucoes: 0\n };\n }\n analistasAgregados[nome].duracaoMs += arquivo.duracaoMs || 0;\n analistasAgregados[nome].ocorrencias += arquivo.ocorrencias || 0;\n analistasAgregados[nome].execucoes += 1;\n }\n const analistasResumidos = Object.entries(analistasAgregados).map(([nome, dados]) => ({\n nome,\n duracaoTotalMs: Math.round(dados.duracaoMs * 100) / 100,\n ocorrenciasTotal: dados.ocorrencias,\n execucoes: dados.execucoes\n })).sort((arquivo, base) => base.ocorrenciasTotal - arquivo.ocorrenciasTotal);\n const relatorioMetricas = {\n timestamp: new Date().toISOString(),\n metricas: {\n totalArquivos: metricasOriginais?.totalArquivos,\n tempoParsingMs: metricasOriginais?.tempoParsingMs,\n tempoAnaliseMs: metricasOriginais?.tempoAnaliseMs,\n cacheAstHits: metricasOriginais?.cacheAstHits,\n cacheAstMiss: metricasOriginais?.cacheAstMiss,\n analistas: analistasResumidos\n }\n };\n await salvar(path.join(dir, `metricas-${id}.json`), relatorioMetricas);\n\n // 2. Ocorrências (streaming ou separadas por nível)\n const todasOcorrencias = dedupeOcorrencias(resultadoExecucao.ocorrencias || []);\n const ocorrenciasLimpas = todasOcorrencias.map(oc => limparOcorrencia(oc));\n\n const usarStream = config.REPORT_STREAM_ENABLED && ocorrenciasLimpas.length >= config.REPORT_STREAM_AUTO_THRESHOLD;\n\n if (usarStream) {\n // Streaming: grava ocorrências incrementalmente em shards NDJSON\n try {\n const { RelatorioStream } = await import('@reports');\n const stream = new RelatorioStream({\n outputDir: dir,\n prefix: `tutanus-stream-${id}`,\n maxOcorrenciasPerShard: config.REPORT_STREAM_MAX_OCCURRENCES_PER_SHARD,\n maxBytesPerShard: config.REPORT_STREAM_MAX_BYTES_PER_SHARD,\n compress: config.REPORT_STREAM_COMPRESS,\n });\n\n // Alimenta o stream com ocorrências em lotes\n const TAMANHO_LOTE = 500;\n for (let i = 0; i < ocorrenciasLimpas.length; i += TAMANHO_LOTE) {\n const lote = ocorrenciasLimpas.slice(i, i + TAMANHO_LOTE) as unknown as import('@').Ocorrencia[];\n stream.writeBatch(lote);\n }\n\n const { manifest, manifestFile } = await stream.end({\n projectDir: baseDir,\n timestamp: new Date().toISOString(),\n totalArquivos: resultadoExecucao.totalArquivos,\n totalOcorrencias: ocorrenciasLimpas.length,\n });\n\n log.sucesso(`Relatório streaming salvo: ${manifestFile} (${manifest.totalShards} shards, ${manifest.totalOcorrencias} ocorrências)`);\n } catch (streamErr) {\n log.aviso(`Streaming de relatório falhou, usando export padrão: ${(streamErr as Error).message}`);\n // Fallback: export padrão por nível\n await exportarPorNivel(ocorrenciasLimpas, dir, id, salvar);\n }\n } else {\n await exportarPorNivel(ocorrenciasLimpas, dir, id, salvar);\n }\n\n // Gerar sugestões de organização estrutural\n try {\n const { OperarioEstrutura } = await import('@analysts/strategists');\n const { plano: planoOrg, origem: origemOrg } = await OperarioEstrutura.planejar(baseDir, fileEntriesComAst, {\n preferEstrategista: true,\n });\n if (planoOrg && planoOrg.mover && planoOrg.mover.length > 0) {\n const sugestoes = planoOrg.mover.map(m => ({\n tipo: 'organizacao',\n origem: origemOrg,\n arquivo: m.de,\n destinoSugerido: m.para,\n mensagem: `Sugestão: mover ${m.de} para ${m.para}`,\n }));\n await salvar(path.join(dir, `sugestoes-${id}.json`), {\n timestamp: new Date().toISOString(),\n total: sugestoes.length,\n sugestoes,\n });\n }\n } catch (erro) {\n log.debug(`Erro ao gerar sugestões de organização: ${erro instanceof Error ? erro.message : String(erro)}`);\n }\n\n log.sucesso(messages.CliProcessamentoDiagnosticoMensagens.relatoriosExportadosPara(dir));\n } catch (erro) {\n log.erro(messages.CliProcessamentoDiagnosticoMensagens.falhaExportarRelatorios(erro instanceof Error ? erro.message : String(erro)));\n }\n }\n } catch (erro) {\n log.erro(messages.CliProcessamentoDiagnosticoMensagens.falhaExportarRelatorios((erro as Error).message));\n }\n }\n\n // Garantir impressão de resumo e despedida caso ainda não tenham sido exibidos\n if (!opts.json && !config.SCAN_ONLY) {\n try {\n // Se houver ocorrências, exibe resumo de tipos (mesma lógica usada acima)\n if (totalOcorrencias > 0 && resultadoExecucao && ocorrenciasFiltradas) {\n const tiposResumo: Record<string, number> = {};\n for (const ocorrencia of ocorrenciasFiltradas) {\n const tipo = ocorrencia.tipo || 'desconhecido';\n tiposResumo[tipo] = (tiposResumo[tipo] || 0) + 1;\n }\n const linhasResumo = Object.entries(tiposResumo).map(([tipo, qtd]) => `${tipo.padEnd(20)} ${qtd.toString().padStart(8)}`);\n const tituloResumo = messages.CliProcessamentoDiagnosticoMensagens.resumoTiposTitulo;\n const cabecalho = [`${messages.CliProcessamentoDiagnosticoMensagens.cabecalhoResumoTipo.padEnd(20)}${messages.CliProcessamentoDiagnosticoMensagens.cabecalhoResumoQuantidade.padStart(8)}`];\n if ('imprimirBloco' in log && typeof log.imprimirBloco === 'function') {\n log.imprimirBloco(tituloResumo, [...cabecalho, ...linhasResumo]);\n }\n }\n if (!config.COMPACT_MODE && !process.env.__TUTANUS_TUDO_PRONTO_EMITIDO) {\n log.info(messages.CliProcessamentoDiagnosticoMensagens.tudoPronto);\n process.env['__TUTANUS_TUDO_PRONTO_EMITIDO'] = '1';\n }\n } catch { }\n }\n\n // Quando não houve `arquetiposResultado`, ainda precisamos suportar\n // `--json`: emitir o JSON final mesmo sem os dados de arquetipos.\n if (opts.json) {\n // Reproduz o mesmo comportamento de geração de JSON usado acima,\n // mas tolera arquetiposResultado undefined.\n const ocorrenciasOriginais = dedupeOcorrencias(resultadoExecucao.ocorrencias || []);\n const todosPorArquivo = new Map<string, typeof ocorrenciasOriginais>();\n const naoTodos: typeof ocorrenciasOriginais = [];\n for (const ocorrencia of ocorrenciasOriginais) {\n if (ocorrencia.tipo === 'TODO_PENDENTE') {\n const relPath = ocorrencia.relPath || 'desconhecido';\n if (!todosPorArquivo.has(relPath)) todosPorArquivo.set(relPath, []);\n const ocorrenciasArquivo = todosPorArquivo.get(relPath);\n if (ocorrenciasArquivo) ocorrenciasArquivo.push(ocorrencia);\n } else {\n naoTodos.push(ocorrencia);\n }\n }\n\n // Mensagem final apenas quando repositório está limpo\n try {\n if (!opts.json && !config.SCAN_ONLY && totalOcorrencias === 0) {\n logRelatorio.repositorioImpecavel();\n }\n } catch { }\n const todosAgregados: typeof ocorrenciasOriginais = [];\n for (const [, todos] of todosPorArquivo) {\n if (todos.length === 1) todosAgregados.push(todos[0]); else if (todos.length > 1) {\n const primeira = todos[0];\n const mensagemAgregada = messages.CliProcessamentoDiagnosticoMensagens.todosPendentesEncontrados(todos.length);\n todosAgregados.push({\n ...primeira,\n mensagem: mensagemAgregada,\n linha: Math.min(...todos.map(textoTitulo => textoTitulo.linha || 0))\n });\n }\n }\n let todasOcorrencias = [...naoTodos, ...todosAgregados];\n todasOcorrencias = dedupeOcorrencias(todasOcorrencias);\n\n // Em modo --json, queremos reduzir o payload ao essencial.\n // Emitimos apenas ocorrências de nível \"erro\" (inclui PARSE_ERRO).\n const ocorrenciasParaJson = todasOcorrencias.filter(ocorrencia => {\n const nivel = (ocorrencia.nivel || 'info') as string;\n return nivel === 'erro' || ocorrencia.tipo === 'PARSE_ERRO';\n });\n const tiposOcorrencias: Record<string, number> = {};\n const parseErros: ParseErrosJson = {\n totalOriginais: 0,\n totalExibidos: 0,\n agregados: 0\n };\n for (const ocorrencia of ocorrenciasParaJson) {\n const tipo = ocorrencia.tipo || 'desconhecido';\n tiposOcorrencias[tipo] = (tiposOcorrencias[tipo] || 0) + 1;\n if (tipo === 'PARSE_ERRO') {\n parseErros.totalOriginais++;\n parseErros.totalExibidos++;\n }\n }\n const globalThisExt = globalThis as {\n __TUTANUS_PARSE_ERROS__?: unknown[];\n __TUTANUS_PARSE_ERROS_ORIGINAIS__?: number;\n };\n const parseErrosGlobais = globalThisExt.__TUTANUS_PARSE_ERROS__ || [];\n const parseErrosOriginais = globalThisExt.__TUTANUS_PARSE_ERROS_ORIGINAIS__ || 0;\n if (parseErrosGlobais.length > 0 || parseErrosOriginais > 0) {\n parseErros.totalOriginais = Math.max(parseErros.totalOriginais, parseErrosOriginais);\n if (parseErrosGlobais.length > 0) {\n parseErros.totalExibidos = Math.min(parseErros.totalOriginais, parseErrosGlobais.length);\n }\n if (parseErrosOriginais > 0) {\n totalOcorrencias = Math.max(totalOcorrencias, parseErrosOriginais);\n }\n }\n parseErros.agregados = Math.max(0, parseErros.totalOriginais - parseErros.totalExibidos);\n let status = 'ok';\n if (ocorrenciasParaJson.length > 0) {\n status = 'problemas';\n if (parseErros.totalOriginais > 0 && config.PARSE_ERRO_FALHA) status = 'erro';\n }\n const saidaJson: SaidaJsonDiagnostico = {\n status: status as 'ok' | 'problemas' | 'erro',\n totalOcorrencias: ocorrenciasParaJson.length,\n guardian: guardianResultado ? 'verificado' : 'nao-verificado',\n tiposOcorrencias,\n parseErros,\n ocorrencias: ocorrenciasParaJson,\n linguagens: {\n total: 0,\n extensoes: {}\n }\n };\n\n // Quando não há dados de arquetipos, omitimos `estruturaIdentificada` no JSON\n // (o fluxo principal já trata de incluí-lo quando disponível).\n\n const linguagensFinal = computeLinguagens(fileEntriesComAst || fileEntries);\n saidaJson.linguagens = linguagensFinal;\n if (!_jsonEmitted) {\n try {\n // Adicionar metadados de versão do schema e timestamp para compatibilidade\n let pkgVersion = '0.0.0';\n try {\n const pkgRaw = await fs.promises.readFile(path.join(process.cwd(), 'package.json'), 'utf-8');\n const pkgObj = JSON.parse(pkgRaw) as {\n version?: string;\n };\n if (pkgObj && typeof pkgObj.version === 'string') pkgVersion = pkgObj.version;\n } catch { }\n const schemaMeta = {\n schemaVersion: '1.0.0',\n tutanusVersion: pkgVersion,\n timestamp: new Date().toISOString()\n };\n const saidaComMeta = {\n ...schemaMeta,\n ...saidaJson\n };\n const asciiOnly = Boolean(opts && (opts as OpcoesProcessamentoDiagnostico).jsonAscii || false);\n let jsonOutput = stringifyJsonEscaped(saidaComMeta, 2, {\n asciiOnly\n });\n jsonOutput = traduzirRelatorioJson(jsonOutput);\n console.log(jsonOutput);\n\n // Se a exportação estiver habilitada via flags globais/locais, salvamos o JSON em disco\n if (config.REPORT_EXPORT_ENABLED) {\n try {\n const dir = typeof config.REPORT_OUTPUT_DIR === 'string' ? config.REPORT_OUTPUT_DIR : path.join(baseDir, 'reports');\n fs.mkdirSync(dir, {\n recursive: true\n });\n const arquivosNoDir = fs.readdirSync(dir);\n const ids = arquivosNoDir.filter(arquivo => arquivo.endsWith('.json')).map(arquivo => {\n const match = arquivo.match(/-(\\d+)\\.json$/);\n return match ? parseInt(match[1], 10) : 0;\n });\n const maxId = Math.max(0, ...ids);\n const id = (maxId + 1).toString().padStart(3, '0');\n const caminhoArquivo = path.join(dir, `tutanus-diagnostico-${id}.json`);\n fs.writeFileSync(caminhoArquivo, jsonOutput, 'utf-8');\n log.sucesso(messages.CliProcessamentoDiagnosticoMensagens.relatoriosExportadosPara(dir));\n } catch (erro) {\n log.erro(messages.CliProcessamentoDiagnosticoMensagens.falhaSalvarRelatorioJson(erro instanceof Error ? erro.message : String(erro)));\n }\n }\n } catch (erro) {\n console.error(messages.CliProcessamentoDiagnosticoMensagens.errorGeneratingJson, erro);\n console.log(messages.CliProcessamentoDiagnosticoMensagens.fallbackJson, JSON.stringify(saidaJson));\n }\n }\n // Exit codes padronizados: 0=ok/avisos, 1=erros, 2=critico (parse erros fatais)\n if (!process.env.VITEST) {\n const erros = (nivelOcorrencias.get('erro') || 0) as number;\n const exitCode = parseErros.totalOriginais > 0 && config.PARSE_ERRO_FALHA ? 2 : erros > 0 ? 1 : 0;\n process.exit(exitCode);\n }\n }\n } catch (error) {\n // Se o erro for resultado de um process.exit mocked (ex.: Error('exit:1'))\n // devemos repropagar para que os testes possam capturá-lo. Evitamos\n // engolir erros que representam encerramento do processo.\n try {\n if (error && typeof error === 'object' && 'message' in error && typeof (error as {\n message?: unknown;\n }).message === 'string' && String((error as {\n message: string;\n }).message).startsWith('exit:')) {\n throw error;\n }\n } catch (re) {\n throw re;\n }\n // Tratamento de erro geral para o processamento do diagnóstico\n // Normaliza mensagens que podem ser string, Error ou outro objeto\n const errMsg = typeof error === 'string' ? error : error instanceof Error ? error.message : (() => {\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n })();\n log.erro(messages.CliProcessamentoDiagnosticoMensagens.erroFatalDiagnostico(errMsg));\n\n // Em modo de desenvolvimento, mostrar stack trace\n if (config.DEV_MODE) {\n console.error(error);\n }\n\n // Retornar resultado com erro\n return {\n totalOcorrencias: 1,\n temErro: true,\n guardianResultado,\n fileEntriesComAst: [],\n resultadoFinal: {\n ocorrencias: [],\n metricas: {\n totalArquivos: 0,\n tempoTotal: 0,\n analistas: []\n }\n }\n };\n }\n\n // Mensagem final apenas quando repositório está limpo (fallback)\n try {\n if (!opts.json && !config.SCAN_ONLY && totalOcorrencias === 0) {\n logRelatorio.repositorioImpecavel();\n }\n } catch { }\n\n // Fallback para garantir que a função sempre retorna um valor\n return {\n totalOcorrencias: totalOcorrencias || 0,\n temErro: false,\n guardianResultado,\n fileEntriesComAst: [],\n resultadoFinal: {\n ocorrencias: [],\n metricas: {\n totalArquivos: 0,\n tempoTotal: 0,\n analistas: []\n }\n }\n };\n}\n\n// Re-exporta o resultado do processamento interno como resultado do diagnóstico\nexport type { ResultadoProcessamentoDiagnostico } from '@';\n"]}
|