tutanus 0.12.2 → 0.12.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- 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/bin/index.d.ts.map +1 -1
- package/dist/bin/index.js +5 -0
- package/dist/bin/index.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.d.ts.map +1 -1
- package/dist/cli/diagnostic/processing-diagnostic.js +2 -3
- 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 +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scorer.js","sourceRoot":"","sources":["../../../src/analysts/scorers/scorer.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { grafoDependencias } from '@analysts/detectors';\nimport { ARQUETIPOS, normalizarCaminho } from '@analysts/strategists';\n\nimport type { ArquetipoDeteccaoAnomalia, ArquetipoEstruturaDef, ResultadoDeteccaoArquetipo, SinaisProjetoAvancados } from '@';\n\nconst PENALIDADE_MISSING_REQUIRED = 20;\nconst PESO_OPTIONAL = 5;\nconst PESO_REQUIRED = 10;\nconst PESO_DEPENDENCIA = 10;\nconst PESO_PADRAO = 5;\nconst PENALIDADE_FORBIDDEN = 20;\nexport function scoreArquetipo(def: ArquetipoEstruturaDef, arquivos: string[]): ResultadoDeteccaoArquetipo {\n const norm = arquivos.map(arquivo => String(normalizarCaminho(arquivo)));\n const required = def.requiredDirs || [];\n const matchedRequired = required.filter((diretorio: string) => norm.some(arquivo => arquivo.startsWith(`${diretorio}/`) || arquivo === diretorio));\n const missingRequired = required.filter((diretorio: string) => !matchedRequired.includes(diretorio));\n const optional = def.optionalDirs || [];\n const matchedOptional = optional.filter((diretorio: string) => norm.some(arquivo => arquivo.startsWith(`${diretorio}/`) || arquivo === diretorio));\n // Verifica dependências sugeridas no grafo global (qualquer arquivo pode importar)\n // Otimização: materializa um Set único de todas as dependências para lookup O(1)\n const allDependencies = new Set<string>();\n for (const set of grafoDependencias.values()) {\n for (const dep of set) {\n allDependencies.add(dep);\n }\n }\n function hasDependencyGlobal(dep: string): boolean {\n return allDependencies.has(dep);\n }\n const dependencyMatches = (def.dependencyHints || []).filter((dep: string) => hasDependencyGlobal(dep));\n const filePadraoMatches = (def.filePresencePatterns || []).filter((pat: string) => norm.some(arquivo => arquivo.includes(pat)));\n const forbiddenPresent = (def.forbiddenDirs || []).filter((diretorio: string) => norm.some(arquivo => arquivo.startsWith(`${diretorio}/`) || arquivo === diretorio));\n let score = (def.pesoBase || 1) * 10;\n score += matchedRequired.length * PESO_REQUIRED;\n score -= missingRequired.length * PENALIDADE_MISSING_REQUIRED;\n score += matchedOptional.length * PESO_OPTIONAL;\n score += dependencyMatches.length * PESO_DEPENDENCIA;\n score += filePadraoMatches.length * PESO_PADRAO;\n score -= forbiddenPresent.length * PENALIDADE_FORBIDDEN;\n let explicacaoSimilaridade = '';\n let candidatoExtra: string | undefined;\n if (def.nome === 'fullstack') {\n const temPages = matchedRequired.includes('pages');\n const temApi = matchedRequired.includes('api');\n const temPrisma = matchedRequired.includes('prisma');\n const temControllers = norm.some(arquivo => arquivo.includes('src/controllers'));\n const temExpress = grafoDependencias.has('express');\n const isHibridoCompleto = temPages && temApi && temPrisma && temControllers && temExpress;\n if (isHibridoCompleto) {\n score += 40;\n explicacaoSimilaridade = 'Estrutura híbrida: fullstack + api-rest-express. Projeto combina frontend (pages/api/prisma) e backend Express/controllers.';\n candidatoExtra = 'api-rest-express';\n explicacaoSimilaridade += '\\nOutros candidatos potenciais detectados: fullstack, api-rest-express.';\n } else if (temPages && temApi && temPrisma) {\n score += 20;\n explicacaoSimilaridade = 'Estrutura segue o padrão fullstack (pages/api/prisma).';\n explicacaoSimilaridade += '\\nOutros candidatos potenciais detectados: fullstack, api-rest-express.';\n }\n }\n if (def.nome === 'api-rest-express' && grafoDependencias.has('express')) {\n if (norm.some(arquivo => arquivo.includes('pages')) && norm.some(arquivo => arquivo.includes('prisma')) && norm.some(arquivo => arquivo.includes('api'))) {\n score += 40;\n if (score > 100) score = 100;\n explicacaoSimilaridade = 'Estrutura híbrida: api-rest-express + fullstack. Projeto combina backend Express/controllers e frontend (pages/prisma/api).';\n explicacaoSimilaridade += '\\nOutros candidatos potenciais detectados: fullstack, api-rest-express.';\n } else if (norm.some(arquivo => arquivo.includes('pages')) && norm.some(arquivo => arquivo.includes('prisma'))) {\n score += 40;\n if (score > 100) score = 100;\n explicacaoSimilaridade = 'Estrutura híbrida: api-rest-express + fullstack. Projeto combina backend Express/controllers e frontend (pages/prisma).';\n explicacaoSimilaridade += '\\nOutros candidatos potenciais detectados: fullstack, api-rest-express.';\n }\n }\n if (def.nome === 'api-rest-express') {\n const temControllers = matchedRequired.includes('src/controllers');\n const temExpress = dependencyMatches.includes('express');\n if (temControllers && temExpress) {\n score += 50;\n } else if (temControllers) {\n score += 25;\n } else if (temExpress) {\n score += 15;\n }\n if (norm.some(arquivo => /api|rest/i.test(arquivo))) {\n score += 10;\n }\n if (score >= 100) {\n explicacaoSimilaridade = 'Estrutura segue o padrão oficial api-rest-express.';\n } else if (score >= 70) {\n // Para simplificar a validação em testes, adotamos uma formulação curta próxima do \"padrão oficial\"\n explicacaoSimilaridade = 'Estrutura segue o padrão api-rest-express com pequenas diferenças.';\n } else if (score >= 40) {\n explicacaoSimilaridade = 'Estrutura parcialmente compatível com o padrão api-rest-express. Recomenda-se padronizar src/controllers, dependência express e rotas api/rest.';\n } else {\n explicacaoSimilaridade = 'Estrutura personalizada, mas o padrão mais próximo é api-rest-express. Recomenda-se seguir boas práticas para facilitar manutenção.';\n }\n }\n\n // Explicação genérica quando há penalidades/ausências e ainda não foi preenchida\n if (!explicacaoSimilaridade) {\n const partes: string[] = [];\n if (missingRequired.length > 0) {\n partes.push(`Diretórios obrigatórios ausentes/faltantes: ${missingRequired.join(', ')}.`);\n }\n if (forbiddenPresent.length > 0) {\n partes.push(`Diretórios não permitidos/proibidos presentes: ${forbiddenPresent.join(', ')}.`);\n }\n if (partes.length > 0) {\n explicacaoSimilaridade = `${partes.join(' ')} Estrutura parcialmente compatível, personalizada ou com diferenças.`;\n }\n }\n\n // Importante: manter score negativo quando penalidades superam acertos,\n // pois alguns testes validam score <= 0 para cenários de penalização.\n const maxPossible = (def.pesoBase || 1) * 10 + (def.requiredDirs?.length || 0) * PESO_REQUIRED + (def.optionalDirs?.length || 0) * PESO_OPTIONAL + (def.dependencyHints?.length || 0) * PESO_DEPENDENCIA + (def.filePresencePatterns?.length || 0) * PESO_PADRAO + 30;\n const confidence = maxPossible > 0 ? Math.min(100, Math.round(score / maxPossible * 100)) : 0;\n const raizArquivos = norm.filter(caminho => typeof caminho === 'string' && !caminho.includes('/'));\n const allowed = new Set([...(def.rootFilesAllowed || [])]);\n const anomalias: ArquetipoDeteccaoAnomalia[] = [];\n for (const rf of raizArquivos) {\n if (typeof rf === 'string' && rf.trim() !== '' && !allowed.has(rf)) {\n anomalias.push({\n path: rf,\n motivo: 'Arquivo na raiz não permitido para este arquétipo'\n });\n }\n }\n let sugestaoPadronizacao = '';\n if (def.nome === 'api-rest-express') {\n if (!matchedRequired.includes('src/controllers')) {\n sugestaoPadronizacao += 'Sugestão: adicione o diretório src/controllers para seguir o padrão api-rest-express.\\n';\n }\n if (!dependencyMatches.includes('express')) {\n sugestaoPadronizacao += 'Sugestão: adicione express nas dependências para seguir o padrão api-rest-express.\\n';\n }\n if (!norm.some(arquivo => /api|rest/i.test(arquivo))) {\n sugestaoPadronizacao += 'Sugestão: utilize nomes de arquivos e rotas que incluam \"api\" ou \"rest\" para reforçar o padrão.\\n';\n }\n }\n return {\n nome: def.nome,\n score,\n confidence,\n matchedRequired,\n missingRequired,\n matchedOptional,\n dependencyMatches,\n filePadraoMatches,\n forbiddenPresent,\n anomalias,\n sugestaoPadronizacao,\n explicacaoSimilaridade,\n descricao: def.descricao || '',\n candidatoExtra\n };\n}\nexport function pontuarTodos(arquivos: string[]): ResultadoDeteccaoArquetipo[] {\n const resultados: ResultadoDeteccaoArquetipo[] = [];\n for (const def of ARQUETIPOS) {\n const resultado = scoreArquetipo(def, arquivos);\n resultados.push(resultado);\n if (resultado.candidatoExtra) {\n const extra = ARQUETIPOS?.find((arquivo: ArquetipoEstruturaDef) => arquivo.nome === resultado.candidatoExtra);\n if (extra) {\n const extraResultado = scoreArquetipo(extra, arquivos);\n if (!resultados.some(x => x.nome === extraResultado.nome)) resultados.push(extraResultado);\n }\n }\n }\n // Filtro: manter apenas candidatos que apresentem algum sinal (match/forbidden/pattern/dep)\n return resultados.filter(resultado => (resultado.matchedRequired?.length || 0) > 0 || (resultado.matchedOptional?.length || 0) > 0 || (resultado.dependencyMatches?.length || 0) > 0 || (resultado.filePadraoMatches?.length || 0) > 0 || (resultado.forbiddenPresent?.length || 0) > 0);\n}\n\n// Versão avançada do scoreArquetipo com análise de sinais do projeto\n\nexport function scoreArquetipoAvancado(def: ArquetipoEstruturaDef, arquivos: string[], sinaisAvancados?: SinaisProjetoAvancados): ResultadoDeteccaoArquetipo {\n // Usa a implementação base\n const resultadoBase = scoreArquetipo(def, arquivos);\n\n // Se não há sinais avançados, retorna resultado base\n if (!sinaisAvancados) {\n return resultadoBase;\n }\n\n // Clona o resultado base para adicionar análises avançadas\n let score = resultadoBase.score;\n let explicacao = resultadoBase.explicacaoSimilaridade || '';\n const frameworks = sinaisAvancados.frameworksDetectados || [];\n const deps = sinaisAvancados.dependencias || [];\n const scripts = sinaisAvancados.scripts || [];\n const detalhes = sinaisAvancados.detalhes || {};\n\n // BONUS INTELIGENTE: Considerar sinais avançados para pontuação contextual\n score += calcularBonusContextual(def, sinaisAvancados);\n\n // Análise específica por arquétipo\n switch (def.nome) {\n case 'next-js':\n if (frameworks.includes('Next.js') || deps.includes('next')) {\n score += 30;\n explicacao += '\\n✓ Framework Next.js detectado via dependências e análise de código.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('pages') || sinaisAvancados.pastasPadrao?.includes('app')) {\n score += 20;\n explicacao += '\\n✓ Estrutura de roteamento Next.js (pages ou app dir) confirmada.';\n }\n // Bônus por tecnologias detectadas\n if (sinaisAvancados.tecnologiasDominantes.includes('frontend-framework')) {\n score += 15;\n }\n break;\n case 'fullstack':\n // Detecção específica para Next.js fullstack\n if (frameworks.includes('Next.js') || deps.includes('next')) {\n score += 35;\n explicacao += '\\n✓ Framework Next.js detectado - aplicação fullstack moderna.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('api')) {\n score += 25;\n explicacao += '\\n✓ API routes Next.js detectadas - backend integrado.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('pages')) {\n score += 20;\n explicacao += '\\n✓ Páginas Next.js (Pages Router) detectadas.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('app')) {\n score += 25;\n explicacao += '\\n✓ App Router Next.js detectado - arquitetura moderna.';\n }\n if (deps.includes('prisma') || deps.includes('@prisma/client')) {\n score += 20;\n explicacao += '\\n✓ Prisma ORM detectado - banco de dados integrado.';\n }\n if (sinaisAvancados.tecnologiasDominantes.includes('frontend-framework')) {\n score += 15;\n explicacao += '\\n✓ Tecnologias frontend modernas detectadas.';\n }\n if (sinaisAvancados.tecnologiasDominantes.includes('backend-api')) {\n score += 15;\n explicacao += '\\n✓ APIs backend detectadas no fullstack.';\n }\n break;\n case 'vite':\n if (frameworks.includes('Vite') || deps.includes('vite')) {\n score += 30;\n explicacao += '\\n✓ Build tool Vite detectado.';\n }\n if (sinaisAvancados.arquivosConfiguracao?.some(arquivo => arquivo.includes('vite.config'))) {\n score += 15;\n explicacao += '\\n✓ Arquivo de configuração Vite presente.';\n }\n break;\n case 'api-rest-express':\n if (frameworks.includes('Express') || deps.includes('express')) {\n score += 25;\n explicacao += '\\n✓ Framework Express detectado.';\n }\n if (frameworks.includes('Fastify') || deps.includes('fastify')) {\n score += 25;\n explicacao += '\\n✓ Framework Fastify detectado - alta performance.';\n }\n if (frameworks.includes('NestJS') || deps.includes('@nestjs/core')) {\n score += 30;\n explicacao += '\\n✓ Framework NestJS detectado - arquitetura enterprise.';\n }\n if (frameworks.includes('Koa') || deps.includes('koa')) {\n score += 20;\n explicacao += '\\n✓ Framework Koa detectado.';\n }\n if (frameworks.includes('Hapi') || deps.includes('@hapi/hapi')) {\n score += 20;\n explicacao += '\\n✓ Framework Hapi detectado.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('routes') || sinaisAvancados.pastasPadrao?.includes('api') || sinaisAvancados.pastasPadrao?.includes('controllers')) {\n score += 15;\n explicacao += '\\n✓ Estrutura de rotas/controllers API detectada.';\n }\n if (deps.includes('cors') || deps.includes('helmet') || deps.includes('@fastify/cors')) {\n score += 10;\n explicacao += '\\n✓ Middleware de segurança/CORS presente.';\n }\n if (deps.includes('joi') || deps.includes('@hapi/joi')) {\n score += 10;\n explicacao += '\\n✓ Validação de dados detectada.';\n }\n if (deps.includes('prisma') || deps.includes('mongoose') || deps.includes('typeorm')) {\n score += 15;\n explicacao += '\\n✓ ORM/Database layer detectado.';\n }\n // Bônus por padrões arquiteturais\n if (sinaisAvancados.padroesArquiteturais.includes('repository-service')) {\n score += 10;\n explicacao += '\\n✓ Padrão Repository/Service compatível com APIs REST.';\n }\n if (sinaisAvancados.tecnologiasDominantes.includes('backend-api')) {\n score += 20;\n explicacao += '\\n✓ Foco em desenvolvimento backend/API confirmado.';\n }\n break;\n case 'vue-spa':\n // Detecção específica para Vue.js SPA\n if (frameworks.includes('Vue') || deps.includes('vue')) {\n score += 30;\n explicacao += '\\n✓ Framework Vue.js detectado - SPA moderna.';\n }\n if (deps.includes('vue-router')) {\n score += 20;\n explicacao += '\\n✓ Vue Router detectado - roteamento SPA.';\n }\n if (deps.includes('vuex') || deps.includes('pinia')) {\n score += 20;\n explicacao += '\\n✓ State management detectado (Vuex/Pinia).';\n }\n if (deps.includes('@vue/cli-service') || deps.includes('vite')) {\n score += 15;\n explicacao += '\\n✓ Build tool Vue detectado (CLI/Vite).';\n }\n if (sinaisAvancados.pastasPadrao?.includes('src/components')) {\n score += 15;\n explicacao += '\\n✓ Estrutura de componentes Vue detectada.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('src/composables')) {\n score += 15;\n explicacao += '\\n✓ Composables Vue 3 detectados - arquitetura moderna.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('src/views')) {\n score += 10;\n explicacao += '\\n✓ Estrutura de views/pages detectada.';\n }\n if (deps.includes('nuxt') || deps.includes('nuxt3')) {\n score += 25;\n explicacao += '\\n✓ Nuxt.js detectado - SSR/SSG framework.';\n }\n if (sinaisAvancados.tecnologiasDominantes.includes('frontend-framework')) {\n score += 15;\n explicacao += '\\n✓ Foco em desenvolvimento frontend confirmado.';\n }\n break;\n case 'react-app':\n if (frameworks.includes('React') || deps.includes('react')) {\n score += 30;\n explicacao += '\\n✓ Framework React detectado.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('components') || sinaisAvancados.pastasPadrao?.includes('src')) {\n score += 15;\n explicacao += '\\n✓ Estrutura React típica com components detectada.';\n }\n // Bônus por tecnologias detectadas\n if (sinaisAvancados.tecnologiasDominantes.includes('frontend-framework')) {\n score += 15;\n }\n break;\n case 'vue-app':\n if (frameworks.includes('Vue') || deps.includes('vue')) {\n score += 30;\n explicacao += '\\n✓ Framework Vue detectado.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('components') || sinaisAvancados.arquivosPadrao?.some(arquivo => arquivo.endsWith('.vue'))) {\n score += 15;\n explicacao += '\\n✓ Estrutura Vue com components detectada.';\n }\n break;\n case 'typescript-lib':\n if (sinaisAvancados.tipos?.length > 0) {\n score += 20;\n explicacao += `\\n✓ Tipos TypeScript detectados (${sinaisAvancados.tipos.length} tipos).`;\n }\n if (deps.includes('typescript') || sinaisAvancados.arquivosConfiguracao?.some(arquivo => arquivo.includes('tsconfig'))) {\n score += 15;\n explicacao += '\\n✓ Configuração TypeScript presente.';\n }\n if (scripts.includes('build') || scripts.includes('compile')) {\n score += 10;\n explicacao += '\\n✓ Scripts de build detectados.';\n }\n // Bônus por TypeScript avançado\n if (sinaisAvancados.tecnologiasDominantes.includes('typescript-advanced')) {\n score += 20;\n explicacao += '\\n✓ Uso avançado de TypeScript detectado.';\n }\n break;\n case 'monorepo':\n if (sinaisAvancados.arquivosConfiguracao?.some(arquivo => arquivo.includes('lerna.json') || arquivo.includes('pnpm-workspace'))) {\n score += 25;\n explicacao += '\\n✓ Configuração de monorepo detectada (Lerna ou pnpm).';\n }\n if (sinaisAvancados.pastasPadrao?.includes('packages') || sinaisAvancados.pastasPadrao?.includes('apps')) {\n score += 20;\n explicacao += '\\n✓ Estrutura de workspaces/packages detectada.';\n }\n // Bônus por complexidade alta\n if (sinaisAvancados.complexidadeEstrutura === 'alta') {\n score += 20;\n explicacao += '\\n✓ Complexidade estrutural alta compatível com monorepo.';\n }\n break;\n case 'cli':\n if (sinaisAvancados.pastasPadrao?.includes('bin') || sinaisAvancados.pastasPadrao?.includes('cli')) {\n score += 20;\n explicacao += '\\n✓ Estrutura de CLI detectada (bin ou cli).';\n }\n if (deps.includes('commander') || deps.includes('yargs') || deps.includes('inquirer')) {\n score += 15;\n explicacao += '\\n✓ Biblioteca de CLI detectada (commander/yargs/inquirer).';\n }\n // Bônus por padrões CLI\n if (sinaisAvancados.padroesArquiteturais.includes('cli-patterns')) {\n score += 25;\n explicacao += '\\n✓ Padrões específicos de CLI detectados.';\n }\n // Penalizar se tem estrutura web\n if (sinaisAvancados.tecnologiasDominantes.includes('frontend-framework')) {\n score -= 30;\n explicacao += '\\n✗ Estrutura web detectada, incompatível com CLI.';\n }\n break;\n case 'clean-arch':\n // Clean Architecture scoring\n if (sinaisAvancados.camadasCleanArch?.domain) {\n score += 30;\n explicacao += '\\n✓ Camada de domínio detectada (entities, value-objects).';\n }\n if (sinaisAvancados.camadasCleanArch?.application) {\n score += 25;\n explicacao += '\\n✓ Camada de aplicação detectada (use-cases, ports).';\n }\n if (sinaisAvancados.camadasCleanArch?.infrastructure) {\n score += 20;\n explicacao += '\\n✓ Camada de infraestrutura detectada.';\n }\n if (sinaisAvancados.camadasCleanArch?.presentation) {\n score += 15;\n explicacao += '\\n✓ Camada de apresentação detectada.';\n }\n if (sinaisAvancados.padroesCleanArch?.includes('use-case')) {\n score += 20;\n explicacao += '\\n✓ Padrão Use Case detectado.';\n }\n // Bônus por tecnologias compatíveis\n if (sinaisAvancados.dependencias.some(d => d.includes('tsyringe') || d.includes('inversify') || d.includes('awilix'))) {\n score += 15;\n explicacao += '\\n✓ DI Container compatível com Clean Architecture.';\n }\n if (sinaisAvancados.dependencias.some(d => d.includes('zod') || d.includes('class-validator') || d.includes('joi'))) {\n score += 10;\n explicacao += '\\n✓ Validação de dados compatível com DTOs.';\n }\n // Penalidade se tem estrutura incompatível\n if (sinaisAvancados.pastasPadrao?.some(p => p.includes('pages') || p.includes('components'))) {\n score -= 15;\n explicacao += '\\n✗ Estrutura de frontend (pages/components) presente em projeto Clean Architecture.';\n }\n break;\n case 'microservices':\n if (sinaisAvancados.boundariesServicos && sinaisAvancados.boundariesServicos.length > 0) {\n score += 30;\n explicacao += `\\n✓ ${sinaisAvancados.boundariesServicos.length} boundaries de serviço detectados: ${sinaisAvancados.boundariesServicos.join(', ')}.`;\n }\n if (sinaisAvancados.padroesDistribuidos?.includes('api-gateway')) {\n score += 20;\n explicacao += '\\n✓ API Gateway detectado.';\n }\n if (sinaisAvancados.padroesDistribuidos?.includes('event-driven') || (sinaisAvancados.mensageriaDetectada && sinaisAvancados.mensageriaDetectada.length > 0)) {\n score += 25;\n explicacao += '\\n✓ Sistema de mensageria/eventos detectado.';\n }\n if (sinaisAvancados.padroesDistribuidos?.includes('containerized')) {\n score += 20;\n explicacao += '\\n✓ Conteinerização (Docker) detectada.';\n }\n if (sinaisAvancados.padroesDistribuidos?.includes('orchestrated')) {\n score += 15;\n explicacao += '\\n✓ Orquestração (Kubernetes) detectada.';\n }\n if (sinaisAvancados.padroesDistribuidos?.includes('service-discovery')) {\n score += 15;\n explicacao += '\\n✓ Service Discovery detectado.';\n }\n if (sinaisAvancados.padroesDistribuidos?.includes('monitoring')) {\n score += 10;\n explicacao += '\\n✓ Monitoramento/Health checks detectados.';\n }\n if (sinaisAvancados.padroesDistribuidos?.includes('shared-library')) {\n score += 10;\n explicacao += '\\n✓ Biblioteca compartilhada entre serviços detectada.';\n }\n // Penalidades\n if (sinaisAvancados.pastasPadrao?.some(p => p.includes('pages') || p.includes('components'))) {\n score -= 20;\n explicacao += '\\n✗ Estrutura frontend não esperada em arquitetura de microsserviços.';\n }\n if (sinaisAvancados.complexidadeEstrutura === 'baixa' && (!sinaisAvancados.boundariesServicos || sinaisAvancados.boundariesServicos.length < 2)) {\n score -= 15;\n explicacao += '\\n✗ Projeto muito pequeno para arquitetura de microsserviços.';\n }\n break;\n }\n\n // Análises genéricas aplicáveis a todos os arquétipos\n if (detalhes.testRunner) {\n score += 5;\n explicacao += `\\n✓ Test runner detectado: ${detalhes.testRunner}.`;\n }\n if (detalhes.linter) {\n score += 3;\n explicacao += `\\n✓ Linter configurado: ${detalhes.linter}.`;\n }\n if (detalhes.bundler && !['vite', 'webpack', 'rollup'].includes(def.nome)) {\n score += 5;\n explicacao += `\\n✓ Bundler detectado: ${detalhes.bundler}.`;\n }\n\n // Detectar complexidade do projeto baseado nos sinais\n const complexidade = (sinaisAvancados.funcoes || 0) + (sinaisAvancados.classes || 0) + (sinaisAvancados.variaveis || 0);\n if (complexidade > 100) {\n explicacao += `\\n[GRAFICO] Projeto de complexidade alta (${complexidade} elementos).`;\n } else if (complexidade > 50) {\n explicacao += `\\n[GRAFICO] Projeto de complexidade média (${complexidade} elementos).`;\n }\n\n // Recalcular confidence baseado no novo score\n const maxPossible = (def.pesoBase || 1) * 10 + (def.requiredDirs?.length || 0) * PESO_REQUIRED + (def.optionalDirs?.length || 0) * PESO_OPTIONAL + (def.dependencyHints?.length || 0) * PESO_DEPENDENCIA + (def.filePresencePatterns?.length || 0) * PESO_PADRAO + 100; // Adiciona margem para análise avançada\n\n const confidence = maxPossible > 0 ? Math.min(100, Math.round(score / maxPossible * 100)) : 0;\n return {\n ...resultadoBase,\n score,\n confidence,\n explicacaoSimilaridade: explicacao.trim()\n };\n}\nfunction calcularBonusContextual(def: ArquetipoEstruturaDef, sinais: SinaisProjetoAvancados): number {\n let bonus = 0;\n\n // Bônus baseado na complexidade da estrutura\n if (def.nome === 'monorepo' && sinais.complexidadeEstrutura === 'alta') {\n bonus += 20;\n }\n\n // Penalizar estruturas simples para arquetipos complexos\n if ((def.nome === 'fullstack' || def.nome === 'monorepo') && sinais.complexidadeEstrutura === 'baixa') {\n bonus -= 15;\n }\n\n // Bônus por alinhamento de padrões arquiteturais\n if (def.nome === 'api-rest-express' && sinais.padroesArquiteturais.includes('repository-service')) {\n bonus += 15;\n }\n if (def.nome === 'cli' && sinais.padroesArquiteturais.includes('cli-patterns')) {\n bonus += 20;\n }\n\n // Bônus Clean Architecture\n if (def.nome === 'clean-arch') {\n if (sinais.camadasCleanArch?.domain) bonus += 25;\n if (sinais.camadasCleanArch?.application) bonus += 20;\n if (sinais.camadasCleanArch?.infrastructure) bonus += 15;\n if (sinais.camadasCleanArch?.presentation) bonus += 10;\n if (sinais.padroesCleanArch?.length) bonus += 10;\n }\n\n // Bônus Microservices\n if (def.nome === 'microservices') {\n if (sinais.boundariesServicos && sinais.boundariesServicos.length > 1) bonus += 25;\n if (sinais.padroesDistribuidos?.includes('event-driven')) bonus += 20;\n if (sinais.padroesDistribuidos?.includes('api-gateway')) bonus += 15;\n if (sinais.padroesDistribuidos?.includes('containerized')) bonus += 15;\n if (sinais.mensageriaDetectada && sinais.mensageriaDetectada.length > 0) bonus += 20;\n }\n\n // Penalizar incompatibilidades tecnológicas\n if (def.nome === 'cli' && sinais.tecnologiasDominantes.includes('frontend-framework')) {\n bonus -= 25;\n }\n if (def.nome === 'typescript-lib' && sinais.tecnologiasDominantes.includes('frontend-framework')) {\n bonus -= 20;\n }\n if (def.nome === 'clean-arch' && sinais.tecnologiasDominantes.includes('frontend-framework') && !sinais.camadasCleanArch?.domain) {\n bonus -= 15;\n }\n if (def.nome === 'microservices' && sinais.complexidadeEstrutura === 'baixa') {\n bonus -= 20;\n }\n return bonus;\n}\nexport function pontuarTodosAvancado(arquivos: string[], sinaisAvancados?: SinaisProjetoAvancados): ResultadoDeteccaoArquetipo[] {\n const resultados: ResultadoDeteccaoArquetipo[] = [];\n for (const def of ARQUETIPOS) {\n const resultado = scoreArquetipoAvancado(def, arquivos, sinaisAvancados);\n resultados.push(resultado);\n if (resultado.candidatoExtra) {\n const extra = ARQUETIPOS?.find((arquivo: ArquetipoEstruturaDef) => arquivo.nome === resultado.candidatoExtra);\n if (extra) {\n const extraResultado = scoreArquetipoAvancado(extra, arquivos, sinaisAvancados);\n if (!resultados.some(x => x.nome === extraResultado.nome)) resultados.push(extraResultado);\n }\n }\n }\n // Filtro: manter apenas candidatos que apresentem algum sinal (match/forbidden/pattern/dep)\n return resultados.filter(resultado => (resultado.matchedRequired?.length || 0) > 0 || (resultado.matchedOptional?.length || 0) > 0 || (resultado.dependencyMatches?.length || 0) > 0 || (resultado.filePadraoMatches?.length || 0) > 0 || (resultado.forbiddenPresent?.length || 0) > 0);\n}"]}
|
|
1
|
+
{"version":3,"file":"scorer.js","sourceRoot":"","sources":["../../../src/analysts/scorers/scorer.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { grafoDependencias } from '@analysts/detectors';\nimport { ARQUETIPOS, normalizarCaminho } from '@analysts/strategists';\n\nimport type { ArquetipoDeteccaoAnomalia, ArquetipoEstruturaDef, ResultadoDeteccaoArquetipo, SinaisProjetoAvancados } from '@';\n\nconst PENALIDADE_MISSING_REQUIRED = 20;\nconst PESO_OPTIONAL = 5;\nconst PESO_REQUIRED = 10;\nconst PESO_DEPENDENCIA = 10;\nconst PESO_PADRAO = 5;\nconst PENALIDADE_FORBIDDEN = 20;\nexport function scoreArquetipo(def: ArquetipoEstruturaDef, arquivos: string[]): ResultadoDeteccaoArquetipo {\n const norm = arquivos.map(arquivo => String(normalizarCaminho(arquivo)));\n const required = def.requiredDirs || [];\n const matchedRequired = required.filter((diretorio: string) => norm.some(arquivo => arquivo.startsWith(`${diretorio}/`) || arquivo === diretorio));\n const missingRequired = required.filter((diretorio: string) => !matchedRequired.includes(diretorio));\n const optional = def.optionalDirs || [];\n const matchedOptional = optional.filter((diretorio: string) => norm.some(arquivo => arquivo.startsWith(`${diretorio}/`) || arquivo === diretorio));\n // Verifica dependências sugeridas no grafo global (qualquer arquivo pode importar)\n // Otimização: materializa um Set único de todas as dependências para lookup O(1)\n const allDependencies = new Set<string>();\n for (const set of grafoDependencias.values()) {\n for (const dep of set) {\n allDependencies.add(dep);\n }\n }\n function hasDependencyGlobal(dep: string): boolean {\n return allDependencies.has(dep);\n }\n const dependencyMatches = (def.dependencyHints || []).filter((dep: string) => hasDependencyGlobal(dep));\n const filePadraoMatches = (def.filePresencePatterns || []).filter((pat: string) => norm.some(arquivo => arquivo.includes(pat)));\n const forbiddenPresent = (def.forbiddenDirs || []).filter((diretorio: string) => norm.some(arquivo => arquivo.startsWith(`${diretorio}/`) || arquivo === diretorio));\n let score = (def.pesoBase || 1) * 10;\n score += matchedRequired.length * PESO_REQUIRED;\n score -= missingRequired.length * PENALIDADE_MISSING_REQUIRED;\n score += matchedOptional.length * PESO_OPTIONAL;\n score += dependencyMatches.length * PESO_DEPENDENCIA;\n score += filePadraoMatches.length * PESO_PADRAO;\n score -= forbiddenPresent.length * PENALIDADE_FORBIDDEN;\n let explicacaoSimilaridade = '';\n let candidatoExtra: string | undefined;\n if (def.nome === 'fullstack') {\n const temPages = matchedRequired.includes('pages');\n const temApi = matchedRequired.includes('api');\n const temPrisma = matchedRequired.includes('prisma');\n const temControllers = norm.some(arquivo => arquivo.includes('src/controllers'));\n const temExpress = grafoDependencias.has('express');\n const isHibridoCompleto = temPages && temApi && temPrisma && temControllers && temExpress;\n if (isHibridoCompleto) {\n score += 40;\n explicacaoSimilaridade = 'Estrutura híbrida: fullstack + api-rest-express. Projeto combina frontend (pages/api/prisma) e backend Express/controllers.';\n candidatoExtra = 'api-rest-express';\n explicacaoSimilaridade += '\\nOutros candidatos potenciais detectados: fullstack, api-rest-express.';\n } else if (temPages && temApi && temPrisma) {\n score += 20;\n explicacaoSimilaridade = 'Estrutura segue o padrão fullstack (pages/api/prisma).';\n explicacaoSimilaridade += '\\nOutros candidatos potenciais detectados: fullstack, api-rest-express.';\n }\n }\n if (def.nome === 'api-rest-express' && grafoDependencias.has('express')) {\n if (norm.some(arquivo => arquivo.includes('pages')) && norm.some(arquivo => arquivo.includes('prisma')) && norm.some(arquivo => arquivo.includes('api'))) {\n score += 40;\n if (score > 100) score = 100;\n explicacaoSimilaridade = 'Estrutura híbrida: api-rest-express + fullstack. Projeto combina backend Express/controllers e frontend (pages/prisma/api).';\n explicacaoSimilaridade += '\\nOutros candidatos potenciais detectados: fullstack, api-rest-express.';\n } else if (norm.some(arquivo => arquivo.includes('pages')) && norm.some(arquivo => arquivo.includes('prisma'))) {\n score += 40;\n if (score > 100) score = 100;\n explicacaoSimilaridade = 'Estrutura híbrida: api-rest-express + fullstack. Projeto combina backend Express/controllers e frontend (pages/prisma).';\n explicacaoSimilaridade += '\\nOutros candidatos potenciais detectados: fullstack, api-rest-express.';\n }\n }\n if (def.nome === 'api-rest-express') {\n const temControllers = matchedRequired.includes('src/controllers');\n const temExpress = dependencyMatches.includes('express');\n if (temControllers && temExpress) {\n score += 50;\n } else if (temControllers) {\n score += 25;\n } else if (temExpress) {\n score += 15;\n }\n if (norm.some(arquivo => /api|rest/i.test(arquivo))) {\n score += 10;\n }\n if (score >= 100) {\n explicacaoSimilaridade = 'Estrutura segue o padrão oficial api-rest-express.';\n } else if (score >= 70) {\n // Para simplificar a validação em testes, adotamos uma formulação curta próxima do \"padrão oficial\"\n explicacaoSimilaridade = 'Estrutura segue o padrão api-rest-express com pequenas diferenças.';\n } else if (score >= 40) {\n explicacaoSimilaridade = 'Estrutura parcialmente compatível com o padrão api-rest-express. Recomenda-se padronizar src/controllers, dependência express e rotas api/rest.';\n } else {\n explicacaoSimilaridade = 'Estrutura personalizada, mas o padrão mais próximo é api-rest-express. Recomenda-se seguir boas práticas para facilitar manutenção.';\n }\n }\n\n // Explicação genérica quando há penalidades/ausências e ainda não foi preenchida\n if (!explicacaoSimilaridade) {\n const partes: string[] = [];\n if (missingRequired.length > 0) {\n partes.push(`Diretórios obrigatórios ausentes/faltantes: ${missingRequired.join(', ')}.`);\n }\n if (forbiddenPresent.length > 0) {\n partes.push(`Diretórios não permitidos/proibidos presentes: ${forbiddenPresent.join(', ')}.`);\n }\n if (partes.length > 0) {\n explicacaoSimilaridade = `${partes.join(' ')} Estrutura parcialmente compatível, personalizada ou com diferenças.`;\n }\n }\n\n // Importante: manter score negativo quando penalidades superam acertos,\n // pois alguns testes validam score <= 0 para cenários de penalização.\n const maxPossible = (def.pesoBase || 1) * 10 + (def.requiredDirs?.length || 0) * PESO_REQUIRED + (def.optionalDirs?.length || 0) * PESO_OPTIONAL + (def.dependencyHints?.length || 0) * PESO_DEPENDENCIA + (def.filePresencePatterns?.length || 0) * PESO_PADRAO + 30;\n const confidence = maxPossible > 0 ? Math.min(100, Math.round(score / maxPossible * 100)) : 0;\n const raizArquivos = norm.filter(caminho => typeof caminho === 'string' && !caminho.includes('/'));\n const allowed = new Set([...(def.rootFilesAllowed || [])]);\n const anomalias: ArquetipoDeteccaoAnomalia[] = [];\n for (const rf of raizArquivos) {\n if (typeof rf === 'string' && rf.trim() !== '' && !allowed.has(rf)) {\n anomalias.push({\n path: rf,\n motivo: 'Arquivo na raiz não permitido para este arquétipo'\n });\n }\n }\n let sugestaoPadronizacao = '';\n if (def.nome === 'api-rest-express') {\n if (!matchedRequired.includes('src/controllers')) {\n sugestaoPadronizacao += 'Sugestão: adicione o diretório src/controllers para seguir o padrão api-rest-express.\\n';\n }\n if (!dependencyMatches.includes('express')) {\n sugestaoPadronizacao += 'Sugestão: adicione express nas dependências para seguir o padrão api-rest-express.\\n';\n }\n if (!norm.some(arquivo => /api|rest/i.test(arquivo))) {\n sugestaoPadronizacao += 'Sugestão: utilize nomes de arquivos e rotas que incluam \"api\" ou \"rest\" para reforçar o padrão.\\n';\n }\n }\n return {\n nome: def.nome,\n score,\n confidence,\n matchedRequired,\n missingRequired,\n matchedOptional,\n dependencyMatches,\n filePadraoMatches,\n forbiddenPresent,\n anomalias,\n sugestaoPadronizacao,\n explicacaoSimilaridade,\n descricao: def.descricao || '',\n candidatoExtra\n };\n}\nexport function pontuarTodos(arquivos: string[]): ResultadoDeteccaoArquetipo[] {\n const resultados: ResultadoDeteccaoArquetipo[] = [];\n for (const def of ARQUETIPOS) {\n const resultado = scoreArquetipo(def, arquivos);\n resultados.push(resultado);\n if (resultado.candidatoExtra) {\n const extra = ARQUETIPOS?.find((arquivo: ArquetipoEstruturaDef) => arquivo.nome === resultado.candidatoExtra);\n if (extra) {\n const extraResultado = scoreArquetipo(extra, arquivos);\n if (!resultados.some(x => x.nome === extraResultado.nome)) resultados.push(extraResultado);\n }\n }\n }\n // Filtro: manter apenas candidatos que apresentem algum sinal (match/forbidden/pattern/dep)\n return resultados.filter(resultado => (resultado.matchedRequired?.length || 0) > 0 || (resultado.matchedOptional?.length || 0) > 0 || (resultado.dependencyMatches?.length || 0) > 0 || (resultado.filePadraoMatches?.length || 0) > 0 || (resultado.forbiddenPresent?.length || 0) > 0);\n}\n\n// Versão avançada do scoreArquetipo com análise de sinais do projeto\n\nexport function scoreArquetipoAvancado(def: ArquetipoEstruturaDef, arquivos: string[], sinaisAvancados?: SinaisProjetoAvancados): ResultadoDeteccaoArquetipo {\n // Usa a implementação base\n const resultadoBase = scoreArquetipo(def, arquivos);\n\n // Se não há sinais avançados, retorna resultado base\n if (!sinaisAvancados) {\n return resultadoBase;\n }\n\n // Clona o resultado base para adicionar análises avançadas\n let score = resultadoBase.score;\n let explicacao = resultadoBase.explicacaoSimilaridade || '';\n const frameworks = sinaisAvancados.frameworksDetectados || [];\n const deps = sinaisAvancados.dependencias || [];\n const scripts = sinaisAvancados.scripts || [];\n const detalhes = sinaisAvancados.detalhes || {};\n\n // BONUS INTELIGENTE: Considerar sinais avançados para pontuação contextual\n score += calcularBonusContextual(def, sinaisAvancados);\n\n // Análise específica por arquétipo\n switch (def.nome) {\n case 'next-js':\n if (frameworks.includes('Next.js') || deps.includes('next')) {\n score += 30;\n explicacao += '\\n[V] Framework Next.js detectado via dependências e análise de código.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('pages') || sinaisAvancados.pastasPadrao?.includes('app')) {\n score += 20;\n explicacao += '\\n[V] Estrutura de roteamento Next.js (pages ou app dir) confirmada.';\n }\n // Bônus por tecnologias detectadas\n if (sinaisAvancados.tecnologiasDominantes.includes('frontend-framework')) {\n score += 15;\n }\n break;\n case 'fullstack':\n // Detecção específica para Next.js fullstack\n if (frameworks.includes('Next.js') || deps.includes('next')) {\n score += 35;\n explicacao += '\\n[V] Framework Next.js detectado - aplicação fullstack moderna.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('api')) {\n score += 25;\n explicacao += '\\n[V] API routes Next.js detectadas - backend integrado.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('pages')) {\n score += 20;\n explicacao += '\\n[V] Páginas Next.js (Pages Router) detectadas.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('app')) {\n score += 25;\n explicacao += '\\n[V] App Router Next.js detectado - arquitetura moderna.';\n }\n if (deps.includes('prisma') || deps.includes('@prisma/client')) {\n score += 20;\n explicacao += '\\n[V] Prisma ORM detectado - banco de dados integrado.';\n }\n if (sinaisAvancados.tecnologiasDominantes.includes('frontend-framework')) {\n score += 15;\n explicacao += '\\n[V] Tecnologias frontend modernas detectadas.';\n }\n if (sinaisAvancados.tecnologiasDominantes.includes('backend-api')) {\n score += 15;\n explicacao += '\\n[V] APIs backend detectadas no fullstack.';\n }\n break;\n case 'vite':\n if (frameworks.includes('Vite') || deps.includes('vite')) {\n score += 30;\n explicacao += '\\n[V] Build tool Vite detectado.';\n }\n if (sinaisAvancados.arquivosConfiguracao?.some(arquivo => arquivo.includes('vite.config'))) {\n score += 15;\n explicacao += '\\n[V] Arquivo de configuração Vite presente.';\n }\n break;\n case 'api-rest-express':\n if (frameworks.includes('Express') || deps.includes('express')) {\n score += 25;\n explicacao += '\\n[V] Framework Express detectado.';\n }\n if (frameworks.includes('Fastify') || deps.includes('fastify')) {\n score += 25;\n explicacao += '\\n[V] Framework Fastify detectado - alta performance.';\n }\n if (frameworks.includes('NestJS') || deps.includes('@nestjs/core')) {\n score += 30;\n explicacao += '\\n[V] Framework NestJS detectado - arquitetura enterprise.';\n }\n if (frameworks.includes('Koa') || deps.includes('koa')) {\n score += 20;\n explicacao += '\\n[V] Framework Koa detectado.';\n }\n if (frameworks.includes('Hapi') || deps.includes('@hapi/hapi')) {\n score += 20;\n explicacao += '\\n[V] Framework Hapi detectado.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('routes') || sinaisAvancados.pastasPadrao?.includes('api') || sinaisAvancados.pastasPadrao?.includes('controllers')) {\n score += 15;\n explicacao += '\\n[V] Estrutura de rotas/controllers API detectada.';\n }\n if (deps.includes('cors') || deps.includes('helmet') || deps.includes('@fastify/cors')) {\n score += 10;\n explicacao += '\\n[V] Middleware de segurança/CORS presente.';\n }\n if (deps.includes('joi') || deps.includes('@hapi/joi')) {\n score += 10;\n explicacao += '\\n[V] Validação de dados detectada.';\n }\n if (deps.includes('prisma') || deps.includes('mongoose') || deps.includes('typeorm')) {\n score += 15;\n explicacao += '\\n[V] ORM/Database layer detectado.';\n }\n // Bônus por padrões arquiteturais\n if (sinaisAvancados.padroesArquiteturais.includes('repository-service')) {\n score += 10;\n explicacao += '\\n[V] Padrão Repository/Service compatível com APIs REST.';\n }\n if (sinaisAvancados.tecnologiasDominantes.includes('backend-api')) {\n score += 20;\n explicacao += '\\n[V] Foco em desenvolvimento backend/API confirmado.';\n }\n break;\n case 'vue-spa':\n // Detecção específica para Vue.js SPA\n if (frameworks.includes('Vue') || deps.includes('vue')) {\n score += 30;\n explicacao += '\\n[V] Framework Vue.js detectado - SPA moderna.';\n }\n if (deps.includes('vue-router')) {\n score += 20;\n explicacao += '\\n[V] Vue Router detectado - roteamento SPA.';\n }\n if (deps.includes('vuex') || deps.includes('pinia')) {\n score += 20;\n explicacao += '\\n[V] State management detectado (Vuex/Pinia).';\n }\n if (deps.includes('@vue/cli-service') || deps.includes('vite')) {\n score += 15;\n explicacao += '\\n[V] Build tool Vue detectado (CLI/Vite).';\n }\n if (sinaisAvancados.pastasPadrao?.includes('src/components')) {\n score += 15;\n explicacao += '\\n[V] Estrutura de componentes Vue detectada.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('src/composables')) {\n score += 15;\n explicacao += '\\n[V] Composables Vue 3 detectados - arquitetura moderna.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('src/views')) {\n score += 10;\n explicacao += '\\n[V] Estrutura de views/pages detectada.';\n }\n if (deps.includes('nuxt') || deps.includes('nuxt3')) {\n score += 25;\n explicacao += '\\n[V] Nuxt.js detectado - SSR/SSG framework.';\n }\n if (sinaisAvancados.tecnologiasDominantes.includes('frontend-framework')) {\n score += 15;\n explicacao += '\\n[V] Foco em desenvolvimento frontend confirmado.';\n }\n break;\n case 'react-app':\n if (frameworks.includes('React') || deps.includes('react')) {\n score += 30;\n explicacao += '\\n[V] Framework React detectado.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('components') || sinaisAvancados.pastasPadrao?.includes('src')) {\n score += 15;\n explicacao += '\\n[V] Estrutura React típica com components detectada.';\n }\n // Bônus por tecnologias detectadas\n if (sinaisAvancados.tecnologiasDominantes.includes('frontend-framework')) {\n score += 15;\n }\n break;\n case 'vue-app':\n if (frameworks.includes('Vue') || deps.includes('vue')) {\n score += 30;\n explicacao += '\\n[V] Framework Vue detectado.';\n }\n if (sinaisAvancados.pastasPadrao?.includes('components') || sinaisAvancados.arquivosPadrao?.some(arquivo => arquivo.endsWith('.vue'))) {\n score += 15;\n explicacao += '\\n[V] Estrutura Vue com components detectada.';\n }\n break;\n case 'typescript-lib':\n if (sinaisAvancados.tipos?.length > 0) {\n score += 20;\n explicacao += `\\n[V] Tipos TypeScript detectados (${sinaisAvancados.tipos.length} tipos).`;\n }\n if (deps.includes('typescript') || sinaisAvancados.arquivosConfiguracao?.some(arquivo => arquivo.includes('tsconfig'))) {\n score += 15;\n explicacao += '\\n[V] Configuração TypeScript presente.';\n }\n if (scripts.includes('build') || scripts.includes('compile')) {\n score += 10;\n explicacao += '\\n[V] Scripts de build detectados.';\n }\n // Bônus por TypeScript avançado\n if (sinaisAvancados.tecnologiasDominantes.includes('typescript-advanced')) {\n score += 20;\n explicacao += '\\n[V] Uso avançado de TypeScript detectado.';\n }\n break;\n case 'monorepo':\n if (sinaisAvancados.arquivosConfiguracao?.some(arquivo => arquivo.includes('lerna.json') || arquivo.includes('pnpm-workspace'))) {\n score += 25;\n explicacao += '\\n[V] Configuração de monorepo detectada (Lerna ou pnpm).';\n }\n if (sinaisAvancados.pastasPadrao?.includes('packages') || sinaisAvancados.pastasPadrao?.includes('apps')) {\n score += 20;\n explicacao += '\\n[V] Estrutura de workspaces/packages detectada.';\n }\n // Bônus por complexidade alta\n if (sinaisAvancados.complexidadeEstrutura === 'alta') {\n score += 20;\n explicacao += '\\n[V] Complexidade estrutural alta compatível com monorepo.';\n }\n break;\n case 'cli':\n if (sinaisAvancados.pastasPadrao?.includes('bin') || sinaisAvancados.pastasPadrao?.includes('cli')) {\n score += 20;\n explicacao += '\\n[V] Estrutura de CLI detectada (bin ou cli).';\n }\n if (deps.includes('commander') || deps.includes('yargs') || deps.includes('inquirer')) {\n score += 15;\n explicacao += '\\n[V] Biblioteca de CLI detectada (commander/yargs/inquirer).';\n }\n // Bônus por padrões CLI\n if (sinaisAvancados.padroesArquiteturais.includes('cli-patterns')) {\n score += 25;\n explicacao += '\\n[V] Padrões específicos de CLI detectados.';\n }\n // Penalizar se tem estrutura web\n if (sinaisAvancados.tecnologiasDominantes.includes('frontend-framework')) {\n score -= 30;\n explicacao += '\\n[X] Estrutura web detectada, incompatível com CLI.';\n }\n break;\n case 'clean-arch':\n // Clean Architecture scoring\n if (sinaisAvancados.camadasCleanArch?.domain) {\n score += 30;\n explicacao += '\\n[V] Camada de domínio detectada (entities, value-objects).';\n }\n if (sinaisAvancados.camadasCleanArch?.application) {\n score += 25;\n explicacao += '\\n[V] Camada de aplicação detectada (use-cases, ports).';\n }\n if (sinaisAvancados.camadasCleanArch?.infrastructure) {\n score += 20;\n explicacao += '\\n[V] Camada de infraestrutura detectada.';\n }\n if (sinaisAvancados.camadasCleanArch?.presentation) {\n score += 15;\n explicacao += '\\n[V] Camada de apresentação detectada.';\n }\n if (sinaisAvancados.padroesCleanArch?.includes('use-case')) {\n score += 20;\n explicacao += '\\n[V] Padrão Use Case detectado.';\n }\n // Bônus por tecnologias compatíveis\n if (sinaisAvancados.dependencias.some(d => d.includes('tsyringe') || d.includes('inversify') || d.includes('awilix'))) {\n score += 15;\n explicacao += '\\n[V] DI Container compatível com Clean Architecture.';\n }\n if (sinaisAvancados.dependencias.some(d => d.includes('zod') || d.includes('class-validator') || d.includes('joi'))) {\n score += 10;\n explicacao += '\\n[V] Validação de dados compatível com DTOs.';\n }\n // Penalidade se tem estrutura incompatível\n if (sinaisAvancados.pastasPadrao?.some(p => p.includes('pages') || p.includes('components'))) {\n score -= 15;\n explicacao += '\\n[X] Estrutura de frontend (pages/components) presente em projeto Clean Architecture.';\n }\n break;\n case 'microservices':\n if (sinaisAvancados.boundariesServicos && sinaisAvancados.boundariesServicos.length > 0) {\n score += 30;\n explicacao += `\\n[V] ${sinaisAvancados.boundariesServicos.length} boundaries de serviço detectados: ${sinaisAvancados.boundariesServicos.join(', ')}.`;\n }\n if (sinaisAvancados.padroesDistribuidos?.includes('api-gateway')) {\n score += 20;\n explicacao += '\\n[V] API Gateway detectado.';\n }\n if (sinaisAvancados.padroesDistribuidos?.includes('event-driven') || (sinaisAvancados.mensageriaDetectada && sinaisAvancados.mensageriaDetectada.length > 0)) {\n score += 25;\n explicacao += '\\n[V] Sistema de mensageria/eventos detectado.';\n }\n if (sinaisAvancados.padroesDistribuidos?.includes('containerized')) {\n score += 20;\n explicacao += '\\n[V] Conteinerização (Docker) detectada.';\n }\n if (sinaisAvancados.padroesDistribuidos?.includes('orchestrated')) {\n score += 15;\n explicacao += '\\n[V] Orquestração (Kubernetes) detectada.';\n }\n if (sinaisAvancados.padroesDistribuidos?.includes('service-discovery')) {\n score += 15;\n explicacao += '\\n[V] Service Discovery detectado.';\n }\n if (sinaisAvancados.padroesDistribuidos?.includes('monitoring')) {\n score += 10;\n explicacao += '\\n[V] Monitoramento/Health checks detectados.';\n }\n if (sinaisAvancados.padroesDistribuidos?.includes('shared-library')) {\n score += 10;\n explicacao += '\\n[V] Biblioteca compartilhada entre serviços detectada.';\n }\n // Penalidades\n if (sinaisAvancados.pastasPadrao?.some(p => p.includes('pages') || p.includes('components'))) {\n score -= 20;\n explicacao += '\\n[X] Estrutura frontend não esperada em arquitetura de microsserviços.';\n }\n if (sinaisAvancados.complexidadeEstrutura === 'baixa' && (!sinaisAvancados.boundariesServicos || sinaisAvancados.boundariesServicos.length < 2)) {\n score -= 15;\n explicacao += '\\n[X] Projeto muito pequeno para arquitetura de microsserviços.';\n }\n break;\n }\n\n // Análises genéricas aplicáveis a todos os arquétipos\n if (detalhes.testRunner) {\n score += 5;\n explicacao += `\\n[V] Test runner detectado: ${detalhes.testRunner}.`;\n }\n if (detalhes.linter) {\n score += 3;\n explicacao += `\\n[V] Linter configurado: ${detalhes.linter}.`;\n }\n if (detalhes.bundler && !['vite', 'webpack', 'rollup'].includes(def.nome)) {\n score += 5;\n explicacao += `\\n[V] Bundler detectado: ${detalhes.bundler}.`;\n }\n\n // Detectar complexidade do projeto baseado nos sinais\n const complexidade = (sinaisAvancados.funcoes || 0) + (sinaisAvancados.classes || 0) + (sinaisAvancados.variaveis || 0);\n if (complexidade > 100) {\n explicacao += `\\n[GRAFICO] Projeto de complexidade alta (${complexidade} elementos).`;\n } else if (complexidade > 50) {\n explicacao += `\\n[GRAFICO] Projeto de complexidade média (${complexidade} elementos).`;\n }\n\n // Recalcular confidence baseado no novo score\n const maxPossible = (def.pesoBase || 1) * 10 + (def.requiredDirs?.length || 0) * PESO_REQUIRED + (def.optionalDirs?.length || 0) * PESO_OPTIONAL + (def.dependencyHints?.length || 0) * PESO_DEPENDENCIA + (def.filePresencePatterns?.length || 0) * PESO_PADRAO + 100; // Adiciona margem para análise avançada\n\n const confidence = maxPossible > 0 ? Math.min(100, Math.round(score / maxPossible * 100)) : 0;\n return {\n ...resultadoBase,\n score,\n confidence,\n explicacaoSimilaridade: explicacao.trim()\n };\n}\nfunction calcularBonusContextual(def: ArquetipoEstruturaDef, sinais: SinaisProjetoAvancados): number {\n let bonus = 0;\n\n // Bônus baseado na complexidade da estrutura\n if (def.nome === 'monorepo' && sinais.complexidadeEstrutura === 'alta') {\n bonus += 20;\n }\n\n // Penalizar estruturas simples para arquetipos complexos\n if ((def.nome === 'fullstack' || def.nome === 'monorepo') && sinais.complexidadeEstrutura === 'baixa') {\n bonus -= 15;\n }\n\n // Bônus por alinhamento de padrões arquiteturais\n if (def.nome === 'api-rest-express' && sinais.padroesArquiteturais.includes('repository-service')) {\n bonus += 15;\n }\n if (def.nome === 'cli' && sinais.padroesArquiteturais.includes('cli-patterns')) {\n bonus += 20;\n }\n\n // Bônus Clean Architecture\n if (def.nome === 'clean-arch') {\n if (sinais.camadasCleanArch?.domain) bonus += 25;\n if (sinais.camadasCleanArch?.application) bonus += 20;\n if (sinais.camadasCleanArch?.infrastructure) bonus += 15;\n if (sinais.camadasCleanArch?.presentation) bonus += 10;\n if (sinais.padroesCleanArch?.length) bonus += 10;\n }\n\n // Bônus Microservices\n if (def.nome === 'microservices') {\n if (sinais.boundariesServicos && sinais.boundariesServicos.length > 1) bonus += 25;\n if (sinais.padroesDistribuidos?.includes('event-driven')) bonus += 20;\n if (sinais.padroesDistribuidos?.includes('api-gateway')) bonus += 15;\n if (sinais.padroesDistribuidos?.includes('containerized')) bonus += 15;\n if (sinais.mensageriaDetectada && sinais.mensageriaDetectada.length > 0) bonus += 20;\n }\n\n // Penalizar incompatibilidades tecnológicas\n if (def.nome === 'cli' && sinais.tecnologiasDominantes.includes('frontend-framework')) {\n bonus -= 25;\n }\n if (def.nome === 'typescript-lib' && sinais.tecnologiasDominantes.includes('frontend-framework')) {\n bonus -= 20;\n }\n if (def.nome === 'clean-arch' && sinais.tecnologiasDominantes.includes('frontend-framework') && !sinais.camadasCleanArch?.domain) {\n bonus -= 15;\n }\n if (def.nome === 'microservices' && sinais.complexidadeEstrutura === 'baixa') {\n bonus -= 20;\n }\n return bonus;\n}\nexport function pontuarTodosAvancado(arquivos: string[], sinaisAvancados?: SinaisProjetoAvancados): ResultadoDeteccaoArquetipo[] {\n const resultados: ResultadoDeteccaoArquetipo[] = [];\n for (const def of ARQUETIPOS) {\n const resultado = scoreArquetipoAvancado(def, arquivos, sinaisAvancados);\n resultados.push(resultado);\n if (resultado.candidatoExtra) {\n const extra = ARQUETIPOS?.find((arquivo: ArquetipoEstruturaDef) => arquivo.nome === resultado.candidatoExtra);\n if (extra) {\n const extraResultado = scoreArquetipoAvancado(extra, arquivos, sinaisAvancados);\n if (!resultados.some(x => x.nome === extraResultado.nome)) resultados.push(extraResultado);\n }\n }\n }\n // Filtro: manter apenas candidatos que apresentem algum sinal (match/forbidden/pattern/dep)\n return resultados.filter(resultado => (resultado.matchedRequired?.length || 0) > 0 || (resultado.matchedOptional?.length || 0) > 0 || (resultado.dependencyMatches?.length || 0) > 0 || (resultado.filePadraoMatches?.length || 0) > 0 || (resultado.forbiddenPresent?.length || 0) > 0);\n}"]}
|
|
@@ -2,5 +2,7 @@ import type { App } from '@octokit/app';
|
|
|
2
2
|
import type { RepoDownloadResult } from '../../../types/github/app.js';
|
|
3
3
|
export declare function getInstallationToken(app: App, installationId: number): Promise<string>;
|
|
4
4
|
export declare function downloadRepo(app: App, installationId: number, owner: string, repo: string, ref: string): Promise<RepoDownloadResult>;
|
|
5
|
+
export declare function escreverAskpassScript(): string;
|
|
6
|
+
export declare function limparAskpassScript(caminho: string): void;
|
|
5
7
|
export declare function cloneRepo(app: App, installationId: number, owner: string, repo: string, ref: string): Promise<RepoDownloadResult>;
|
|
6
8
|
//# sourceMappingURL=repo-downloader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-downloader.d.ts","sourceRoot":"","sources":["../../../../src/app/github/app/repo-downloader.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AA0BvE,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK5F;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,GAAG,EACR,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,kBAAkB,CAAC,CA6D7B;
|
|
1
|
+
{"version":3,"file":"repo-downloader.d.ts","sourceRoot":"","sources":["../../../../src/app/github/app/repo-downloader.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AA0BvE,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK5F;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,GAAG,EACR,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,kBAAkB,CAAC,CA6D7B;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAK9C;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEzD;AAoBD,wBAAsB,SAAS,CAC7B,GAAG,EAAE,GAAG,EACR,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,kBAAkB,CAAC,CA0C7B"}
|
|
@@ -85,13 +85,13 @@ export async function downloadRepo(app, installationId, owner, repo, ref) {
|
|
|
85
85
|
throw err;
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
|
-
function escreverAskpassScript() {
|
|
88
|
+
export function escreverAskpassScript() {
|
|
89
89
|
const tmpScript = join(tmpdir(), `tutanus-askpass-${Date.now()}.sh`);
|
|
90
90
|
writeFileSync(tmpScript, '#!/bin/sh\necho "$TUTANUS_GIT_TOKEN"');
|
|
91
91
|
chmodSync(tmpScript, 0o500);
|
|
92
92
|
return tmpScript;
|
|
93
93
|
}
|
|
94
|
-
function limparAskpassScript(caminho) {
|
|
94
|
+
export function limparAskpassScript(caminho) {
|
|
95
95
|
try {
|
|
96
96
|
rmSync(caminho);
|
|
97
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-downloader.js","sourceRoot":"","sources":["../../../../src/app/github/app/repo-downloader.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFileSync } from 'node:child_process';\nimport { chmodSync, mkdtempSync, readdirSync, rmSync, statSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\n\nimport { messages } from '@core/messages';\nimport type { App } from '@octokit/app';\n\nimport type { RepoDownloadResult } from '../../../types/github/app.js';\n\nconst HTTP_REDIRECT = 302;\nconst { GithubRepoDownloaderMensagens } = messages;\n\n// Expressões para validar owner/repo/ref - apenas caracteres seguros\nconst OWNER_REPO_RE = /^[a-zA-Z0-9_.-]+$/;\nconst REF_RE = /^[a-zA-Z0-9_.\\-/]+$/;\n\nfunction validarInput(valor: string, regex: RegExp, nome: string): void {\n if (!regex.test(valor)) {\n throw new Error(messages.ExcecoesMensagens.inputInvalido(nome));\n }\n}\n\nfunction validarRedirectUrl(url: string): URL {\n const parsed = new URL(url);\n if (!parsed.hostname.endsWith('.github.com') && parsed.hostname !== 'github.com') {\n throw new Error(GithubRepoDownloaderMensagens.redirectInvalido);\n }\n if (!parsed.protocol.startsWith('https')) {\n throw new Error(GithubRepoDownloaderMensagens.redirectInvalido);\n }\n return parsed;\n}\n\nexport async function getInstallationToken(app: App, installationId: number): Promise<string> {\n const { data } = await app.octokit.request('POST /app/installations/{installation_id}/access_tokens', {\n installation_id: installationId\n });\n return data.token;\n}\n\nexport async function downloadRepo(\n app: App,\n installationId: number,\n owner: string,\n repo: string,\n ref: string\n): Promise<RepoDownloadResult> {\n validarInput(owner, OWNER_REPO_RE, 'owner');\n validarInput(repo, OWNER_REPO_RE, 'repo');\n validarInput(ref, REF_RE, 'ref');\n\n const tempDir = mkdtempSync(join(tmpdir(), 'tutanus-repo-'));\n const zipPath = join(tempDir, 'repo.zip');\n\n try {\n const octokit = await app.getInstallationOctokit(installationId);\n\n const response = await octokit.request('GET /repos/{owner}/{repo}/zipball/{ref}', {\n owner,\n repo,\n ref,\n request: { redirect: 'manual' }\n });\n\n let zipBuffer: Buffer;\n if (response.status === HTTP_REDIRECT && response.headers.location) {\n const redirectUrl = validarRedirectUrl(response.headers.location);\n const token = await getInstallationToken(app, installationId);\n const zipResponse = await fetch(redirectUrl, {\n headers: { Authorization: `Bearer ${token}` }\n });\n if (!zipResponse.ok) {\n throw new Error(GithubRepoDownloaderMensagens.falhaBaixarZipball(zipResponse.status));\n }\n zipBuffer = Buffer.from(await zipResponse.arrayBuffer());\n } else if (Buffer.isBuffer(response.data)) {\n zipBuffer = response.data;\n } else {\n throw new Error(GithubRepoDownloaderMensagens.respostaInesperada);\n }\n\n writeFileSync(zipPath, zipBuffer);\n\n // Extrai o zip usando Node.js child_process com argument array (sem shell)\n execFileSync('unzip', ['-q', zipPath, '-d', tempDir], { stdio: 'pipe' });\n rmSync(zipPath);\n\n // Valida que nenhum entry do zip escapou do diretório (Zip Slip protection)\n validarSemPathTraversal(tempDir);\n\n const entries = readdirSync(tempDir);\n const repoDirName = entries?.find(e => e !== 'repo.zip') ?? '';\n if (!repoDirName) {\n throw new Error(GithubRepoDownloaderMensagens.nenhumDiretorioEncontrado);\n }\n\n return {\n tempDir,\n repoDir: join(tempDir, repoDirName),\n cleanup: () => {\n try { rmSync(tempDir, { recursive: true, force: true }); } catch { }\n }\n };\n } catch (err) {\n rmSync(tempDir, { recursive: true, force: true });\n throw err;\n }\n}\n\nfunction escreverAskpassScript(): string {\n const tmpScript = join(tmpdir(), `tutanus-askpass-${Date.now()}.sh`);\n writeFileSync(tmpScript, '#!/bin/sh\\necho \"$TUTANUS_GIT_TOKEN\"');\n chmodSync(tmpScript, 0o500);\n return tmpScript;\n}\n\nfunction limparAskpassScript(caminho: string): void {\n try { rmSync(caminho); } catch { }\n}\n\nfunction validarSemPathTraversal(dir: string): void {\n const pilha = [dir];\n while (pilha.length > 0) {\n const atual = pilha.pop();\n if (!atual) continue;\n for (const entry of readdirSync(atual)) {\n const caminhoCompleto = join(atual, entry);\n if (!caminhoCompleto.startsWith(dir)) {\n rmSync(dir, { recursive: true, force: true });\n throw new Error(GithubRepoDownloaderMensagens.pathTraversalDetectado);\n }\n if (statSync(caminhoCompleto).isDirectory()) {\n pilha.push(caminhoCompleto);\n }\n }\n }\n}\n\nexport async function cloneRepo(\n app: App,\n installationId: number,\n owner: string,\n repo: string,\n ref: string\n): Promise<RepoDownloadResult> {\n validarInput(owner, OWNER_REPO_RE, 'owner');\n validarInput(repo, OWNER_REPO_RE, 'repo');\n validarInput(ref, REF_RE, 'ref');\n\n const tempDir = mkdtempSync(join(tmpdir(), 'tutanus-repo-'));\n const repoDir = join(tempDir, 'repo');\n const token = await getInstallationToken(app, installationId);\n\n // Usa GIT_ASKPASS em vez de token na URL para evitar vazamento em process listing\n const askpassScript = escreverAskpassScript();\n\n try {\n execFileSync(\n 'git',\n ['clone', '--depth', '1', '--branch', ref,\n `https://github.com/${owner}/${repo}.git`, repoDir],\n {\n stdio: 'pipe',\n timeout: 120000,\n env: {\n ...process.env,\n TUTANUS_GIT_TOKEN: token,\n GIT_ASKPASS: askpassScript,\n GIT_TERMINAL_PROMPT: '0'\n }\n }\n );\n\n return {\n tempDir,\n repoDir,\n cleanup: () => {\n limparAskpassScript(askpassScript);\n try { rmSync(tempDir, { recursive: true, force: true }); } catch { }\n }\n };\n } catch (err) {\n limparAskpassScript(askpassScript);\n rmSync(tempDir, { recursive: true, force: true });\n throw err;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"repo-downloader.js","sourceRoot":"","sources":["../../../../src/app/github/app/repo-downloader.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFileSync } from 'node:child_process';\nimport { chmodSync, mkdtempSync, readdirSync, rmSync, statSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\n\nimport { messages } from '@core/messages';\nimport type { App } from '@octokit/app';\n\nimport type { RepoDownloadResult } from '../../../types/github/app.js';\n\nconst HTTP_REDIRECT = 302;\nconst { GithubRepoDownloaderMensagens } = messages;\n\n// Expressões para validar owner/repo/ref - apenas caracteres seguros\nconst OWNER_REPO_RE = /^[a-zA-Z0-9_.-]+$/;\nconst REF_RE = /^[a-zA-Z0-9_.\\-/]+$/;\n\nfunction validarInput(valor: string, regex: RegExp, nome: string): void {\n if (!regex.test(valor)) {\n throw new Error(messages.ExcecoesMensagens.inputInvalido(nome));\n }\n}\n\nfunction validarRedirectUrl(url: string): URL {\n const parsed = new URL(url);\n if (!parsed.hostname.endsWith('.github.com') && parsed.hostname !== 'github.com') {\n throw new Error(GithubRepoDownloaderMensagens.redirectInvalido);\n }\n if (!parsed.protocol.startsWith('https')) {\n throw new Error(GithubRepoDownloaderMensagens.redirectInvalido);\n }\n return parsed;\n}\n\nexport async function getInstallationToken(app: App, installationId: number): Promise<string> {\n const { data } = await app.octokit.request('POST /app/installations/{installation_id}/access_tokens', {\n installation_id: installationId\n });\n return data.token;\n}\n\nexport async function downloadRepo(\n app: App,\n installationId: number,\n owner: string,\n repo: string,\n ref: string\n): Promise<RepoDownloadResult> {\n validarInput(owner, OWNER_REPO_RE, 'owner');\n validarInput(repo, OWNER_REPO_RE, 'repo');\n validarInput(ref, REF_RE, 'ref');\n\n const tempDir = mkdtempSync(join(tmpdir(), 'tutanus-repo-'));\n const zipPath = join(tempDir, 'repo.zip');\n\n try {\n const octokit = await app.getInstallationOctokit(installationId);\n\n const response = await octokit.request('GET /repos/{owner}/{repo}/zipball/{ref}', {\n owner,\n repo,\n ref,\n request: { redirect: 'manual' }\n });\n\n let zipBuffer: Buffer;\n if (response.status === HTTP_REDIRECT && response.headers.location) {\n const redirectUrl = validarRedirectUrl(response.headers.location);\n const token = await getInstallationToken(app, installationId);\n const zipResponse = await fetch(redirectUrl, {\n headers: { Authorization: `Bearer ${token}` }\n });\n if (!zipResponse.ok) {\n throw new Error(GithubRepoDownloaderMensagens.falhaBaixarZipball(zipResponse.status));\n }\n zipBuffer = Buffer.from(await zipResponse.arrayBuffer());\n } else if (Buffer.isBuffer(response.data)) {\n zipBuffer = response.data;\n } else {\n throw new Error(GithubRepoDownloaderMensagens.respostaInesperada);\n }\n\n writeFileSync(zipPath, zipBuffer);\n\n // Extrai o zip usando Node.js child_process com argument array (sem shell)\n execFileSync('unzip', ['-q', zipPath, '-d', tempDir], { stdio: 'pipe' });\n rmSync(zipPath);\n\n // Valida que nenhum entry do zip escapou do diretório (Zip Slip protection)\n validarSemPathTraversal(tempDir);\n\n const entries = readdirSync(tempDir);\n const repoDirName = entries?.find(e => e !== 'repo.zip') ?? '';\n if (!repoDirName) {\n throw new Error(GithubRepoDownloaderMensagens.nenhumDiretorioEncontrado);\n }\n\n return {\n tempDir,\n repoDir: join(tempDir, repoDirName),\n cleanup: () => {\n try { rmSync(tempDir, { recursive: true, force: true }); } catch { }\n }\n };\n } catch (err) {\n rmSync(tempDir, { recursive: true, force: true });\n throw err;\n }\n}\n\nexport function escreverAskpassScript(): string {\n const tmpScript = join(tmpdir(), `tutanus-askpass-${Date.now()}.sh`);\n writeFileSync(tmpScript, '#!/bin/sh\\necho \"$TUTANUS_GIT_TOKEN\"');\n chmodSync(tmpScript, 0o500);\n return tmpScript;\n}\n\nexport function limparAskpassScript(caminho: string): void {\n try { rmSync(caminho); } catch { }\n}\n\nfunction validarSemPathTraversal(dir: string): void {\n const pilha = [dir];\n while (pilha.length > 0) {\n const atual = pilha.pop();\n if (!atual) continue;\n for (const entry of readdirSync(atual)) {\n const caminhoCompleto = join(atual, entry);\n if (!caminhoCompleto.startsWith(dir)) {\n rmSync(dir, { recursive: true, force: true });\n throw new Error(GithubRepoDownloaderMensagens.pathTraversalDetectado);\n }\n if (statSync(caminhoCompleto).isDirectory()) {\n pilha.push(caminhoCompleto);\n }\n }\n }\n}\n\nexport async function cloneRepo(\n app: App,\n installationId: number,\n owner: string,\n repo: string,\n ref: string\n): Promise<RepoDownloadResult> {\n validarInput(owner, OWNER_REPO_RE, 'owner');\n validarInput(repo, OWNER_REPO_RE, 'repo');\n validarInput(ref, REF_RE, 'ref');\n\n const tempDir = mkdtempSync(join(tmpdir(), 'tutanus-repo-'));\n const repoDir = join(tempDir, 'repo');\n const token = await getInstallationToken(app, installationId);\n\n // Usa GIT_ASKPASS em vez de token na URL para evitar vazamento em process listing\n const askpassScript = escreverAskpassScript();\n\n try {\n execFileSync(\n 'git',\n ['clone', '--depth', '1', '--branch', ref,\n `https://github.com/${owner}/${repo}.git`, repoDir],\n {\n stdio: 'pipe',\n timeout: 120000,\n env: {\n ...process.env,\n TUTANUS_GIT_TOKEN: token,\n GIT_ASKPASS: askpassScript,\n GIT_TERMINAL_PROMPT: '0'\n }\n }\n );\n\n return {\n tempDir,\n repoDir,\n cleanup: () => {\n limparAskpassScript(askpassScript);\n try { rmSync(tempDir, { recursive: true, force: true }); } catch { }\n }\n };\n } catch (err) {\n limparAskpassScript(askpassScript);\n rmSync(tempDir, { recursive: true, force: true });\n throw err;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-fix-job.d.ts","sourceRoot":"","sources":["../../../../src/app/github/jobs/auto-fix-job.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,KAAK,EAA6B,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAY/F,wBAAsB,cAAc,CAClC,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"auto-fix-job.d.ts","sourceRoot":"","sources":["../../../../src/app/github/jobs/auto-fix-job.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,KAAK,EAA6B,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAY/F,wBAAsB,cAAc,CAClC,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,IAAI,CAAC,CAoKf"}
|
|
@@ -2,7 +2,7 @@ import { execSync } from 'node:child_process';
|
|
|
2
2
|
import { readFileSync, writeFileSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { applyQuickFix, findQuickFixes, getAutoFixConfig } from '../../../core/config/auto/index.js';
|
|
5
|
-
import { cloneRepo } from '../app/repo-downloader.js';
|
|
5
|
+
import { cloneRepo, escreverAskpassScript, limparAskpassScript } from '../app/repo-downloader.js';
|
|
6
6
|
import { executarAnaliseInterna } from './full-analysis-job.js';
|
|
7
7
|
import { atualizarJob, executarJob } from './job-manager.js';
|
|
8
8
|
async function getToken(app, installationId) {
|
|
@@ -69,8 +69,24 @@ export async function iniciarAutoFix(app, jobId, job) {
|
|
|
69
69
|
execSync('git add -A', { cwd: repoDir, stdio: 'pipe' });
|
|
70
70
|
execSync(`git commit -m "fix: correcoes automaticas Tutanus" -m "Total: ${correcoesAplicadas} correcoes em ${fixesPorArquivo.size} arquivos."`, { cwd: repoDir, stdio: 'pipe' });
|
|
71
71
|
const token = await getToken(app, job.installationId);
|
|
72
|
-
const
|
|
73
|
-
|
|
72
|
+
const askpassScript = escreverAskpassScript();
|
|
73
|
+
const repoUrl = `https://github.com/${job.owner}/${job.repo}.git`;
|
|
74
|
+
try {
|
|
75
|
+
execSync(`git push "${repoUrl}" HEAD:${branchName}`, {
|
|
76
|
+
cwd: repoDir,
|
|
77
|
+
stdio: 'pipe',
|
|
78
|
+
timeout: 60000,
|
|
79
|
+
env: {
|
|
80
|
+
...process.env,
|
|
81
|
+
TUTANUS_GIT_TOKEN: token,
|
|
82
|
+
GIT_ASKPASS: askpassScript,
|
|
83
|
+
GIT_TERMINAL_PROMPT: '0'
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
limparAskpassScript(askpassScript);
|
|
89
|
+
}
|
|
74
90
|
const defaultBranch = job.ref === 'HEAD' ? (await getDefaultBranch(octokit, job.owner, job.repo)) : job.ref;
|
|
75
91
|
const changedFiles = Array.from(fixesPorArquivo.keys())
|
|
76
92
|
.map(f => `- \`${f.replace(repoDir, '')}\``)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-fix-job.js","sourceRoot":"","sources":["../../../../src/app/github/jobs/auto-fix-job.ts"],"names":[],"mappings":"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","sourcesContent":["import { execSync } from 'node:child_process';\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { applyQuickFix, findQuickFixes, getAutoFixConfig } from '@core/config/auto';\nimport type { App } from '@octokit/app';\n\nimport type { FullAnalysisAutoFixResult, FullAnalysisJob } from '../../../types/github/app.js';\nimport { cloneRepo } from '../app/repo-downloader.js';\nimport { executarAnaliseInterna } from './full-analysis-job.js';\nimport { atualizarJob, executarJob } from './job-manager.js';\n\nasync function getToken(app: App, installationId: number): Promise<string> {\n const { data } = await app.octokit.request('POST /app/installations/{installation_id}/access_tokens', {\n installation_id: installationId\n });\n return data.token;\n}\n\nexport async function iniciarAutoFix(\n app: App,\n jobId: string,\n job: FullAnalysisJob\n): Promise<void> {\n await executarJob(jobId, async () => {\n atualizarJob(jobId, { status: 'baixando' });\n\n const { repoDir, cleanup } = await cloneRepo(\n app,\n job.installationId,\n job.owner,\n job.repo,\n job.ref\n );\n\n try {\n atualizarJob(jobId, { status: 'analisando' });\n const inicio = Date.now();\n\n const { totalArquivos, arquivosAnalisados, todasOcorrencias, fileEntriesComAst } =\n await executarAnaliseInterna(repoDir, job.options);\n\n const autoFixOcorrencias = todasOcorrencias.filter(\n (o: { tipo?: string }) => o.tipo === 'auto-fix-disponivel' || o.tipo === 'QUICK_FIX_DISPONIVEL'\n );\n\n const autoFixConfig = getAutoFixConfig(job.options.autoFixMode || 'balanced');\n const fixesPorArquivo = new Map<string, string>();\n let correcoesAplicadas = 0;\n\n for (const ocorrencia of autoFixOcorrencias) {\n const entry = fileEntriesComAst?.find(\n (fe: { relPath: string }) => fe.relPath === ocorrencia.relPath\n );\n if (!entry) continue;\n\n const filePath = join(repoDir, entry.relPath);\n const currentCode = readFileSync(filePath, 'utf-8');\n const fixes = findQuickFixes(\n currentCode,\n undefined,\n autoFixConfig,\n entry.relPath\n );\n\n if (fixes.length === 0) continue;\n\n let modifiedCode = currentCode;\n for (const fix of fixes) {\n for (const match of fix.matches) {\n try {\n modifiedCode = applyQuickFix(modifiedCode, fix, match);\n correcoesAplicadas++;\n } catch {\n }\n }\n }\n\n if (modifiedCode !== currentCode) {\n fixesPorArquivo.set(filePath, modifiedCode);\n }\n }\n\n const ocorrencias = todasOcorrencias.map(o => ({\n mensagem: typeof o.mensagem === 'string' ? o.mensagem : String(o.mensagem ?? ''),\n relPath: typeof o.relPath === 'string' ? o.relPath : String(o.relPath ?? ''),\n tipo: typeof o.tipo === 'string' ? o.tipo : undefined,\n nivel: typeof o.nivel === 'string' ? o.nivel : undefined,\n linha: typeof o.linha === 'number' ? o.linha : undefined,\n coluna: typeof o.coluna === 'number' ? o.coluna : undefined,\n sugestao: typeof o.sugestao === 'string' ? o.sugestao : undefined\n }));\n\n let autoFixResultado: FullAnalysisAutoFixResult = {\n arquivosModificados: fixesPorArquivo.size,\n correcoesAplicadas\n };\n\n if (fixesPorArquivo.size > 0) {\n for (const [filePath, newContent] of fixesPorArquivo) {\n writeFileSync(filePath, newContent, 'utf-8');\n }\n\n const octokit = await app.getInstallationOctokit(job.installationId);\n const branchName = `tutanus-fix-${Date.now()}`;\n\n execSync('git add -A', { cwd: repoDir, stdio: 'pipe' });\n execSync(\n `git commit -m \"fix: correcoes automaticas Tutanus\" -m \"Total: ${correcoesAplicadas} correcoes em ${fixesPorArquivo.size} arquivos.\"`,\n { cwd: repoDir, stdio: 'pipe' }\n );\n\n const token = await getToken(app, job.installationId);\n const repoUrl = `https://x-access-token:${token}@github.com/${job.owner}/${job.repo}.git`;\n\n execSync(\n `git push \"${repoUrl}\" HEAD:${branchName}`,\n { cwd: repoDir, stdio: 'pipe', timeout: 60000 }\n );\n\n const defaultBranch = job.ref === 'HEAD' ? (await getDefaultBranch(octokit, job.owner, job.repo)) : job.ref;\n\n const changedFiles = Array.from(fixesPorArquivo.keys())\n .map(f => `- \\`${f.replace(repoDir, '')}\\``)\n .join('\\n');\n\n const { data: pr } = await octokit.request('POST /repos/{owner}/{repo}/pulls', {\n owner: job.owner,\n repo: job.repo,\n title: 'fix: correções automáticas do Tutanus',\n head: branchName,\n base: defaultBranch,\n body: `## Correções Automáticas - Tutanus\n\n O Tutanus identificou e aplicou **${correcoesAplicadas}** correções em **${fixesPorArquivo.size}** arquivos.\n\n ### Arquivos modificados\n\n ${changedFiles}\n\n ---\n *Este PR foi gerado automaticamente pelo [Tutanus](https://github.com/anomalyco/tutanus).*`\n });\n\n autoFixResultado = {\n arquivosModificados: fixesPorArquivo.size,\n correcoesAplicadas,\n prUrl: pr.html_url,\n prNumero: pr.number,\n branchName\n };\n }\n\n atualizarJob(jobId, {\n status: 'completo',\n finalizadoEm: Date.now(),\n resultado: {\n totalArquivos,\n totalOcorrencias: ocorrencias.length,\n duracaoMs: Date.now() - inicio,\n arquivosAnalisados,\n ocorrencias,\n scoreGeral: 0,\n resumoPorTipo: {},\n resumoPorSeveridade: {},\n autoFixResultado\n }\n });\n } finally {\n cleanup();\n }\n });\n}\n\nasync function getDefaultBranch(\n octokit: Awaited<ReturnType<App['getInstallationOctokit']>>,\n owner: string,\n repo: string\n): Promise<string> {\n try {\n const { data } = await octokit.request('GET /repos/{owner}/{repo}', { owner, repo });\n return data.default_branch;\n } catch {\n return 'main';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"auto-fix-job.js","sourceRoot":"","sources":["../../../../src/app/github/jobs/auto-fix-job.ts"],"names":[],"mappings":"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","sourcesContent":["import { execSync } from 'node:child_process';\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { applyQuickFix, findQuickFixes, getAutoFixConfig } from '@core/config/auto';\nimport type { App } from '@octokit/app';\n\nimport type { FullAnalysisAutoFixResult, FullAnalysisJob } from '../../../types/github/app.js';\nimport { cloneRepo, escreverAskpassScript, limparAskpassScript } from '../app/repo-downloader.js';\nimport { executarAnaliseInterna } from './full-analysis-job.js';\nimport { atualizarJob, executarJob } from './job-manager.js';\n\nasync function getToken(app: App, installationId: number): Promise<string> {\n const { data } = await app.octokit.request('POST /app/installations/{installation_id}/access_tokens', {\n installation_id: installationId\n });\n return data.token;\n}\n\nexport async function iniciarAutoFix(\n app: App,\n jobId: string,\n job: FullAnalysisJob\n): Promise<void> {\n await executarJob(jobId, async () => {\n atualizarJob(jobId, { status: 'baixando' });\n\n const { repoDir, cleanup } = await cloneRepo(\n app,\n job.installationId,\n job.owner,\n job.repo,\n job.ref\n );\n\n try {\n atualizarJob(jobId, { status: 'analisando' });\n const inicio = Date.now();\n\n const { totalArquivos, arquivosAnalisados, todasOcorrencias, fileEntriesComAst } =\n await executarAnaliseInterna(repoDir, job.options);\n\n const autoFixOcorrencias = todasOcorrencias.filter(\n (o: { tipo?: string }) => o.tipo === 'auto-fix-disponivel' || o.tipo === 'QUICK_FIX_DISPONIVEL'\n );\n\n const autoFixConfig = getAutoFixConfig(job.options.autoFixMode || 'balanced');\n const fixesPorArquivo = new Map<string, string>();\n let correcoesAplicadas = 0;\n\n for (const ocorrencia of autoFixOcorrencias) {\n const entry = fileEntriesComAst?.find(\n (fe: { relPath: string }) => fe.relPath === ocorrencia.relPath\n );\n if (!entry) continue;\n\n const filePath = join(repoDir, entry.relPath);\n const currentCode = readFileSync(filePath, 'utf-8');\n const fixes = findQuickFixes(\n currentCode,\n undefined,\n autoFixConfig,\n entry.relPath\n );\n\n if (fixes.length === 0) continue;\n\n let modifiedCode = currentCode;\n for (const fix of fixes) {\n for (const match of fix.matches) {\n try {\n modifiedCode = applyQuickFix(modifiedCode, fix, match);\n correcoesAplicadas++;\n } catch {\n }\n }\n }\n\n if (modifiedCode !== currentCode) {\n fixesPorArquivo.set(filePath, modifiedCode);\n }\n }\n\n const ocorrencias = todasOcorrencias.map(o => ({\n mensagem: typeof o.mensagem === 'string' ? o.mensagem : String(o.mensagem ?? ''),\n relPath: typeof o.relPath === 'string' ? o.relPath : String(o.relPath ?? ''),\n tipo: typeof o.tipo === 'string' ? o.tipo : undefined,\n nivel: typeof o.nivel === 'string' ? o.nivel : undefined,\n linha: typeof o.linha === 'number' ? o.linha : undefined,\n coluna: typeof o.coluna === 'number' ? o.coluna : undefined,\n sugestao: typeof o.sugestao === 'string' ? o.sugestao : undefined\n }));\n\n let autoFixResultado: FullAnalysisAutoFixResult = {\n arquivosModificados: fixesPorArquivo.size,\n correcoesAplicadas\n };\n\n if (fixesPorArquivo.size > 0) {\n for (const [filePath, newContent] of fixesPorArquivo) {\n writeFileSync(filePath, newContent, 'utf-8');\n }\n\n const octokit = await app.getInstallationOctokit(job.installationId);\n const branchName = `tutanus-fix-${Date.now()}`;\n\n execSync('git add -A', { cwd: repoDir, stdio: 'pipe' });\n execSync(\n `git commit -m \"fix: correcoes automaticas Tutanus\" -m \"Total: ${correcoesAplicadas} correcoes em ${fixesPorArquivo.size} arquivos.\"`,\n { cwd: repoDir, stdio: 'pipe' }\n );\n\n const token = await getToken(app, job.installationId);\n const askpassScript = escreverAskpassScript();\n const repoUrl = `https://github.com/${job.owner}/${job.repo}.git`;\n\n try {\n execSync(\n `git push \"${repoUrl}\" HEAD:${branchName}`,\n {\n cwd: repoDir,\n stdio: 'pipe',\n timeout: 60000,\n env: {\n ...process.env,\n TUTANUS_GIT_TOKEN: token,\n GIT_ASKPASS: askpassScript,\n GIT_TERMINAL_PROMPT: '0'\n }\n }\n );\n } finally {\n limparAskpassScript(askpassScript);\n }\n\n const defaultBranch = job.ref === 'HEAD' ? (await getDefaultBranch(octokit, job.owner, job.repo)) : job.ref;\n\n const changedFiles = Array.from(fixesPorArquivo.keys())\n .map(f => `- \\`${f.replace(repoDir, '')}\\``)\n .join('\\n');\n\n const { data: pr } = await octokit.request('POST /repos/{owner}/{repo}/pulls', {\n owner: job.owner,\n repo: job.repo,\n title: 'fix: correções automáticas do Tutanus',\n head: branchName,\n base: defaultBranch,\n body: `## Correções Automáticas - Tutanus\n\n O Tutanus identificou e aplicou **${correcoesAplicadas}** correções em **${fixesPorArquivo.size}** arquivos.\n\n ### Arquivos modificados\n\n ${changedFiles}\n\n ---\n *Este PR foi gerado automaticamente pelo [Tutanus](https://github.com/anomalyco/tutanus).*`\n });\n\n autoFixResultado = {\n arquivosModificados: fixesPorArquivo.size,\n correcoesAplicadas,\n prUrl: pr.html_url,\n prNumero: pr.number,\n branchName\n };\n }\n\n atualizarJob(jobId, {\n status: 'completo',\n finalizadoEm: Date.now(),\n resultado: {\n totalArquivos,\n totalOcorrencias: ocorrencias.length,\n duracaoMs: Date.now() - inicio,\n arquivosAnalisados,\n ocorrencias,\n scoreGeral: 0,\n resumoPorTipo: {},\n resumoPorSeveridade: {},\n autoFixResultado\n }\n });\n } finally {\n cleanup();\n }\n });\n}\n\nasync function getDefaultBranch(\n octokit: Awaited<ReturnType<App['getInstallationOctokit']>>,\n owner: string,\n repo: string\n): Promise<string> {\n try {\n const { data } = await octokit.request('GET /repos/{owner}/{repo}', { owner, repo });\n return data.default_branch;\n } catch {\n return 'main';\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-analysis-service.d.ts","sourceRoot":"","sources":["../../../../src/app/github/push-analysis/push-analysis-service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,KAAK,EAAsB,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAa3F,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAoGnC,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"push-analysis-service.d.ts","sourceRoot":"","sources":["../../../../src/app/github/push-analysis/push-analysis-service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,KAAK,EAAsB,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAa3F,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAoGnC,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgI7F"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { execSync } from 'node:child_process';
|
|
2
2
|
import { obterConfigInstalacao } from '../app/installation-store.js';
|
|
3
|
-
import { cloneRepo, getInstallationToken } from '../app/repo-downloader.js';
|
|
3
|
+
import { cloneRepo, escreverAskpassScript, getInstallationToken, limparAskpassScript } from '../app/repo-downloader.js';
|
|
4
4
|
import { statsStore } from '../dashboard/stats-store.js';
|
|
5
5
|
import { rodarAnaliseCodigo } from './analysis-core.js';
|
|
6
6
|
import { gerarComentarioAtualizacaoRelatorio, gerarCorpoPrRelatorio, gerarResumoReviewPr, gerarTituloPrRelatorio } from './push-report.js';
|
|
@@ -115,12 +115,24 @@ export async function executarAnalisePush(app, params) {
|
|
|
115
115
|
try {
|
|
116
116
|
execSync(`git checkout -b "${headBranch}"`, { cwd: repoDir, stdio: 'pipe' });
|
|
117
117
|
const token = await getInstallationToken(app, installationId);
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
118
|
+
const askpassScript = escreverAskpassScript();
|
|
119
|
+
const repoUrl = `https://github.com/${owner}/${repo}.git`;
|
|
120
|
+
try {
|
|
121
|
+
execSync(`git push "${repoUrl}" HEAD:${headBranch}`, {
|
|
122
|
+
cwd: repoDir,
|
|
123
|
+
stdio: 'pipe',
|
|
124
|
+
timeout: 60000,
|
|
125
|
+
env: {
|
|
126
|
+
...process.env,
|
|
127
|
+
TUTANUS_GIT_TOKEN: token,
|
|
128
|
+
GIT_ASKPASS: askpassScript,
|
|
129
|
+
GIT_TERMINAL_PROMPT: '0'
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
limparAskpassScript(askpassScript);
|
|
135
|
+
}
|
|
124
136
|
}
|
|
125
137
|
finally {
|
|
126
138
|
cloneCleanup();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-analysis-service.js","sourceRoot":"","sources":["../../../../src/app/github/push-analysis/push-analysis-service.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { execSync } from 'node:child_process';\n\nimport type { App } from '@octokit/app';\n\nimport type { FullAnalysisResult, PushAnalysisParams } from '../../../types/github/app.js';\nimport { obterConfigInstalacao } from '../app/installation-store.js';\nimport { cloneRepo, getInstallationToken } from '../app/repo-downloader.js';\nimport type { OctokitInstance } from '../app/webhook-handler.js';\nimport { statsStore } from '../dashboard/stats-store.js';\nimport { rodarAnaliseCodigo } from './analysis-core.js';\nimport {\n gerarComentarioAtualizacaoRelatorio,\n gerarCorpoPrRelatorio,\n gerarResumoReviewPr,\n gerarTituloPrRelatorio\n} from './push-report.js';\n\nexport type { PushAnalysisParams };\n\nconst MAX_REVIEW_COMMENTS = 40;\nconst PREFIXOS_BRANCH_REJEITADOS = ['tutanus/analise-', 'tutanus-fix-', 'tutanus/diagnostico-'];\n\nasync function obterPrAberto(\n octokit: OctokitInstance,\n owner: string,\n repo: string,\n headBranch: string,\n baseBranch: string\n): Promise<{ number: number; headSha: string } | null> {\n const { data } = await octokit.request('GET /repos/{owner}/{repo}/pulls', {\n owner,\n repo,\n head: `${owner}:${headBranch}`,\n base: baseBranch,\n state: 'open'\n }).catch(() => ({ data: [] as Array<{ number: number; head: { sha: string } }> }));\n const pr = data[0];\n if (!pr) return null;\n return { number: pr.number, headSha: pr.head.sha };\n}\n\nasync function criarOuAtualizarPr(\n octokit: OctokitInstance,\n owner: string,\n repo: string,\n baseBranch: string,\n branchReport: string,\n body: string,\n titulo: string\n): Promise<{ number: number; headSha: string; created: boolean }> {\n const existente = await obterPrAberto(octokit, owner, repo, branchReport, baseBranch);\n if (existente) {\n return { ...existente, created: false };\n }\n const { data: pr } = await octokit.request('POST /repos/{owner}/{repo}/pulls', {\n owner,\n repo,\n title: titulo,\n head: branchReport,\n base: baseBranch,\n body,\n maintainer_can_modify: true\n });\n return { number: pr.number, headSha: pr.head.sha, created: true };\n}\n\nasync function comentarNoPr(\n octokit: OctokitInstance,\n owner: string,\n repo: string,\n prNumber: number,\n body: string\n): Promise<void> {\n await octokit.request('POST /repos/{owner}/{repo}/issues/{issue_number}/comments', {\n owner,\n repo,\n issue_number: prNumber,\n body\n });\n}\n\nasync function publicarReviewComentarios(\n octokit: OctokitInstance,\n owner: string,\n repo: string,\n prNumber: number,\n commitId: string,\n ocorrencias: FullAnalysisResult['ocorrencias']\n): Promise<void> {\n const comentarios = ocorrencias\n .filter(o => o.relPath && o.linha && o.linha > 0)\n .slice(0, MAX_REVIEW_COMMENTS)\n .map(o => ({\n path: o.relPath,\n line: o.linha as number,\n body: `**${(o.nivel || 'info').toUpperCase()}** · ${o.tipo || 'geral'}\\n\\n${o.mensagem}${\n o.sugestao ? `\\n\\n**Sugestão:** ${o.sugestao}` : ''\n }`\n }));\n\n if (comentarios.length === 0) return;\n\n try {\n await octokit.request('POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews', {\n owner,\n repo,\n pull_number: prNumber,\n commit_id: commitId,\n event: 'COMMENT',\n body: gerarResumoReviewPr(ocorrencias.length, comentarios.length),\n comments: comentarios\n });\n } catch (err) {\n console.warn('Não foi possível publicar review comments:', err instanceof Error ? err.message : err);\n }\n}\n\nexport async function executarAnalisePush(app: App, params: PushAnalysisParams): Promise<void> {\n const { installationId, owner, repo, branch, commitMessage } = params;\n let headSha = params.headSha;\n\n const config = obterConfigInstalacao(installationId);\n if (!config.pushAnalysisEnabled) return;\n\n if (PREFIXOS_BRANCH_REJEITADOS.some(p => branch.startsWith(p))) {\n return;\n }\n\n const octokit = await app.getInstallationOctokit(installationId);\n\n if (!headSha) {\n const refData = await octokit.request('GET /repos/{owner}/{repo}/git/ref/heads/{branch}', {\n owner,\n repo,\n branch\n }).catch(() => null);\n if (!refData) return;\n headSha = refData.data.object.sha;\n }\n\n const repoResp = await octokit.request('GET /repos/{owner}/{repo}', {\n owner,\n repo\n }).catch(() => null);\n const defaultBranch = repoResp?.data?.default_branch ?? 'main';\n\n const { resultado, ctx, cleanup } = await rodarAnaliseCodigo(app, {\n installationId,\n owner,\n repo,\n headSha,\n branch,\n commitMessage,\n baseSha: params.beforeSha,\n incremental: config.incrementalOnPush\n });\n\n try {\n ctx.baseRef = defaultBranch;\n const tituloPr = gerarTituloPrRelatorio(branch, resultado.scoreGeral, defaultBranch);\n const corpoPr = gerarCorpoPrRelatorio(resultado, ctx);\n\n let headBranch = branch;\n\n if (branch === defaultBranch) {\n headBranch = `tutanus/diagnostico-${branch}-${Date.now()}`;\n\n const { repoDir, cleanup: cloneCleanup } = await cloneRepo(\n app,\n installationId,\n owner,\n repo,\n branch\n );\n\n try {\n execSync(`git checkout -b \"${headBranch}\"`, { cwd: repoDir, stdio: 'pipe' });\n const token = await getInstallationToken(app, installationId);\n const repoUrl = `https://x-access-token:${token}@github.com/${owner}/${repo}.git`;\n execSync(`git push \"${repoUrl}\" HEAD:${headBranch}`, {\n cwd: repoDir,\n stdio: 'pipe',\n timeout: 60000\n });\n } finally {\n cloneCleanup();\n }\n }\n\n const prInfo = await criarOuAtualizarPr(\n octokit,\n owner,\n repo,\n defaultBranch,\n headBranch,\n corpoPr,\n tituloPr\n );\n\n if (!prInfo.created) {\n await comentarNoPr(\n octokit,\n owner,\n repo,\n prInfo.number,\n gerarComentarioAtualizacaoRelatorio(resultado, ctx)\n );\n }\n\n const { data: prHead } = await octokit.request('GET /repos/{owner}/{repo}/pulls/{pull_number}', {\n owner,\n repo,\n pull_number: prInfo.number\n });\n\n await publicarReviewComentarios(\n octokit,\n owner,\n repo,\n prInfo.number,\n prHead.head.sha,\n resultado.ocorrencias\n );\n\n statsStore.recordAnalysis({\n repository: `${owner}/${repo}`,\n event: 'push',\n score: resultado.scoreGeral,\n workflowsCount: 0,\n occurrencesCount: resultado.totalOcorrencias\n });\n } finally {\n cleanup();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"push-analysis-service.js","sourceRoot":"","sources":["../../../../src/app/github/push-analysis/push-analysis-service.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { execSync } from 'node:child_process';\n\nimport type { App } from '@octokit/app';\n\nimport type { FullAnalysisResult, PushAnalysisParams } from '../../../types/github/app.js';\nimport { obterConfigInstalacao } from '../app/installation-store.js';\nimport { cloneRepo, escreverAskpassScript, getInstallationToken, limparAskpassScript } from '../app/repo-downloader.js';\nimport type { OctokitInstance } from '../app/webhook-handler.js';\nimport { statsStore } from '../dashboard/stats-store.js';\nimport { rodarAnaliseCodigo } from './analysis-core.js';\nimport {\n gerarComentarioAtualizacaoRelatorio,\n gerarCorpoPrRelatorio,\n gerarResumoReviewPr,\n gerarTituloPrRelatorio\n} from './push-report.js';\n\nexport type { PushAnalysisParams };\n\nconst MAX_REVIEW_COMMENTS = 40;\nconst PREFIXOS_BRANCH_REJEITADOS = ['tutanus/analise-', 'tutanus-fix-', 'tutanus/diagnostico-'];\n\nasync function obterPrAberto(\n octokit: OctokitInstance,\n owner: string,\n repo: string,\n headBranch: string,\n baseBranch: string\n): Promise<{ number: number; headSha: string } | null> {\n const { data } = await octokit.request('GET /repos/{owner}/{repo}/pulls', {\n owner,\n repo,\n head: `${owner}:${headBranch}`,\n base: baseBranch,\n state: 'open'\n }).catch(() => ({ data: [] as Array<{ number: number; head: { sha: string } }> }));\n const pr = data[0];\n if (!pr) return null;\n return { number: pr.number, headSha: pr.head.sha };\n}\n\nasync function criarOuAtualizarPr(\n octokit: OctokitInstance,\n owner: string,\n repo: string,\n baseBranch: string,\n branchReport: string,\n body: string,\n titulo: string\n): Promise<{ number: number; headSha: string; created: boolean }> {\n const existente = await obterPrAberto(octokit, owner, repo, branchReport, baseBranch);\n if (existente) {\n return { ...existente, created: false };\n }\n const { data: pr } = await octokit.request('POST /repos/{owner}/{repo}/pulls', {\n owner,\n repo,\n title: titulo,\n head: branchReport,\n base: baseBranch,\n body,\n maintainer_can_modify: true\n });\n return { number: pr.number, headSha: pr.head.sha, created: true };\n}\n\nasync function comentarNoPr(\n octokit: OctokitInstance,\n owner: string,\n repo: string,\n prNumber: number,\n body: string\n): Promise<void> {\n await octokit.request('POST /repos/{owner}/{repo}/issues/{issue_number}/comments', {\n owner,\n repo,\n issue_number: prNumber,\n body\n });\n}\n\nasync function publicarReviewComentarios(\n octokit: OctokitInstance,\n owner: string,\n repo: string,\n prNumber: number,\n commitId: string,\n ocorrencias: FullAnalysisResult['ocorrencias']\n): Promise<void> {\n const comentarios = ocorrencias\n .filter(o => o.relPath && o.linha && o.linha > 0)\n .slice(0, MAX_REVIEW_COMMENTS)\n .map(o => ({\n path: o.relPath,\n line: o.linha as number,\n body: `**${(o.nivel || 'info').toUpperCase()}** · ${o.tipo || 'geral'}\\n\\n${o.mensagem}${\n o.sugestao ? `\\n\\n**Sugestão:** ${o.sugestao}` : ''\n }`\n }));\n\n if (comentarios.length === 0) return;\n\n try {\n await octokit.request('POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews', {\n owner,\n repo,\n pull_number: prNumber,\n commit_id: commitId,\n event: 'COMMENT',\n body: gerarResumoReviewPr(ocorrencias.length, comentarios.length),\n comments: comentarios\n });\n } catch (err) {\n console.warn('Não foi possível publicar review comments:', err instanceof Error ? err.message : err);\n }\n}\n\nexport async function executarAnalisePush(app: App, params: PushAnalysisParams): Promise<void> {\n const { installationId, owner, repo, branch, commitMessage } = params;\n let headSha = params.headSha;\n\n const config = obterConfigInstalacao(installationId);\n if (!config.pushAnalysisEnabled) return;\n\n if (PREFIXOS_BRANCH_REJEITADOS.some(p => branch.startsWith(p))) {\n return;\n }\n\n const octokit = await app.getInstallationOctokit(installationId);\n\n if (!headSha) {\n const refData = await octokit.request('GET /repos/{owner}/{repo}/git/ref/heads/{branch}', {\n owner,\n repo,\n branch\n }).catch(() => null);\n if (!refData) return;\n headSha = refData.data.object.sha;\n }\n\n const repoResp = await octokit.request('GET /repos/{owner}/{repo}', {\n owner,\n repo\n }).catch(() => null);\n const defaultBranch = repoResp?.data?.default_branch ?? 'main';\n\n const { resultado, ctx, cleanup } = await rodarAnaliseCodigo(app, {\n installationId,\n owner,\n repo,\n headSha,\n branch,\n commitMessage,\n baseSha: params.beforeSha,\n incremental: config.incrementalOnPush\n });\n\n try {\n ctx.baseRef = defaultBranch;\n const tituloPr = gerarTituloPrRelatorio(branch, resultado.scoreGeral, defaultBranch);\n const corpoPr = gerarCorpoPrRelatorio(resultado, ctx);\n\n let headBranch = branch;\n\n if (branch === defaultBranch) {\n headBranch = `tutanus/diagnostico-${branch}-${Date.now()}`;\n\n const { repoDir, cleanup: cloneCleanup } = await cloneRepo(\n app,\n installationId,\n owner,\n repo,\n branch\n );\n\n try {\n execSync(`git checkout -b \"${headBranch}\"`, { cwd: repoDir, stdio: 'pipe' });\n const token = await getInstallationToken(app, installationId);\n const askpassScript = escreverAskpassScript();\n const repoUrl = `https://github.com/${owner}/${repo}.git`;\n try {\n execSync(`git push \"${repoUrl}\" HEAD:${headBranch}`, {\n cwd: repoDir,\n stdio: 'pipe',\n timeout: 60000,\n env: {\n ...process.env,\n TUTANUS_GIT_TOKEN: token,\n GIT_ASKPASS: askpassScript,\n GIT_TERMINAL_PROMPT: '0'\n }\n });\n } finally {\n limparAskpassScript(askpassScript);\n }\n } finally {\n cloneCleanup();\n }\n }\n\n const prInfo = await criarOuAtualizarPr(\n octokit,\n owner,\n repo,\n defaultBranch,\n headBranch,\n corpoPr,\n tituloPr\n );\n\n if (!prInfo.created) {\n await comentarNoPr(\n octokit,\n owner,\n repo,\n prInfo.number,\n gerarComentarioAtualizacaoRelatorio(resultado, ctx)\n );\n }\n\n const { data: prHead } = await octokit.request('GET /repos/{owner}/{repo}/pulls/{pull_number}', {\n owner,\n repo,\n pull_number: prInfo.number\n });\n\n await publicarReviewComentarios(\n octokit,\n owner,\n repo,\n prInfo.number,\n prHead.head.sha,\n resultado.ocorrencias\n );\n\n statsStore.recordAnalysis({\n repository: `${owner}/${repo}`,\n event: 'push',\n score: resultado.scoreGeral,\n workflowsCount: 0,\n occurrencesCount: resultado.totalOcorrencias\n });\n } finally {\n cleanup();\n }\n}\n"]}
|
|
@@ -206,7 +206,7 @@ export function gerarCorpoPrRelatorio(resultado, ctx) {
|
|
|
206
206
|
for (const s of grupo.sugestoes) {
|
|
207
207
|
const linha = s.linha ? `:${s.linha}` : '';
|
|
208
208
|
body += `- **\`${s.relPath}${linha}\`** — ${s.mensagem}\n`;
|
|
209
|
-
body += ` >
|
|
209
|
+
body += ` > [IDEA] ${s.sugestao}\n\n`;
|
|
210
210
|
}
|
|
211
211
|
body += `</details>\n\n`;
|
|
212
212
|
}
|
|
@@ -323,7 +323,7 @@ Novo commit recebido em ${rotulo} (\`${shaCurto}\`). O relatório foi atualizado
|
|
|
323
323
|
for (const s of sugestoes.slice(0, 10)) {
|
|
324
324
|
const linha = s.linha ? `:${s.linha}` : '';
|
|
325
325
|
body += `- **\`${s.relPath}${linha}\`** — ${s.mensagem}\n`;
|
|
326
|
-
body += ` >
|
|
326
|
+
body += ` > [IDEA] ${s.sugestao}\n\n`;
|
|
327
327
|
}
|
|
328
328
|
if (sugestoes.length > 10) {
|
|
329
329
|
body += `*… e mais ${sugestoes.length - 10} sugestão(ões).*\n\n`;
|