tutanus 0.12.3 → 0.12.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/dist/analysts/azure-pipelines/corrections/correction-azure.d.ts.map +1 -1
- package/dist/analysts/azure-pipelines/corrections/correction-azure.js +2 -1
- package/dist/analysts/azure-pipelines/corrections/correction-azure.js.map +1 -1
- package/dist/analysts/circleci/corrections/correction-circleci.d.ts.map +1 -1
- package/dist/analysts/circleci/corrections/correction-circleci.js +2 -1
- package/dist/analysts/circleci/corrections/correction-circleci.js.map +1 -1
- 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/analyst-quick-fixes.d.ts.map +1 -1
- package/dist/analysts/corrections/analyst-quick-fixes.js +1 -0
- package/dist/analysts/corrections/analyst-quick-fixes.js.map +1 -1
- package/dist/analysts/corrections/analyst-scoring.d.ts.map +1 -1
- package/dist/analysts/corrections/analyst-scoring.js +1 -0
- package/dist/analysts/corrections/analyst-scoring.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/css/corrections/correction-css.d.ts.map +1 -1
- package/dist/analysts/css/corrections/correction-css.js +2 -1
- package/dist/analysts/css/corrections/correction-css.js.map +1 -1
- package/dist/analysts/css/detectors/detector-css-best-practices.d.ts.map +1 -1
- package/dist/analysts/css/detectors/detector-css-best-practices.js +11 -10
- package/dist/analysts/css/detectors/detector-css-best-practices.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/analysts/analyst-github-actions.d.ts.map +1 -1
- package/dist/analysts/github-actions/analysts/analyst-github-actions.js +10 -9
- package/dist/analysts/github-actions/analysts/analyst-github-actions.js.map +1 -1
- package/dist/analysts/github-actions/corrections/autofix-engine.d.ts.map +1 -1
- package/dist/analysts/github-actions/corrections/autofix-engine.js +3 -1
- package/dist/analysts/github-actions/corrections/autofix-engine.js.map +1 -1
- package/dist/analysts/github-actions/corrections/correction-workflow.d.ts.map +1 -1
- package/dist/analysts/github-actions/corrections/correction-workflow.js +2 -1
- package/dist/analysts/github-actions/corrections/correction-workflow.js.map +1 -1
- package/dist/analysts/github-actions/detectors/detector-dependencies-vulnerable.d.ts.map +1 -1
- package/dist/analysts/github-actions/detectors/detector-dependencies-vulnerable.js +8 -7
- package/dist/analysts/github-actions/detectors/detector-dependencies-vulnerable.js.map +1 -1
- package/dist/analysts/github-actions/detectors/detector-workflow-accessibility.d.ts.map +1 -1
- package/dist/analysts/github-actions/detectors/detector-workflow-accessibility.js +5 -4
- package/dist/analysts/github-actions/detectors/detector-workflow-accessibility.js.map +1 -1
- package/dist/analysts/github-actions/detectors/detector-workflow-security.d.ts.map +1 -1
- package/dist/analysts/github-actions/detectors/detector-workflow-security.js +21 -20
- package/dist/analysts/github-actions/detectors/detector-workflow-security.js.map +1 -1
- package/dist/analysts/github-actions/detectors/detector-workflow-trigger-unsafe.d.ts.map +1 -1
- package/dist/analysts/github-actions/detectors/detector-workflow-trigger-unsafe.js +9 -8
- package/dist/analysts/github-actions/detectors/detector-workflow-trigger-unsafe.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/gitlab-ci/analysts/analyst-gitlab-ci.d.ts.map +1 -1
- package/dist/analysts/gitlab-ci/analysts/analyst-gitlab-ci.js +2 -1
- package/dist/analysts/gitlab-ci/analysts/analyst-gitlab-ci.js.map +1 -1
- package/dist/analysts/gitlab-ci/corrections/correction-gitlab-ci.d.ts.map +1 -1
- package/dist/analysts/gitlab-ci/corrections/correction-gitlab-ci.js +2 -1
- package/dist/analysts/gitlab-ci/corrections/correction-gitlab-ci.js.map +1 -1
- package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-performance.d.ts.map +1 -1
- package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-performance.js +4 -3
- package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-performance.js.map +1 -1
- package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-security.d.ts.map +1 -1
- package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-security.js +4 -3
- package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-security.js.map +1 -1
- package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-structure.d.ts.map +1 -1
- package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-structure.js +3 -2
- package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-structure.js.map +1 -1
- package/dist/analysts/go/detectors/detector-conventions.js +4 -4
- package/dist/analysts/go/detectors/detector-conventions.js.map +1 -1
- package/dist/analysts/go/detectors/detector-errors-un-handled.js +1 -1
- package/dist/analysts/go/detectors/detector-errors-un-handled.js.map +1 -1
- package/dist/analysts/go/detectors/detector-vulnerabilities.js +3 -3
- package/dist/analysts/go/detectors/detector-vulnerabilities.js.map +1 -1
- package/dist/analysts/html/corrections/correction-html.d.ts.map +1 -1
- package/dist/analysts/html/corrections/correction-html.js +2 -1
- package/dist/analysts/html/corrections/correction-html.js.map +1 -1
- package/dist/analysts/jenkins/corrections/correction-jenkins.d.ts.map +1 -1
- package/dist/analysts/jenkins/corrections/correction-jenkins.js +2 -1
- package/dist/analysts/jenkins/corrections/correction-jenkins.js.map +1 -1
- package/dist/analysts/js-ts/analysts/analyst-todo-comments.d.ts.map +1 -1
- package/dist/analysts/js-ts/analysts/analyst-todo-comments.js +2 -1
- package/dist/analysts/js-ts/analysts/analyst-todo-comments.js.map +1 -1
- package/dist/analysts/js-ts/detectors/detector-anti-patterns-async.d.ts.map +1 -1
- package/dist/analysts/js-ts/detectors/detector-anti-patterns-async.js +3 -2
- package/dist/analysts/js-ts/detectors/detector-anti-patterns-async.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-leaks-memory.d.ts.map +1 -1
- package/dist/analysts/js-ts/detectors/detector-leaks-memory.js +4 -3
- package/dist/analysts/js-ts/detectors/detector-leaks-memory.js.map +1 -1
- package/dist/analysts/js-ts/detectors/detector-types-unsafe.d.ts.map +1 -1
- package/dist/analysts/js-ts/detectors/detector-types-unsafe.js +35 -34
- 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/python/corrections/correction-python.d.ts.map +1 -1
- package/dist/analysts/python/corrections/correction-python.js +2 -1
- package/dist/analysts/python/corrections/correction-python.js.map +1 -1
- package/dist/analysts/react/corrections/correction-react.d.ts.map +1 -1
- package/dist/analysts/react/corrections/correction-react.js +2 -1
- package/dist/analysts/react/corrections/correction-react.js.map +1 -1
- package/dist/analysts/rust/detectors/detector-conventions.js +4 -4
- package/dist/analysts/rust/detectors/detector-conventions.js.map +1 -1
- package/dist/analysts/rust/detectors/detector-errors-potential.js +4 -4
- package/dist/analysts/rust/detectors/detector-errors-potential.js.map +1 -1
- package/dist/analysts/rust/detectors/detector-unsafe.js +2 -2
- package/dist/analysts/rust/detectors/detector-unsafe.js.map +1 -1
- package/dist/analysts/scorers/scorer.js +67 -67
- package/dist/analysts/scorers/scorer.js.map +1 -1
- package/dist/analysts/shell/analysts/analyst-shell.d.ts.map +1 -1
- package/dist/analysts/shell/analysts/analyst-shell.js +17 -16
- package/dist/analysts/shell/analysts/analyst-shell.js.map +1 -1
- package/dist/analysts/shell/corrections/correction-shell.d.ts.map +1 -1
- package/dist/analysts/shell/corrections/correction-shell.js +2 -1
- package/dist/analysts/shell/corrections/correction-shell.js.map +1 -1
- package/dist/analysts/sql/corrections/correction-sql.d.ts.map +1 -1
- package/dist/analysts/sql/corrections/correction-sql.js +2 -1
- package/dist/analysts/sql/corrections/correction-sql.js.map +1 -1
- package/dist/analysts/svg/corrections/correction-svg.d.ts.map +1 -1
- package/dist/analysts/svg/corrections/correction-svg.js +2 -1
- package/dist/analysts/svg/corrections/correction-svg.js.map +1 -1
- package/dist/analysts/tailwind/corrections/correction-tailwind.d.ts.map +1 -1
- package/dist/analysts/tailwind/corrections/correction-tailwind.js +2 -1
- package/dist/analysts/tailwind/corrections/correction-tailwind.js.map +1 -1
- package/dist/analysts/xml/corrections/correction-xml.d.ts.map +1 -1
- package/dist/analysts/xml/corrections/correction-xml.js +2 -1
- package/dist/analysts/xml/corrections/correction-xml.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/app/webhook-handler.js +3 -3
- package/dist/app/github/app/webhook-handler.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/pr-analysis-service.d.ts.map +1 -1
- package/dist/app/github/push-analysis/pr-analysis-service.js +2 -1
- package/dist/app/github/push-analysis/pr-analysis-service.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 +21 -8
- package/dist/app/github/push-analysis/push-analysis-service.js.map +1 -1
- package/dist/app/github/push-analysis/push-report.js +2 -2
- package/dist/app/github/push-analysis/push-report.js.map +1 -1
- package/dist/cli/commands/command-azure.js +1 -1
- package/dist/cli/commands/command-azure.js.map +1 -1
- package/dist/cli/commands/command-circleci.js +1 -1
- package/dist/cli/commands/command-circleci.js.map +1 -1
- package/dist/cli/commands/command-convert.js.map +1 -1
- package/dist/cli/commands/command-github-actions.js +1 -1
- package/dist/cli/commands/command-github-actions.js.map +1 -1
- package/dist/cli/commands/command-gitlab-ci.js +1 -1
- package/dist/cli/commands/command-gitlab-ci.js.map +1 -1
- package/dist/cli/commands/command-jenkins.js +1 -1
- package/dist/cli/commands/command-jenkins.js.map +1 -1
- package/dist/cli/commands/command-licenses.js +4 -4
- package/dist/cli/commands/command-licenses.js.map +1 -1
- package/dist/cli/commands/command-server.d.ts.map +1 -1
- package/dist/cli/commands/command-server.js +11 -7
- package/dist/cli/commands/command-server.js.map +1 -1
- package/dist/cli/diagnostic/exporters/compliance-exporter.js +2 -2
- package/dist/cli/diagnostic/exporters/compliance-exporter.js.map +1 -1
- package/dist/cli/diagnostic/exporters/markdown-exporter.js +7 -7
- package/dist/cli/diagnostic/exporters/markdown-exporter.js.map +1 -1
- package/dist/cli/diagnostic/handlers/archetype-handler.js.map +1 -1
- package/dist/cli/diagnostic/handlers/guardian-handler.js.map +1 -1
- package/dist/cli/diagnostic/processing-diagnostic.js +1 -1
- package/dist/cli/diagnostic/processing-diagnostic.js.map +1 -1
- package/dist/core/config/auto/fix-config.js.map +1 -1
- package/dist/core/config/auto/validation.d.ts.map +1 -1
- package/dist/core/config/auto/validation.js +1 -1
- package/dist/core/config/auto/validation.js.map +1 -1
- package/dist/core/config/excludes-padrao.d.ts.map +1 -1
- package/dist/core/config/excludes-padrao.js +3 -1
- package/dist/core/config/excludes-padrao.js.map +1 -1
- package/dist/core/execution/executor.d.ts.map +1 -1
- package/dist/core/execution/executor.js +40 -41
- package/dist/core/execution/executor.js.map +1 -1
- package/dist/core/execution/inquisitor.d.ts.map +1 -1
- package/dist/core/execution/inquisitor.js +21 -20
- package/dist/core/execution/inquisitor.js.map +1 -1
- package/dist/core/execution/scanner.js.map +1 -1
- package/dist/core/messages/en/analysts/analyst-github-actions-messages.d.ts +45 -0
- package/dist/core/messages/en/analysts/analyst-github-actions-messages.d.ts.map +1 -1
- package/dist/core/messages/en/analysts/analyst-github-actions-messages.js +45 -0
- package/dist/core/messages/en/analysts/analyst-github-actions-messages.js.map +1 -1
- package/dist/core/messages/en/analysts/analyst-gitlab-ci-messages.d.ts +12 -0
- package/dist/core/messages/en/analysts/analyst-gitlab-ci-messages.d.ts.map +1 -0
- package/dist/core/messages/en/analysts/analyst-gitlab-ci-messages.js +12 -0
- package/dist/core/messages/en/analysts/analyst-gitlab-ci-messages.js.map +1 -0
- package/dist/core/messages/en/analysts/analyst-shell-messages.d.ts +19 -0
- package/dist/core/messages/en/analysts/analyst-shell-messages.d.ts.map +1 -0
- package/dist/core/messages/en/analysts/analyst-shell-messages.js +19 -0
- package/dist/core/messages/en/analysts/analyst-shell-messages.js.map +1 -0
- package/dist/core/messages/en/analysts/analyst-todo-comments-messages.d.ts +1 -0
- package/dist/core/messages/en/analysts/analyst-todo-comments-messages.d.ts.map +1 -1
- package/dist/core/messages/en/analysts/analyst-todo-comments-messages.js +2 -1
- package/dist/core/messages/en/analysts/analyst-todo-comments-messages.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-css-messages.d.ts +13 -0
- package/dist/core/messages/en/analysts/detector-css-messages.d.ts.map +1 -0
- package/dist/core/messages/en/analysts/detector-css-messages.js +13 -0
- package/dist/core/messages/en/analysts/detector-css-messages.js.map +1 -0
- 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/index.d.ts +3 -0
- package/dist/core/messages/en/analysts/index.d.ts.map +1 -1
- package/dist/core/messages/en/analysts/index.js +3 -0
- package/dist/core/messages/en/analysts/index.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/api/api-server-messages.d.ts +1 -0
- package/dist/core/messages/en/api/api-server-messages.d.ts.map +1 -1
- package/dist/core/messages/en/api/api-server-messages.js +1 -0
- package/dist/core/messages/en/api/api-server-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-server-messages.d.ts +4 -0
- package/dist/core/messages/en/cli/cli-command-server-messages.d.ts.map +1 -1
- package/dist/core/messages/en/cli/cli-command-server-messages.js +4 -0
- package/dist/core/messages/en/cli/cli-command-server-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/excecoes-messages.d.ts +1 -0
- package/dist/core/messages/en/core/excecoes-messages.d.ts.map +1 -1
- package/dist/core/messages/en/core/excecoes-messages.js +1 -0
- package/dist/core/messages/en/core/excecoes-messages.js.map +1 -1
- package/dist/core/messages/en/core/executor-extra-messages.d.ts +3 -0
- package/dist/core/messages/en/core/executor-extra-messages.d.ts.map +1 -1
- package/dist/core/messages/en/core/executor-extra-messages.js +3 -0
- package/dist/core/messages/en/core/executor-extra-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/core/plugin-messages.d.ts +18 -0
- package/dist/core/messages/en/core/plugin-messages.d.ts.map +1 -1
- package/dist/core/messages/en/core/plugin-messages.js +20 -2
- package/dist/core/messages/en/core/plugin-messages.js.map +1 -1
- package/dist/core/messages/en/github/github-webhook-messages.d.ts +2 -0
- package/dist/core/messages/en/github/github-webhook-messages.d.ts.map +1 -1
- package/dist/core/messages/en/github/github-webhook-messages.js +2 -0
- package/dist/core/messages/en/github/github-webhook-messages.js.map +1 -1
- package/dist/core/messages/en/guardian/guardian-messages.d.ts +4 -2
- package/dist/core/messages/en/guardian/guardian-messages.d.ts.map +1 -1
- package/dist/core/messages/en/guardian/guardian-messages.js +4 -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/reports/report-messages.d.ts +13 -0
- package/dist/core/messages/en/reports/report-messages.d.ts.map +1 -1
- package/dist/core/messages/en/reports/report-messages.js +14 -1
- package/dist/core/messages/en/reports/report-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/en/shared/shared-common-messages.d.ts +2 -0
- package/dist/core/messages/en/shared/shared-common-messages.d.ts.map +1 -1
- package/dist/core/messages/en/shared/shared-common-messages.js +2 -0
- package/dist/core/messages/en/shared/shared-common-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/analyst-github-actions-messages.d.ts +45 -0
- package/dist/core/messages/ja/analysts/analyst-github-actions-messages.d.ts.map +1 -1
- package/dist/core/messages/ja/analysts/analyst-github-actions-messages.js +45 -0
- package/dist/core/messages/ja/analysts/analyst-github-actions-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/analyst-gitlab-ci-messages.d.ts +12 -0
- package/dist/core/messages/ja/analysts/analyst-gitlab-ci-messages.d.ts.map +1 -0
- package/dist/core/messages/ja/analysts/analyst-gitlab-ci-messages.js +12 -0
- package/dist/core/messages/ja/analysts/analyst-gitlab-ci-messages.js.map +1 -0
- package/dist/core/messages/ja/analysts/analyst-shell-messages.d.ts +19 -0
- package/dist/core/messages/ja/analysts/analyst-shell-messages.d.ts.map +1 -0
- package/dist/core/messages/ja/analysts/analyst-shell-messages.js +19 -0
- package/dist/core/messages/ja/analysts/analyst-shell-messages.js.map +1 -0
- package/dist/core/messages/ja/analysts/analyst-todo-comments-messages.d.ts +1 -0
- package/dist/core/messages/ja/analysts/analyst-todo-comments-messages.d.ts.map +1 -1
- package/dist/core/messages/ja/analysts/analyst-todo-comments-messages.js +2 -1
- package/dist/core/messages/ja/analysts/analyst-todo-comments-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-css-messages.d.ts +13 -0
- package/dist/core/messages/ja/analysts/detector-css-messages.d.ts.map +1 -0
- package/dist/core/messages/ja/analysts/detector-css-messages.js +13 -0
- package/dist/core/messages/ja/analysts/detector-css-messages.js.map +1 -0
- 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/index.d.ts +3 -0
- package/dist/core/messages/ja/analysts/index.d.ts.map +1 -1
- package/dist/core/messages/ja/analysts/index.js +3 -0
- package/dist/core/messages/ja/analysts/index.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/api/api-server-messages.d.ts +1 -0
- package/dist/core/messages/ja/api/api-server-messages.d.ts.map +1 -1
- package/dist/core/messages/ja/api/api-server-messages.js +1 -0
- package/dist/core/messages/ja/api/api-server-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-server-messages.d.ts +4 -0
- package/dist/core/messages/ja/cli/cli-command-server-messages.d.ts.map +1 -1
- package/dist/core/messages/ja/cli/cli-command-server-messages.js +4 -0
- package/dist/core/messages/ja/cli/cli-command-server-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/excecoes-messages.d.ts +1 -0
- package/dist/core/messages/ja/core/excecoes-messages.d.ts.map +1 -1
- package/dist/core/messages/ja/core/excecoes-messages.js +1 -0
- package/dist/core/messages/ja/core/excecoes-messages.js.map +1 -1
- package/dist/core/messages/ja/core/executor-extra-messages.d.ts +3 -0
- package/dist/core/messages/ja/core/executor-extra-messages.d.ts.map +1 -1
- package/dist/core/messages/ja/core/executor-extra-messages.js +3 -0
- package/dist/core/messages/ja/core/executor-extra-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/core/plugin-messages.d.ts +18 -0
- package/dist/core/messages/ja/core/plugin-messages.d.ts.map +1 -1
- package/dist/core/messages/ja/core/plugin-messages.js +20 -2
- package/dist/core/messages/ja/core/plugin-messages.js.map +1 -1
- package/dist/core/messages/ja/github/github-webhook-messages.d.ts +2 -0
- package/dist/core/messages/ja/github/github-webhook-messages.d.ts.map +1 -1
- package/dist/core/messages/ja/github/github-webhook-messages.js +2 -0
- package/dist/core/messages/ja/github/github-webhook-messages.js.map +1 -1
- package/dist/core/messages/ja/guardian/guardian-messages.d.ts +4 -2
- package/dist/core/messages/ja/guardian/guardian-messages.d.ts.map +1 -1
- package/dist/core/messages/ja/guardian/guardian-messages.js +4 -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/reports/report-messages.d.ts +13 -0
- package/dist/core/messages/ja/reports/report-messages.d.ts.map +1 -1
- package/dist/core/messages/ja/reports/report-messages.js +14 -1
- package/dist/core/messages/ja/reports/report-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/ja/shared/shared-common-messages.d.ts +2 -0
- package/dist/core/messages/ja/shared/shared-common-messages.d.ts.map +1 -1
- package/dist/core/messages/ja/shared/shared-common-messages.js +2 -0
- package/dist/core/messages/ja/shared/shared-common-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/analyst-github-actions-messages.d.ts +45 -0
- package/dist/core/messages/pt/analysts/analyst-github-actions-messages.d.ts.map +1 -1
- package/dist/core/messages/pt/analysts/analyst-github-actions-messages.js +45 -0
- package/dist/core/messages/pt/analysts/analyst-github-actions-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/analyst-gitlab-ci-messages.d.ts +12 -0
- package/dist/core/messages/pt/analysts/analyst-gitlab-ci-messages.d.ts.map +1 -0
- package/dist/core/messages/pt/analysts/analyst-gitlab-ci-messages.js +12 -0
- package/dist/core/messages/pt/analysts/analyst-gitlab-ci-messages.js.map +1 -0
- package/dist/core/messages/pt/analysts/analyst-shell-messages.d.ts +19 -0
- package/dist/core/messages/pt/analysts/analyst-shell-messages.d.ts.map +1 -0
- package/dist/core/messages/pt/analysts/analyst-shell-messages.js +19 -0
- package/dist/core/messages/pt/analysts/analyst-shell-messages.js.map +1 -0
- package/dist/core/messages/pt/analysts/analyst-todo-comments-messages.d.ts +1 -0
- package/dist/core/messages/pt/analysts/analyst-todo-comments-messages.d.ts.map +1 -1
- package/dist/core/messages/pt/analysts/analyst-todo-comments-messages.js +2 -1
- package/dist/core/messages/pt/analysts/analyst-todo-comments-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-css-messages.d.ts +13 -0
- package/dist/core/messages/pt/analysts/detector-css-messages.d.ts.map +1 -0
- package/dist/core/messages/pt/analysts/detector-css-messages.js +13 -0
- package/dist/core/messages/pt/analysts/detector-css-messages.js.map +1 -0
- 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/index.d.ts +3 -0
- package/dist/core/messages/pt/analysts/index.d.ts.map +1 -1
- package/dist/core/messages/pt/analysts/index.js +3 -0
- package/dist/core/messages/pt/analysts/index.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/api/api-server-messages.d.ts +1 -0
- package/dist/core/messages/pt/api/api-server-messages.d.ts.map +1 -1
- package/dist/core/messages/pt/api/api-server-messages.js +1 -0
- package/dist/core/messages/pt/api/api-server-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-server-messages.d.ts +4 -0
- package/dist/core/messages/pt/cli/cli-command-server-messages.d.ts.map +1 -1
- package/dist/core/messages/pt/cli/cli-command-server-messages.js +4 -0
- package/dist/core/messages/pt/cli/cli-command-server-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/excecoes-messages.d.ts +1 -0
- package/dist/core/messages/pt/core/excecoes-messages.d.ts.map +1 -1
- package/dist/core/messages/pt/core/excecoes-messages.js +1 -0
- package/dist/core/messages/pt/core/excecoes-messages.js.map +1 -1
- package/dist/core/messages/pt/core/executor-extra-messages.d.ts +3 -0
- package/dist/core/messages/pt/core/executor-extra-messages.d.ts.map +1 -1
- package/dist/core/messages/pt/core/executor-extra-messages.js +3 -0
- package/dist/core/messages/pt/core/executor-extra-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/core/plugin-messages.d.ts +18 -0
- package/dist/core/messages/pt/core/plugin-messages.d.ts.map +1 -1
- package/dist/core/messages/pt/core/plugin-messages.js +20 -2
- package/dist/core/messages/pt/core/plugin-messages.js.map +1 -1
- package/dist/core/messages/pt/github/github-webhook-messages.d.ts +2 -0
- package/dist/core/messages/pt/github/github-webhook-messages.d.ts.map +1 -1
- package/dist/core/messages/pt/github/github-webhook-messages.js +2 -0
- package/dist/core/messages/pt/github/github-webhook-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/reports/report-messages.d.ts +13 -0
- package/dist/core/messages/pt/reports/report-messages.d.ts.map +1 -1
- package/dist/core/messages/pt/reports/report-messages.js +14 -1
- package/dist/core/messages/pt/reports/report-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/pt/shared/shared-common-messages.d.ts +2 -0
- package/dist/core/messages/pt/shared/shared-common-messages.d.ts.map +1 -1
- package/dist/core/messages/pt/shared/shared-common-messages.js +2 -0
- package/dist/core/messages/pt/shared/shared-common-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/analyst-github-actions-messages.d.ts +45 -0
- package/dist/core/messages/zh/analysts/analyst-github-actions-messages.d.ts.map +1 -1
- package/dist/core/messages/zh/analysts/analyst-github-actions-messages.js +45 -0
- package/dist/core/messages/zh/analysts/analyst-github-actions-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/analyst-gitlab-ci-messages.d.ts +12 -0
- package/dist/core/messages/zh/analysts/analyst-gitlab-ci-messages.d.ts.map +1 -0
- package/dist/core/messages/zh/analysts/analyst-gitlab-ci-messages.js +12 -0
- package/dist/core/messages/zh/analysts/analyst-gitlab-ci-messages.js.map +1 -0
- package/dist/core/messages/zh/analysts/analyst-shell-messages.d.ts +19 -0
- package/dist/core/messages/zh/analysts/analyst-shell-messages.d.ts.map +1 -0
- package/dist/core/messages/zh/analysts/analyst-shell-messages.js +19 -0
- package/dist/core/messages/zh/analysts/analyst-shell-messages.js.map +1 -0
- package/dist/core/messages/zh/analysts/analyst-todo-comments-messages.d.ts +1 -0
- package/dist/core/messages/zh/analysts/analyst-todo-comments-messages.d.ts.map +1 -1
- package/dist/core/messages/zh/analysts/analyst-todo-comments-messages.js +2 -1
- package/dist/core/messages/zh/analysts/analyst-todo-comments-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-css-messages.d.ts +13 -0
- package/dist/core/messages/zh/analysts/detector-css-messages.d.ts.map +1 -0
- package/dist/core/messages/zh/analysts/detector-css-messages.js +13 -0
- package/dist/core/messages/zh/analysts/detector-css-messages.js.map +1 -0
- 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/index.d.ts +3 -0
- package/dist/core/messages/zh/analysts/index.d.ts.map +1 -1
- package/dist/core/messages/zh/analysts/index.js +3 -0
- package/dist/core/messages/zh/analysts/index.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/api/api-server-messages.d.ts +1 -0
- package/dist/core/messages/zh/api/api-server-messages.d.ts.map +1 -1
- package/dist/core/messages/zh/api/api-server-messages.js +1 -0
- package/dist/core/messages/zh/api/api-server-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-server-messages.d.ts +4 -0
- package/dist/core/messages/zh/cli/cli-command-server-messages.d.ts.map +1 -1
- package/dist/core/messages/zh/cli/cli-command-server-messages.js +4 -0
- package/dist/core/messages/zh/cli/cli-command-server-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/excecoes-messages.d.ts +1 -0
- package/dist/core/messages/zh/core/excecoes-messages.d.ts.map +1 -1
- package/dist/core/messages/zh/core/excecoes-messages.js +1 -0
- package/dist/core/messages/zh/core/excecoes-messages.js.map +1 -1
- package/dist/core/messages/zh/core/executor-extra-messages.d.ts +3 -0
- package/dist/core/messages/zh/core/executor-extra-messages.d.ts.map +1 -1
- package/dist/core/messages/zh/core/executor-extra-messages.js +3 -0
- package/dist/core/messages/zh/core/executor-extra-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/core/plugin-messages.d.ts +18 -0
- package/dist/core/messages/zh/core/plugin-messages.d.ts.map +1 -1
- package/dist/core/messages/zh/core/plugin-messages.js +20 -2
- package/dist/core/messages/zh/core/plugin-messages.js.map +1 -1
- package/dist/core/messages/zh/github/github-webhook-messages.d.ts +2 -0
- package/dist/core/messages/zh/github/github-webhook-messages.d.ts.map +1 -1
- package/dist/core/messages/zh/github/github-webhook-messages.js +2 -0
- package/dist/core/messages/zh/github/github-webhook-messages.js.map +1 -1
- package/dist/core/messages/zh/guardian/guardian-messages.d.ts +4 -2
- package/dist/core/messages/zh/guardian/guardian-messages.d.ts.map +1 -1
- package/dist/core/messages/zh/guardian/guardian-messages.js +4 -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/reports/report-messages.d.ts +13 -0
- package/dist/core/messages/zh/reports/report-messages.d.ts.map +1 -1
- package/dist/core/messages/zh/reports/report-messages.js +14 -1
- package/dist/core/messages/zh/reports/report-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/messages/zh/shared/shared-common-messages.d.ts +2 -0
- package/dist/core/messages/zh/shared/shared-common-messages.d.ts.map +1 -1
- package/dist/core/messages/zh/shared/shared-common-messages.js +2 -0
- package/dist/core/messages/zh/shared/shared-common-messages.js.map +1 -1
- package/dist/core/parsing/parser.d.ts.map +1 -1
- package/dist/core/parsing/parser.js +6 -7
- package/dist/core/parsing/parser.js.map +1 -1
- package/dist/core/parsing/utils.d.ts +3 -3
- package/dist/core/registry/file-registry.d.ts.map +1 -1
- package/dist/core/registry/file-registry.js +3 -4
- package/dist/core/registry/file-registry.js.map +1 -1
- package/dist/core/workers/worker-executor.js +5 -3
- package/dist/core/workers/worker-executor.js.map +1 -1
- 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 +4 -4
- package/dist/reports/filter-smart.js.map +1 -1
- package/dist/reports/generator-report.js +1 -1
- package/dist/reports/generator-report.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/reports/report-structure.d.ts.map +1 -1
- package/dist/reports/report-structure.js +10 -2
- package/dist/reports/report-structure.js.map +1 -1
- package/dist/shared/plugins/init.js.map +1 -1
- package/dist/shared/validation/validation.js +1 -1
- package/dist/shared/validation/validation.js.map +1 -1
- package/out/404/index.html +1 -1
- package/out/404.html +1 -1
- package/out/__next.__PAGE__.txt +2 -2
- package/out/__next._full.txt +2 -2
- package/out/__next._head.txt +1 -1
- package/out/__next._index.txt +1 -1
- package/out/__next._tree.txt +1 -1
- package/out/_next/static/chunks/{1l-dhswmn6dl_.js → 1xfmvf0ifjmmy.js} +1 -1
- package/out/_not-found/__next._full.txt +1 -1
- package/out/_not-found/__next._head.txt +1 -1
- package/out/_not-found/__next._index.txt +1 -1
- package/out/_not-found/__next._not-found.__PAGE__.txt +1 -1
- package/out/_not-found/__next._not-found.txt +1 -1
- package/out/_not-found/__next._tree.txt +1 -1
- package/out/_not-found/index.html +1 -1
- package/out/_not-found/index.txt +1 -1
- package/out/changelog/__next._full.txt +1 -1
- package/out/changelog/__next._head.txt +1 -1
- package/out/changelog/__next._index.txt +1 -1
- package/out/changelog/__next._tree.txt +1 -1
- package/out/changelog/__next.changelog.__PAGE__.txt +1 -1
- package/out/changelog/__next.changelog.txt +1 -1
- package/out/changelog/index.html +1 -1
- package/out/changelog/index.txt +1 -1
- package/out/github/dashboard/__next._full.txt +1 -1
- package/out/github/dashboard/__next._head.txt +1 -1
- package/out/github/dashboard/__next._index.txt +1 -1
- package/out/github/dashboard/__next._tree.txt +1 -1
- package/out/github/dashboard/__next.github.dashboard.__PAGE__.txt +1 -1
- package/out/github/dashboard/__next.github.dashboard.txt +1 -1
- package/out/github/dashboard/__next.github.txt +1 -1
- package/out/github/dashboard/index.html +1 -1
- package/out/github/dashboard/index.txt +1 -1
- package/out/index.html +1 -1
- package/out/index.txt +2 -2
- package/out/privacy-policy/__next._full.txt +1 -1
- package/out/privacy-policy/__next._head.txt +1 -1
- package/out/privacy-policy/__next._index.txt +1 -1
- package/out/privacy-policy/__next._tree.txt +1 -1
- package/out/privacy-policy/__next.privacy-policy.__PAGE__.txt +1 -1
- package/out/privacy-policy/__next.privacy-policy.txt +1 -1
- package/out/privacy-policy/index.html +1 -1
- package/out/privacy-policy/index.txt +1 -1
- package/out/terms-of-use/__next._full.txt +1 -1
- package/out/terms-of-use/__next._head.txt +1 -1
- package/out/terms-of-use/__next._index.txt +1 -1
- package/out/terms-of-use/__next._tree.txt +1 -1
- package/out/terms-of-use/__next.terms-of-use.__PAGE__.txt +1 -1
- package/out/terms-of-use/__next.terms-of-use.txt +1 -1
- package/out/terms-of-use/index.html +1 -1
- package/out/terms-of-use/index.txt +1 -1
- package/package.json +11 -12
- /package/out/_next/static/{sHP-sIMshwWXMCtdszRWm → WkbNrhSUmQHl6FUQrrd3Q}/_buildManifest.js +0 -0
- /package/out/_next/static/{sHP-sIMshwWXMCtdszRWm → WkbNrhSUmQHl6FUQrrd3Q}/_clientMiddlewareManifest.js +0 -0
- /package/out/_next/static/{sHP-sIMshwWXMCtdszRWm → WkbNrhSUmQHl6FUQrrd3Q}/_ssgManifest.js +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { messages } from '../../../core/messages/index.js';
|
|
1
2
|
import { splitLines } from '../../../shared/helpers/index.js';
|
|
2
3
|
import { criarOcorrencia } from '../../../types/index.js';
|
|
3
4
|
export const detectorCssBestPractices = {
|
|
@@ -22,10 +23,10 @@ export const detectorCssBestPractices = {
|
|
|
22
23
|
ocorrencias.push(criarOcorrencia({
|
|
23
24
|
tipo: 'css-empty-rule',
|
|
24
25
|
nivel: 'info',
|
|
25
|
-
mensagem:
|
|
26
|
+
mensagem: messages.DetectorCssMensagens.emptyRule,
|
|
26
27
|
relPath,
|
|
27
28
|
linha: numeroLinha,
|
|
28
|
-
sugestao:
|
|
29
|
+
sugestao: messages.DetectorCssMensagens.emptyRuleSugestao
|
|
29
30
|
}));
|
|
30
31
|
}
|
|
31
32
|
propsInBlock.clear();
|
|
@@ -35,10 +36,10 @@ export const detectorCssBestPractices = {
|
|
|
35
36
|
ocorrencias.push(criarOcorrencia({
|
|
36
37
|
tipo: 'css-important-usage',
|
|
37
38
|
nivel: 'aviso',
|
|
38
|
-
mensagem:
|
|
39
|
+
mensagem: messages.DetectorCssMensagens.important,
|
|
39
40
|
relPath,
|
|
40
41
|
linha: numeroLinha,
|
|
41
|
-
sugestao:
|
|
42
|
+
sugestao: messages.DetectorCssMensagens.importantSugestao
|
|
42
43
|
}));
|
|
43
44
|
}
|
|
44
45
|
const propMatch = /^([a-zA-Z-]+)\s*:\s*([^;]+)?/.exec(trimmed);
|
|
@@ -49,10 +50,10 @@ export const detectorCssBestPractices = {
|
|
|
49
50
|
ocorrencias.push(criarOcorrencia({
|
|
50
51
|
tipo: 'css-duplicate-property',
|
|
51
52
|
nivel: 'aviso',
|
|
52
|
-
mensagem:
|
|
53
|
+
mensagem: messages.DetectorCssMensagens.duplicateProperty(prop),
|
|
53
54
|
relPath,
|
|
54
55
|
linha: numeroLinha,
|
|
55
|
-
sugestao:
|
|
56
|
+
sugestao: messages.DetectorCssMensagens.duplicatePropertySugestao
|
|
56
57
|
}));
|
|
57
58
|
}
|
|
58
59
|
propsInBlock.set(prop, { line: numeroLinha, value });
|
|
@@ -61,20 +62,20 @@ export const detectorCssBestPractices = {
|
|
|
61
62
|
ocorrencias.push(criarOcorrencia({
|
|
62
63
|
tipo: 'css-id-selector',
|
|
63
64
|
nivel: 'info',
|
|
64
|
-
mensagem:
|
|
65
|
+
mensagem: messages.DetectorCssMensagens.idSelector,
|
|
65
66
|
relPath,
|
|
66
67
|
linha: numeroLinha,
|
|
67
|
-
sugestao:
|
|
68
|
+
sugestao: messages.DetectorCssMensagens.idSelectorSugestao
|
|
68
69
|
}));
|
|
69
70
|
}
|
|
70
71
|
if (/\\9|\*property|_property|expression\s*\(/.test(trimmed)) {
|
|
71
72
|
ocorrencias.push(criarOcorrencia({
|
|
72
73
|
tipo: 'css-hack',
|
|
73
74
|
nivel: 'aviso',
|
|
74
|
-
mensagem:
|
|
75
|
+
mensagem: messages.DetectorCssMensagens.cssHack,
|
|
75
76
|
relPath,
|
|
76
77
|
linha: numeroLinha,
|
|
77
|
-
sugestao:
|
|
78
|
+
sugestao: messages.DetectorCssMensagens.cssHackSugestao
|
|
78
79
|
}));
|
|
79
80
|
}
|
|
80
81
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detector-css-best-practices.js","sourceRoot":"","sources":["../../../../src/analysts/css/detectors/detector-css-best-practices.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAE,eAAe,EAAE,MAAM,GAAG,CAAC;AAEpC,MAAM,CAAC,MAAM,wBAAwB,GAAa;IAChD,IAAI,EAAE,6BAA6B;IACnC,SAAS,EAAE,QAAQ;IACnB,SAAS,EAAE,uCAAuC;IAClD,IAAI,EAAE,CAAC,OAAe,EAAW,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;IACvE,OAAO,EAAE,CAAC,GAAW,EAAE,OAAe,EAAgB,EAAE;QACtD,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,MAAM,WAAW,GAAiB,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAE/B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,YAAY,GAAG,IAAI,GAAG,EAA2C,CAAC;QAExE,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9B,MAAM,WAAW,GAAG,KAAK,GAAG,CAAC,CAAC;YAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAE7B,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,KAAK,EAAE,CAAC;YACnC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;oBACzC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC;wBAC/B,IAAI,EAAE,gBAAgB;wBACtB,KAAK,EAAE,MAAM;wBACb,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"detector-css-best-practices.js","sourceRoot":"","sources":["../../../../src/analysts/css/detectors/detector-css-best-practices.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * [BUSCA] Detector de boas práticas CSS\n *\n * Detecta padrões problemáticos em CSS/SCSS/SASS:\n * - !important usage\n * - Duplicate properties\n * - Invalid properties\n * - CSS hacks\n * - Empty rules\n * - ID selectors\n */\n\nimport { messages } from '@core/messages';\nimport { splitLines } from '@shared/helpers';\n\nimport type { Analista, Ocorrencia } from '@';\nimport { criarOcorrencia } from '@';\n\nexport const detectorCssBestPractices: Analista = {\n nome: 'detector-css-best-practices',\n categoria: 'estilo',\n descricao: 'Detecta más práticas em CSS/SCSS/SASS',\n test: (relPath: string): boolean => /\\.(css|scss|sass)$/i.test(relPath),\n aplicar: (src: string, relPath: string): Ocorrencia[] => {\n if (!src) return [];\n const ocorrencias: Ocorrencia[] = [];\n const linhas = splitLines(src);\n\n let depth = 0;\n const propsInBlock = new Map<string, { line: number; value: string }>();\n\n linhas.forEach((linha, index) => {\n const numeroLinha = index + 1;\n const trimmed = linha.trim();\n\n if (trimmed.includes('{')) depth++;\n if (trimmed.includes('}')) {\n if (propsInBlock.size === 0 && depth > 0) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'css-empty-rule',\n nivel: 'info',\n mensagem: messages.DetectorCssMensagens.emptyRule,\n relPath,\n linha: numeroLinha,\n sugestao: messages.DetectorCssMensagens.emptyRuleSugestao\n }));\n }\n propsInBlock.clear();\n depth--;\n }\n\n if (/!important/.test(trimmed)) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'css-important-usage',\n nivel: 'aviso',\n mensagem: messages.DetectorCssMensagens.important,\n relPath,\n linha: numeroLinha,\n sugestao: messages.DetectorCssMensagens.importantSugestao\n }));\n }\n\n const propMatch = /^([a-zA-Z-]+)\\s*:\\s*([^;]+)?/.exec(trimmed);\n if (propMatch && depth > 0) {\n const prop = propMatch[1].toLowerCase();\n const value = (propMatch[2] || '').trim();\n\n if (propsInBlock.has(prop)) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'css-duplicate-property',\n nivel: 'aviso',\n mensagem: messages.DetectorCssMensagens.duplicateProperty(prop),\n relPath,\n linha: numeroLinha,\n sugestao: messages.DetectorCssMensagens.duplicatePropertySugestao\n }));\n }\n propsInBlock.set(prop, { line: numeroLinha, value });\n }\n\n if (/#[a-zA-Z0-9_-]+\\s*\\{/.test(trimmed)) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'css-id-selector',\n nivel: 'info',\n mensagem: messages.DetectorCssMensagens.idSelector,\n relPath,\n linha: numeroLinha,\n sugestao: messages.DetectorCssMensagens.idSelectorSugestao\n }));\n }\n\n if (/\\\\9|\\*property|_property|expression\\s*\\(/.test(trimmed)) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'css-hack',\n nivel: 'aviso',\n mensagem: messages.DetectorCssMensagens.cssHack,\n relPath,\n linha: numeroLinha,\n sugestao: messages.DetectorCssMensagens.cssHackSugestao\n }));\n }\n });\n\n return ocorrencias;\n }\n};\n"]}
|
|
@@ -214,7 +214,7 @@ export const analistaRecomendacaoArquitetura = {
|
|
|
214
214
|
nivel: 'info',
|
|
215
215
|
relPath: _relPath,
|
|
216
216
|
linha: 1,
|
|
217
|
-
mensagem:
|
|
217
|
+
mensagem: `[TARGET] Arquitetura recomendada: ${arquiteturaRecomendada} (${confianca}% confiança)`
|
|
218
218
|
}));
|
|
219
219
|
if (sinaisCleanArch.length > 0) {
|
|
220
220
|
ocorrencias.push(criarOcorrencia({
|
|
@@ -240,7 +240,7 @@ export const analistaRecomendacaoArquitetura = {
|
|
|
240
240
|
nivel: 'info',
|
|
241
241
|
relPath: _relPath,
|
|
242
242
|
linha: 1,
|
|
243
|
-
mensagem:
|
|
243
|
+
mensagem: `[IDEA] ${rec}`
|
|
244
244
|
}));
|
|
245
245
|
}
|
|
246
246
|
return ocorrencias;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detector-recommendation-architecture.js","sourceRoot":"","sources":["../../../src/analysts/detectors/detector-recommendation-architecture.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport type { Analista, ContextoExecucao, Ocorrencia } from '@';\nimport { criarOcorrencia } from '@';\n\n/**\n * Analista global que analisa o projeto completo e recomenda\n * a melhor arquitetura (Clean Architecture, Microsserviços, MVC, etc.)\n */\nexport const analistaRecomendacaoArquitetura: Analista = {\n nome: 'recomendacao-arquitetura',\n categoria: 'arquitetura',\n descricao: 'Analisa o projeto e recomenda a melhor arquitetura a ser aplicada',\n global: true,\n test: () => true,\n aplicar: async (_src: string, _relPath: string, _ast: unknown, _fullCaminho?: string, contexto?: ContextoExecucao): Promise<Ocorrencia[]> => {\n if (!contexto) return [];\n\n const ocorrencias: Ocorrencia[] = [];\n const caminhos = contexto.arquivos.map(a => a.relPath.toLowerCase());\n const conteudos = contexto.arquivos.map(a => a.content?.toLowerCase() || '');\n\n // === SINAIS PARA CLEAN ARCHITECTURE ===\n let scoreCleanArch = 0;\n const sinaisCleanArch: string[] = [];\n\n // Domain layer\n const temEntities = caminhos.some(c => c.includes('/entities/') || c.endsWith('entity.ts') || c.endsWith('entity.js'));\n const temValueObjects = caminhos.some(c => c.includes('value-object') || c.includes('value_object'));\n const temDomainServices = caminhos.some(c => c.includes('/domain/') && c.includes('service'));\n const temDomainEvents = caminhos.some(c => c.includes('domain-event') || c.includes('domain_events'));\n\n if (temEntities) { scoreCleanArch += 15; sinaisCleanArch.push('Entidades de domínio'); }\n if (temValueObjects) { scoreCleanArch += 10; sinaisCleanArch.push('Value Objects'); }\n if (temDomainServices) { scoreCleanArch += 10; sinaisCleanArch.push('Serviços de domínio'); }\n if (temDomainEvents) { scoreCleanArch += 10; sinaisCleanArch.push('Eventos de domínio'); }\n\n // Application layer\n const temUseCases = caminhos.some(c => c.includes('/use-cases') || c.includes('/usecases') || c.includes('/application/'));\n const temPorts = caminhos.some(c => c.includes('/ports/') || c.includes('/application/port'));\n const temDtos = caminhos.some(c => c.includes('/dto/') || c.endsWith('.dto.ts') || c.endsWith('.dto.js'));\n\n if (temUseCases) { scoreCleanArch += 15; sinaisCleanArch.push('Casos de uso (use-cases)'); }\n if (temPorts) { scoreCleanArch += 10; sinaisCleanArch.push('Ports'); }\n if (temDtos) { scoreCleanArch += 10; sinaisCleanArch.push('DTOs'); }\n\n // Infrastructure layer\n const temInfra = caminhos.some(c => c.includes('/infrastructure/') || c.includes('/infra/'));\n const temRepositories = caminhos.some(c => c.includes('/repositories/') || c.endsWith('.repository.ts'));\n const temGateways = caminhos.some(c => c.includes('/gateways/'));\n\n if (temInfra) { scoreCleanArch += 10; sinaisCleanArch.push('Camada de infraestrutura'); }\n if (temRepositories) { scoreCleanArch += 10; sinaisCleanArch.push('Implementações de repositório'); }\n if (temGateways) { scoreCleanArch += 5; sinaisCleanArch.push('Gateways'); }\n\n // Presentation layer\n const temControllers = caminhos.some(c => c.includes('/controllers/') || c.endsWith('.controller.ts'));\n const temPresenters = caminhos.some(c => c.includes('/presenters/') || c.endsWith('.presenter.ts'));\n\n if (temControllers) { scoreCleanArch += 10; sinaisCleanArch.push('Controllers'); }\n if (temPresenters) { scoreCleanArch += 5; sinaisCleanArch.push('Presenters'); }\n\n // DI Container\n const temDI = conteudos.some(c => c.includes('tsyringe') || c.includes('inversify') || c.includes('awilix') || c.includes('typedi'));\n if (temDI) { scoreCleanArch += 5; sinaisCleanArch.push('Container DI'); }\n\n // === SINAIS PARA ARQUITETURA DISTRIBUÍDA ===\n let scoreDistributed = 0;\n const sinaisDistributed: string[] = [];\n\n // Múltiplos serviços\n const servicosSet = new Set<string>();\n for (const c of caminhos) {\n const match = c.match(/services\\/([^/]+)/);\n if (match) servicosSet.add(match[1]);\n }\n\n if (servicosSet.size >= 2) { scoreDistributed += 20; sinaisDistributed.push(`${servicosSet.size} boundaries de serviço`); }\n else if (servicosSet.size === 1) { scoreDistributed += 10; sinaisDistributed.push('1 boundary de serviço'); }\n\n // Mensageria\n const temMensageria = caminhos.some(c =>\n c.includes('/events/') || c.includes('/messaging') || c.includes('/queues') ||\n c.includes('/consumers') || c.includes('/producers')\n );\n const temMensageriaDeps = conteudos.some(c =>\n c.includes('kafkajs') || c.includes('amqplib') || c.includes('ioredis') ||\n c.includes('bull') || c.includes('bullmq') || c.includes('nats')\n );\n\n if (temMensageria || temMensageriaDeps) { scoreDistributed += 15; sinaisDistributed.push('Mensageria'); }\n\n // API Gateway\n const temGateway = caminhos.some(c => c.includes('/gateway') || c.includes('/api-gateway'));\n if (temGateway) { scoreDistributed += 15; sinaisDistributed.push('API Gateway'); }\n\n // Service Discovery\n const temDiscovery = caminhos.some(c => c.includes('/discovery') || c.includes('consul') || c.includes('eureka'));\n if (temDiscovery) { scoreDistributed += 10; sinaisDistributed.push('Service Discovery'); }\n\n // Docker/Container\n const temDocker = caminhos.some(c => c.endsWith('dockerfile') || c.includes('docker-compose'));\n if (temDocker) { scoreDistributed += 10; sinaisDistributed.push('Docker'); }\n\n // K8s\n const temK8s = caminhos.some(c => c.includes('kubernetes') || c.includes('k8s/'));\n if (temK8s) { scoreDistributed += 10; sinaisDistributed.push('Kubernetes'); }\n\n // Event-driven patterns\n const temEventDriven = conteudos.filter(c =>\n c.includes('eventemitter') || c.includes('publish') || c.includes('subscribe') ||\n c.includes('webhook') || c.includes('observable')\n ).length > 3;\n if (temEventDriven) { scoreDistributed += 10; sinaisDistributed.push('Padrões event-driven'); }\n\n // Monitoring\n const temMonitoring = caminhos.some(c => c.includes('/health') || c.includes('/monitoring') || c.includes('/metrics'));\n if (temMonitoring) { scoreDistributed += 10; sinaisDistributed.push('Monitoramento'); }\n\n // Shared lib\n const temShared = caminhos.some(c => c.includes('/shared/') || c.includes('/common/'));\n if (temShared) { scoreDistributed += 5; sinaisDistributed.push('Biblioteca compartilhada'); }\n\n // === DECISÃO DA ARQUITETURA ===\n const totalArquivos = contexto.arquivos.length;\n const complexidadeBaixa = totalArquivos < 30;\n const temFrontend = caminhos.some(c => c.includes('/pages/') || c.includes('/components/') || c.includes('/views/'));\n\n let arquiteturaRecomendada = 'Arquitetura Simples / Monolítica';\n let melhorScore = 0;\n let confianca = 0;\n const recomendacoes: string[] = [];\n\n // Clean Architecture é recomendada para projetos com regras de negócio complexas\n if (scoreCleanArch >= 40 || (temEntities && temUseCases)) {\n if (scoreCleanArch > melhorScore) {\n arquiteturaRecomendada = 'Clean Architecture (Arquitetura Limpa)';\n melhorScore = scoreCleanArch;\n confianca = Math.min(95, scoreCleanArch + (temDI ? 10 : 0));\n }\n if (!temEntities) recomendacoes.push('Crie entidades de domínio para encapsular regras de negócio');\n if (!temUseCases) recomendacoes.push('Organize a lógica da aplicação em casos de uso (use-cases)');\n if (!temPorts) recomendacoes.push('Defina portas (ports) na camada de aplicação para inversão de dependência');\n if (!temRepositories) recomendacoes.push('Implemente o padrão Repository para abstrair persistência');\n }\n\n // Arquitetura Distribuída é recomendada para projetos com múltiplos serviços\n if (scoreDistributed >= 35 && servicosSet.size >= 1) {\n if (scoreDistributed > melhorScore) {\n arquiteturaRecomendada = 'Arquitetura Distribuída / Microsserviços';\n melhorScore = scoreDistributed;\n confianca = Math.min(95, scoreDistributed);\n }\n if (!temMensageria && !temMensageriaDeps) {\n recomendacoes.push('Adicione mensageria (Kafka, RabbitMQ) para comunicação assíncrona entre serviços');\n }\n if (!temGateway && servicosSet.size > 1) {\n recomendacoes.push('Implemente um API Gateway para rotear requisições aos serviços');\n }\n if (!temDocker) recomendacoes.push('Conteinerize os serviços com Docker');\n if (!temMonitoring) recomendacoes.push('Adicione health checks e monitoramento centralizado');\n }\n\n // MVC para projetos web tradicionais\n if (temFrontend && temControllers && !temEntities) {\n const scoreMvc = (temControllers ? 15 : 0) + (temFrontend ? 15 : 0);\n if (scoreMvc > melhorScore && !complexidadeBaixa) {\n arquiteturaRecomendada = 'MVC (Model-View-Controller)';\n melhorScore = scoreMvc;\n confianca = Math.min(80, scoreMvc + 30);\n }\n }\n\n // Se ainda não há recomendação clara, sugerir a mais adequada\n if (melhorScore === 0) {\n if (complexidadeBaixa) {\n arquiteturaRecomendada = 'Arquitetura Simples / Monolítica';\n confianca = 60;\n recomendacoes.push('Projeto de baixa complexidade - comece com uma estrutura simples');\n recomendacoes.push('Considere evoluir para Clean Architecture conforme o projeto crescer');\n } else if (temFrontend) {\n arquiteturaRecomendada = 'Arquitetura Modular';\n confianca = 50;\n recomendacoes.push('Organize o projeto em módulos por funcionalidade');\n } else {\n arquiteturaRecomendada = 'Arquitetura em Camadas';\n confianca = 50;\n recomendacoes.push('Organize o código em camadas (controllers, services, repositories)');\n }\n }\n\n // Adicionar recomendações gerais\n if (scoreCleanArch >= 20 && scoreDistributed >= 20) {\n recomendacoes.push('Projeto apresenta características híbridas - considere Clean Architecture com boundaries de microsserviços');\n }\n if (totalArquivos > 100 && servicosSet.size === 0) {\n recomendacoes.push('Projeto grande e monolítico - considere dividir em serviços menores');\n }\n\n ocorrencias.push(criarOcorrencia({\n tipo: 'recomendacao-arquitetura',\n nivel: 'info',\n relPath: _relPath,\n linha: 1,\n mensagem: `🎯 Arquitetura recomendada: ${arquiteturaRecomendada} (${confianca}% confiança)`\n }));\n\n if (sinaisCleanArch.length > 0) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'sinais-clean-arch',\n nivel: 'info',\n relPath: _relPath,\n linha: 1,\n mensagem: `Sinais de Clean Architecture: ${sinaisCleanArch.join(', ')}`\n }));\n }\n\n if (sinaisDistributed.length > 0) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'sinais-distributed-arch',\n nivel: 'info',\n relPath: _relPath,\n linha: 1,\n mensagem: `Sinais de Arquitetura Distribuída: ${sinaisDistributed.join(', ')}`\n }));\n }\n\n for (const rec of recomendacoes.slice(0, 5)) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'recomendacao-arquitetura-item',\n nivel: 'info',\n relPath: _relPath,\n linha: 1,\n mensagem: `💡 ${rec}`\n }));\n }\n\n return ocorrencias;\n }\n};\n"]}
|
|
1
|
+
{"version":3,"file":"detector-recommendation-architecture.js","sourceRoot":"","sources":["../../../src/analysts/detectors/detector-recommendation-architecture.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport type { Analista, ContextoExecucao, Ocorrencia } from '@';\nimport { criarOcorrencia } from '@';\n\n/**\n * Analista global que analisa o projeto completo e recomenda\n * a melhor arquitetura (Clean Architecture, Microsserviços, MVC, etc.)\n */\nexport const analistaRecomendacaoArquitetura: Analista = {\n nome: 'recomendacao-arquitetura',\n categoria: 'arquitetura',\n descricao: 'Analisa o projeto e recomenda a melhor arquitetura a ser aplicada',\n global: true,\n test: () => true,\n aplicar: async (_src: string, _relPath: string, _ast: unknown, _fullCaminho?: string, contexto?: ContextoExecucao): Promise<Ocorrencia[]> => {\n if (!contexto) return [];\n\n const ocorrencias: Ocorrencia[] = [];\n const caminhos = contexto.arquivos.map(a => a.relPath.toLowerCase());\n const conteudos = contexto.arquivos.map(a => a.content?.toLowerCase() || '');\n\n // === SINAIS PARA CLEAN ARCHITECTURE ===\n let scoreCleanArch = 0;\n const sinaisCleanArch: string[] = [];\n\n // Domain layer\n const temEntities = caminhos.some(c => c.includes('/entities/') || c.endsWith('entity.ts') || c.endsWith('entity.js'));\n const temValueObjects = caminhos.some(c => c.includes('value-object') || c.includes('value_object'));\n const temDomainServices = caminhos.some(c => c.includes('/domain/') && c.includes('service'));\n const temDomainEvents = caminhos.some(c => c.includes('domain-event') || c.includes('domain_events'));\n\n if (temEntities) { scoreCleanArch += 15; sinaisCleanArch.push('Entidades de domínio'); }\n if (temValueObjects) { scoreCleanArch += 10; sinaisCleanArch.push('Value Objects'); }\n if (temDomainServices) { scoreCleanArch += 10; sinaisCleanArch.push('Serviços de domínio'); }\n if (temDomainEvents) { scoreCleanArch += 10; sinaisCleanArch.push('Eventos de domínio'); }\n\n // Application layer\n const temUseCases = caminhos.some(c => c.includes('/use-cases') || c.includes('/usecases') || c.includes('/application/'));\n const temPorts = caminhos.some(c => c.includes('/ports/') || c.includes('/application/port'));\n const temDtos = caminhos.some(c => c.includes('/dto/') || c.endsWith('.dto.ts') || c.endsWith('.dto.js'));\n\n if (temUseCases) { scoreCleanArch += 15; sinaisCleanArch.push('Casos de uso (use-cases)'); }\n if (temPorts) { scoreCleanArch += 10; sinaisCleanArch.push('Ports'); }\n if (temDtos) { scoreCleanArch += 10; sinaisCleanArch.push('DTOs'); }\n\n // Infrastructure layer\n const temInfra = caminhos.some(c => c.includes('/infrastructure/') || c.includes('/infra/'));\n const temRepositories = caminhos.some(c => c.includes('/repositories/') || c.endsWith('.repository.ts'));\n const temGateways = caminhos.some(c => c.includes('/gateways/'));\n\n if (temInfra) { scoreCleanArch += 10; sinaisCleanArch.push('Camada de infraestrutura'); }\n if (temRepositories) { scoreCleanArch += 10; sinaisCleanArch.push('Implementações de repositório'); }\n if (temGateways) { scoreCleanArch += 5; sinaisCleanArch.push('Gateways'); }\n\n // Presentation layer\n const temControllers = caminhos.some(c => c.includes('/controllers/') || c.endsWith('.controller.ts'));\n const temPresenters = caminhos.some(c => c.includes('/presenters/') || c.endsWith('.presenter.ts'));\n\n if (temControllers) { scoreCleanArch += 10; sinaisCleanArch.push('Controllers'); }\n if (temPresenters) { scoreCleanArch += 5; sinaisCleanArch.push('Presenters'); }\n\n // DI Container\n const temDI = conteudos.some(c => c.includes('tsyringe') || c.includes('inversify') || c.includes('awilix') || c.includes('typedi'));\n if (temDI) { scoreCleanArch += 5; sinaisCleanArch.push('Container DI'); }\n\n // === SINAIS PARA ARQUITETURA DISTRIBUÍDA ===\n let scoreDistributed = 0;\n const sinaisDistributed: string[] = [];\n\n // Múltiplos serviços\n const servicosSet = new Set<string>();\n for (const c of caminhos) {\n const match = c.match(/services\\/([^/]+)/);\n if (match) servicosSet.add(match[1]);\n }\n\n if (servicosSet.size >= 2) { scoreDistributed += 20; sinaisDistributed.push(`${servicosSet.size} boundaries de serviço`); }\n else if (servicosSet.size === 1) { scoreDistributed += 10; sinaisDistributed.push('1 boundary de serviço'); }\n\n // Mensageria\n const temMensageria = caminhos.some(c =>\n c.includes('/events/') || c.includes('/messaging') || c.includes('/queues') ||\n c.includes('/consumers') || c.includes('/producers')\n );\n const temMensageriaDeps = conteudos.some(c =>\n c.includes('kafkajs') || c.includes('amqplib') || c.includes('ioredis') ||\n c.includes('bull') || c.includes('bullmq') || c.includes('nats')\n );\n\n if (temMensageria || temMensageriaDeps) { scoreDistributed += 15; sinaisDistributed.push('Mensageria'); }\n\n // API Gateway\n const temGateway = caminhos.some(c => c.includes('/gateway') || c.includes('/api-gateway'));\n if (temGateway) { scoreDistributed += 15; sinaisDistributed.push('API Gateway'); }\n\n // Service Discovery\n const temDiscovery = caminhos.some(c => c.includes('/discovery') || c.includes('consul') || c.includes('eureka'));\n if (temDiscovery) { scoreDistributed += 10; sinaisDistributed.push('Service Discovery'); }\n\n // Docker/Container\n const temDocker = caminhos.some(c => c.endsWith('dockerfile') || c.includes('docker-compose'));\n if (temDocker) { scoreDistributed += 10; sinaisDistributed.push('Docker'); }\n\n // K8s\n const temK8s = caminhos.some(c => c.includes('kubernetes') || c.includes('k8s/'));\n if (temK8s) { scoreDistributed += 10; sinaisDistributed.push('Kubernetes'); }\n\n // Event-driven patterns\n const temEventDriven = conteudos.filter(c =>\n c.includes('eventemitter') || c.includes('publish') || c.includes('subscribe') ||\n c.includes('webhook') || c.includes('observable')\n ).length > 3;\n if (temEventDriven) { scoreDistributed += 10; sinaisDistributed.push('Padrões event-driven'); }\n\n // Monitoring\n const temMonitoring = caminhos.some(c => c.includes('/health') || c.includes('/monitoring') || c.includes('/metrics'));\n if (temMonitoring) { scoreDistributed += 10; sinaisDistributed.push('Monitoramento'); }\n\n // Shared lib\n const temShared = caminhos.some(c => c.includes('/shared/') || c.includes('/common/'));\n if (temShared) { scoreDistributed += 5; sinaisDistributed.push('Biblioteca compartilhada'); }\n\n // === DECISÃO DA ARQUITETURA ===\n const totalArquivos = contexto.arquivos.length;\n const complexidadeBaixa = totalArquivos < 30;\n const temFrontend = caminhos.some(c => c.includes('/pages/') || c.includes('/components/') || c.includes('/views/'));\n\n let arquiteturaRecomendada = 'Arquitetura Simples / Monolítica';\n let melhorScore = 0;\n let confianca = 0;\n const recomendacoes: string[] = [];\n\n // Clean Architecture é recomendada para projetos com regras de negócio complexas\n if (scoreCleanArch >= 40 || (temEntities && temUseCases)) {\n if (scoreCleanArch > melhorScore) {\n arquiteturaRecomendada = 'Clean Architecture (Arquitetura Limpa)';\n melhorScore = scoreCleanArch;\n confianca = Math.min(95, scoreCleanArch + (temDI ? 10 : 0));\n }\n if (!temEntities) recomendacoes.push('Crie entidades de domínio para encapsular regras de negócio');\n if (!temUseCases) recomendacoes.push('Organize a lógica da aplicação em casos de uso (use-cases)');\n if (!temPorts) recomendacoes.push('Defina portas (ports) na camada de aplicação para inversão de dependência');\n if (!temRepositories) recomendacoes.push('Implemente o padrão Repository para abstrair persistência');\n }\n\n // Arquitetura Distribuída é recomendada para projetos com múltiplos serviços\n if (scoreDistributed >= 35 && servicosSet.size >= 1) {\n if (scoreDistributed > melhorScore) {\n arquiteturaRecomendada = 'Arquitetura Distribuída / Microsserviços';\n melhorScore = scoreDistributed;\n confianca = Math.min(95, scoreDistributed);\n }\n if (!temMensageria && !temMensageriaDeps) {\n recomendacoes.push('Adicione mensageria (Kafka, RabbitMQ) para comunicação assíncrona entre serviços');\n }\n if (!temGateway && servicosSet.size > 1) {\n recomendacoes.push('Implemente um API Gateway para rotear requisições aos serviços');\n }\n if (!temDocker) recomendacoes.push('Conteinerize os serviços com Docker');\n if (!temMonitoring) recomendacoes.push('Adicione health checks e monitoramento centralizado');\n }\n\n // MVC para projetos web tradicionais\n if (temFrontend && temControllers && !temEntities) {\n const scoreMvc = (temControllers ? 15 : 0) + (temFrontend ? 15 : 0);\n if (scoreMvc > melhorScore && !complexidadeBaixa) {\n arquiteturaRecomendada = 'MVC (Model-View-Controller)';\n melhorScore = scoreMvc;\n confianca = Math.min(80, scoreMvc + 30);\n }\n }\n\n // Se ainda não há recomendação clara, sugerir a mais adequada\n if (melhorScore === 0) {\n if (complexidadeBaixa) {\n arquiteturaRecomendada = 'Arquitetura Simples / Monolítica';\n confianca = 60;\n recomendacoes.push('Projeto de baixa complexidade - comece com uma estrutura simples');\n recomendacoes.push('Considere evoluir para Clean Architecture conforme o projeto crescer');\n } else if (temFrontend) {\n arquiteturaRecomendada = 'Arquitetura Modular';\n confianca = 50;\n recomendacoes.push('Organize o projeto em módulos por funcionalidade');\n } else {\n arquiteturaRecomendada = 'Arquitetura em Camadas';\n confianca = 50;\n recomendacoes.push('Organize o código em camadas (controllers, services, repositories)');\n }\n }\n\n // Adicionar recomendações gerais\n if (scoreCleanArch >= 20 && scoreDistributed >= 20) {\n recomendacoes.push('Projeto apresenta características híbridas - considere Clean Architecture com boundaries de microsserviços');\n }\n if (totalArquivos > 100 && servicosSet.size === 0) {\n recomendacoes.push('Projeto grande e monolítico - considere dividir em serviços menores');\n }\n\n ocorrencias.push(criarOcorrencia({\n tipo: 'recomendacao-arquitetura',\n nivel: 'info',\n relPath: _relPath,\n linha: 1,\n mensagem: `[TARGET] Arquitetura recomendada: ${arquiteturaRecomendada} (${confianca}% confiança)`\n }));\n\n if (sinaisCleanArch.length > 0) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'sinais-clean-arch',\n nivel: 'info',\n relPath: _relPath,\n linha: 1,\n mensagem: `Sinais de Clean Architecture: ${sinaisCleanArch.join(', ')}`\n }));\n }\n\n if (sinaisDistributed.length > 0) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'sinais-distributed-arch',\n nivel: 'info',\n relPath: _relPath,\n linha: 1,\n mensagem: `Sinais de Arquitetura Distribuída: ${sinaisDistributed.join(', ')}`\n }));\n }\n\n for (const rec of recomendacoes.slice(0, 5)) {\n ocorrencias.push(criarOcorrencia({\n tipo: 'recomendacao-arquitetura-item',\n nivel: 'info',\n relPath: _relPath,\n linha: 1,\n mensagem: `[IDEA] ${rec}`\n }));\n }\n\n return ocorrencias;\n }\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyst-github-actions.d.ts","sourceRoot":"","sources":["../../../../src/analysts/github-actions/analysts/analyst-github-actions.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAoB,cAAc,EAAgC,MAAM,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"analyst-github-actions.d.ts","sourceRoot":"","sources":["../../../../src/analysts/github-actions/analysts/analyst-github-actions.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAoB,cAAc,EAAgC,MAAM,GAAG,CAAC;AAmDlG,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAE7E;AACD,wBAAgB,4BAA4B,IAAI,cAAc,EAAE,CAE/D;AACD,eAAO,MAAM,qBAAqB,EAAE,QAuCnC,CAAC;AACF,eAAO,MAAM,2BAA2B,EAAE,QA2HzC,CAAC"}
|
|
@@ -7,6 +7,7 @@ import { detectorWorkflowSecurity } from '../detectors/detector-workflow-securit
|
|
|
7
7
|
import { detectarJobsPassivos, detectorWorkflowEstrutura } from '../detectors/detector-workflow-structure.js';
|
|
8
8
|
import { detectorWorkflowTriggerInseguro } from '../detectors/detector-workflow-trigger-unsafe.js';
|
|
9
9
|
import { isOrgVerificada } from '../detectors/org-verified.js';
|
|
10
|
+
import { messages } from '../../../core/messages/index.js';
|
|
10
11
|
let _workflowNeedsFullHistory = false;
|
|
11
12
|
const detectoresRegistrados = [];
|
|
12
13
|
export function registrarDetectorGithubActions(detector) {
|
|
@@ -68,7 +69,7 @@ export const analistaGithubActionsGlobal = {
|
|
|
68
69
|
if (!paths.some(caminho => /CODEOWNERS/i.test(caminho))) {
|
|
69
70
|
ores.push({
|
|
70
71
|
tipo: 'GITHUB_ACTIONS_CODEOWNERS_MISSING',
|
|
71
|
-
mensagem:
|
|
72
|
+
mensagem: messages.AnalistaGithubActionsMensagens.missingCodeowners,
|
|
72
73
|
relPath: '.github/',
|
|
73
74
|
linha: 0,
|
|
74
75
|
coluna: 0,
|
|
@@ -80,7 +81,7 @@ export const analistaGithubActionsGlobal = {
|
|
|
80
81
|
if (readme && !/Code of Conduct|Código de Conduta/i.test(content)) {
|
|
81
82
|
ores.push({
|
|
82
83
|
tipo: 'GITHUB_ACTIONS_DOC_GOVERNANCE_MISSING',
|
|
83
|
-
mensagem:
|
|
84
|
+
mensagem: messages.AnalistaGithubActionsMensagens.missingCodeOfConduct,
|
|
84
85
|
relPath: readme.relPath,
|
|
85
86
|
linha: 1,
|
|
86
87
|
coluna: 0,
|
|
@@ -90,7 +91,7 @@ export const analistaGithubActionsGlobal = {
|
|
|
90
91
|
if (!paths.some(caminho => /stale/i.test(caminho))) {
|
|
91
92
|
ores.push({
|
|
92
93
|
tipo: 'GITHUB_ACTIONS_STALE_BOT_MISSING',
|
|
93
|
-
mensagem:
|
|
94
|
+
mensagem: messages.AnalistaGithubActionsMensagens.missingStaleBot,
|
|
94
95
|
relPath: '.github/workflows/',
|
|
95
96
|
linha: 0,
|
|
96
97
|
coluna: 0,
|
|
@@ -100,7 +101,7 @@ export const analistaGithubActionsGlobal = {
|
|
|
100
101
|
if (!paths.some(caminho => /release|deploy/i.test(caminho))) {
|
|
101
102
|
ores.push({
|
|
102
103
|
tipo: 'GITHUB_ACTIONS_RELEASE_AUTOMATION_MISSING',
|
|
103
|
-
mensagem:
|
|
104
|
+
mensagem: messages.AnalistaGithubActionsMensagens.missingReleaseAutomation,
|
|
104
105
|
relPath: '.github/workflows/',
|
|
105
106
|
linha: 0,
|
|
106
107
|
coluna: 0,
|
|
@@ -110,7 +111,7 @@ export const analistaGithubActionsGlobal = {
|
|
|
110
111
|
if (!paths.some(caminho => /\.github\/ISSUE_TEMPLATE/i.test(caminho))) {
|
|
111
112
|
ores.push({
|
|
112
113
|
tipo: 'GITHUB_ACTIONS_ISSUE_TEMPLATES_MISSING',
|
|
113
|
-
mensagem:
|
|
114
|
+
mensagem: messages.AnalistaGithubActionsMensagens.missingIssueTemplates,
|
|
114
115
|
relPath: '.github/ISSUE_TEMPLATE/',
|
|
115
116
|
linha: 0,
|
|
116
117
|
coluna: 0,
|
|
@@ -120,7 +121,7 @@ export const analistaGithubActionsGlobal = {
|
|
|
120
121
|
if (!paths.some(caminho => /pull_request_template/i.test(caminho))) {
|
|
121
122
|
ores.push({
|
|
122
123
|
tipo: 'GITHUB_ACTIONS_PR_TEMPLATE_MISSING',
|
|
123
|
-
mensagem:
|
|
124
|
+
mensagem: messages.AnalistaGithubActionsMensagens.missingPrTemplate,
|
|
124
125
|
relPath: '.github/',
|
|
125
126
|
linha: 0,
|
|
126
127
|
coluna: 0,
|
|
@@ -132,7 +133,7 @@ export const analistaGithubActionsGlobal = {
|
|
|
132
133
|
if (!hasSemanticRelease) {
|
|
133
134
|
ores.push({
|
|
134
135
|
tipo: 'GITHUB_ACTIONS_SEMANTIC_VERSIONING_MISSING',
|
|
135
|
-
mensagem:
|
|
136
|
+
mensagem: messages.AnalistaGithubActionsMensagens.missingSemanticVersioning,
|
|
136
137
|
relPath: '.github/workflows/',
|
|
137
138
|
linha: 0,
|
|
138
139
|
coluna: 0,
|
|
@@ -142,7 +143,7 @@ export const analistaGithubActionsGlobal = {
|
|
|
142
143
|
if (!hasChangelog) {
|
|
143
144
|
ores.push({
|
|
144
145
|
tipo: 'GITHUB_ACTIONS_CHANGELOG_AUTOMATION_MISSING',
|
|
145
|
-
mensagem:
|
|
146
|
+
mensagem: messages.AnalistaGithubActionsMensagens.missingChangelogAutomation,
|
|
146
147
|
relPath: '.github/workflows/',
|
|
147
148
|
linha: 0,
|
|
148
149
|
coluna: 0,
|
|
@@ -154,7 +155,7 @@ export const analistaGithubActionsGlobal = {
|
|
|
154
155
|
if (missingLicense.length > sourceFiles.length / 2) {
|
|
155
156
|
ores.push({
|
|
156
157
|
tipo: 'GITHUB_ACTIONS_LICENSE_HEADERS_MISSING',
|
|
157
|
-
mensagem:
|
|
158
|
+
mensagem: messages.AnalistaGithubActionsMensagens.missingLicenseHeaders,
|
|
158
159
|
relPath: './',
|
|
159
160
|
linha: 0,
|
|
160
161
|
coluna: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyst-github-actions.js","sourceRoot":"","sources":["../../../../src/analysts/github-actions/analysts/analyst-github-actions.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n\n/**\n * @fileoverview Analista de qualidade para workflows do GitHub Actions (v0.6.0)\n */\n\nimport type { NodePath } from '@babel/traverse';\nimport { parseDocument } from 'yaml';\n\nimport type { Analista, ContextoExecucao, DeteccaoCustom, Ocorrencia, ProblemaWorkflow } from '@';\n\nimport { detectorDependenciasVulneraveis } from '../detectors/detector-dependencies-vulnerable.js';\nimport { detectarProblemasAcessibilidade } from '../detectors/detector-workflow-accessibility.js';\nimport { detectarProblemasCompliance } from '../detectors/detector-workflow-compliance.js';\nimport { detectorWorkflowPerformance } from '../detectors/detector-workflow-performance.js';\nimport { detectorWorkflowSecurity } from '../detectors/detector-workflow-security.js';\nimport { detectarJobsPassivos, detectorWorkflowEstrutura } from '../detectors/detector-workflow-structure.js';\nimport { detectorWorkflowTriggerInseguro } from '../detectors/detector-workflow-trigger-unsafe.js';\nimport { isOrgVerificada } from '../detectors/org-verified.js';\n\ninterface WorkflowStep {\n name?: string;\n uses?: string;\n with?: {\n path?: string;\n 'fetch-depth'?: number | string;\n 'cache-from'?: string;\n 'cache-to'?: string;\n [chave: string]: unknown;\n };\n env?: Record<string, unknown>;\n run?: string;\n}\ninterface WorkflowJob {\n name?: string;\n needs?: string | string[];\n strategy?: {\n matrix?: unknown;\n 'fail-fast'?: unknown;\n };\n container?: unknown;\n steps?: WorkflowStep[];\n}\ninterface WorkflowNode extends Record<string, unknown> {\n name?: string;\n container?: unknown;\n strategy?: {\n matrix?: unknown;\n 'fail-fast'?: unknown;\n };\n jobs?: Record<string, WorkflowJob>;\n steps?: WorkflowStep[];\n uses?: string;\n run?: string;\n}\n/** Flag global temporária (resetada a cada execução) para indicar se o workflow precisa de histórico completo do git */\nlet _workflowNeedsFullHistory = false;\n\nconst detectoresRegistrados: DeteccaoCustom[] = [];\nexport function registrarDetectorGithubActions(detector: DeteccaoCustom): void {\n detectoresRegistrados.push(detector);\n}\nexport function obterDetectoresGithubActions(): DeteccaoCustom[] {\n return [...detectoresRegistrados];\n}\nexport const analistaGithubActions: Analista = {\n nome: 'github-actions',\n categoria: 'workflows',\n descricao: 'Analista avançado de workflows do GitHub Actions com suporte a plugins',\n test: (relPath: string) => relPath.startsWith('.github/workflows/'),\n async aplicar(conteudo: string, relPath: string, _ast: unknown = null, _fc?: string, contexto?: ContextoExecucao): Promise<Ocorrencia[]> {\n const ocorrencias: Ocorrencia[] = [];\n try {\n const doc = parseDocument(conteudo);\n const workflow = doc.toJS();\n const problemas = await executarDetectoresNativos(workflow, conteudo);\n const caminhos = contexto?.arquivos.map(arquivo => arquivo.relPath) || [];\n const plugResults = await Promise.all(detectoresRegistrados.map(diretorio => Promise.resolve(diretorio.testar(workflow, {\n conteudo,\n caminhos\n })).catch(() => [])));\n const securityResults = await Promise.resolve(detectorWorkflowSecurity.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const performanceResults = await Promise.resolve(detectorWorkflowPerformance.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const estruturaResults = await Promise.resolve(detectorWorkflowEstrutura.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const depsResults = await Promise.resolve(detectorDependenciasVulneraveis.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const triggerResults = await Promise.resolve(detectorWorkflowTriggerInseguro.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const todos = [...problemas, ...plugResults.flat()];\n ocorrencias.push(...(securityResults as Ocorrencia[]), ...(performanceResults as Ocorrencia[]), ...(estruturaResults as Ocorrencia[]), ...(depsResults as Ocorrencia[]), ...(triggerResults as Ocorrencia[]));\n for (const caminho of todos) {\n ocorrencias.push({\n tipo: `GITHUB_ACTIONS_${caminho.tipo.toUpperCase().replace(/-/g, '_')}`,\n mensagem: caminho.descricao,\n relPath,\n linha: caminho.linha || 1,\n coluna: 1,\n sugestao: caminho.sugestao || '',\n nivel: caminho.severidade === 'critica' || caminho.severidade === 'alta' ? 'erro' : caminho.severidade === 'media' ? 'aviso' : 'info'\n });\n }\n } catch {\n // Basic regex fallback if YAML fails\n }\n return ocorrencias;\n }\n};\nexport const analistaGithubActionsGlobal: Analista = {\n nome: 'github-actions-global',\n categoria: 'workflows',\n descricao: 'Governança Global do GitHub',\n test: () => false,\n async aplicar(_c, _p, _a, _f, ctx?: ContextoExecucao): Promise<Ocorrencia[]> {\n if (!ctx) return [];\n const ores: Ocorrencia[] = [];\n const paths = ctx.arquivos.map(arquivo => arquivo.relPath);\n\n // CODEOWNERS\n if (!paths.some(caminho => /CODEOWNERS/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_CODEOWNERS_MISSING',\n mensagem: 'CODEOWNERS faltando',\n relPath: '.github/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // README\n const readme = ctx.arquivos?.find(arquivo => /README\\.md/i.test(arquivo.relPath ?? ''));\n const content = readme ? readme.content as string | null || '' : '';\n if (readme && !/Code of Conduct|Código de Conduta/i.test(content)) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_DOC_GOVERNANCE_MISSING',\n mensagem: 'README sem Código de Conduta',\n relPath: readme.relPath,\n linha: 1,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // Stale Bot\n if (!paths.some(caminho => /stale/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_STALE_BOT_MISSING',\n mensagem: 'Stale bot faltando',\n relPath: '.github/workflows/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // Release\n if (!paths.some(caminho => /release|deploy/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_RELEASE_AUTOMATION_MISSING',\n mensagem: 'Release automation faltando',\n relPath: '.github/workflows/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // Issue Templates\n if (!paths.some(caminho => /\\.github\\/ISSUE_TEMPLATE/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_ISSUE_TEMPLATES_MISSING',\n mensagem: 'Issue templates faltando',\n relPath: '.github/ISSUE_TEMPLATE/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // PR Template\n if (!paths.some(caminho => /pull_request_template/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_PR_TEMPLATE_MISSING',\n mensagem: 'PR template faltando',\n relPath: '.github/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // Semantic Versioning & Changelog\n const hasSemanticRelease = paths.some(caminho => /semantic-release|semrel/i.test(caminho));\n const hasChangelog = paths.some(caminho => /changelog/i.test(caminho));\n if (!hasSemanticRelease) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_SEMANTIC_VERSIONING_MISSING',\n mensagem: 'Automação de versionamento semântico não detectada',\n relPath: '.github/workflows/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n if (!hasChangelog) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_CHANGELOG_AUTOMATION_MISSING',\n mensagem: 'Automação de changelog faltando',\n relPath: '.github/workflows/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // License Headers\n const sourceFiles = ctx.arquivos.filter(arquivo => /\\.(ts|js)$/.test(arquivo.relPath));\n const missingLicense = sourceFiles.filter(arquivo => !/SPDX-License-Identifier/i.test(arquivo.content as string || ''));\n if (missingLicense.length > sourceFiles.length / 2) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_LICENSE_HEADERS_MISSING',\n mensagem: 'Muitos arquivos sem cabeçalho de licença (SPDX)',\n relPath: './',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n return ores;\n }\n};\n/**\n * Verifica se o workflow contém comandos git que exigem histórico completo.\n */\nfunction workflowRequerHistoricoCompleto(wf: WorkflowNode, raw: string): boolean {\n // Verificar no raw por comandos git conhecidos que precisam de histórico completo\n const gitCommandsQuePrecisamDeHistorico = /\\b(git\\s+(rev-parse|tag|describe|log|shortlog|diff|bisect|blame)|git\\s+checkout\\s+-b|git\\s+fetch\\s+--unshallow|git\\s+clone\\s+--depth)/gi;\n if (gitCommandsQuePrecisamDeHistorico.test(raw)) {\n return true;\n }\n\n // Verificar nas ações steps por comandos que indicam necessidade de histórico\n const jobs = wf?.jobs ? Object.values(wf.jobs) : [];\n const allSteps = jobs.flatMap(job => job?.steps || []);\n for (const step of allSteps) {\n if (step?.run && gitCommandsQuePrecisamDeHistorico.test(step.run)) {\n return true;\n }\n }\n\n return false;\n}\n\nasync function executarDetectoresNativos(wf: unknown, raw: string): Promise<ProblemaWorkflow[]> {\n const probs: ProblemaWorkflow[] = [];\n if (!wf) return probs;\n\n _workflowNeedsFullHistory = workflowRequerHistoricoCompleto(wf as WorkflowNode, raw);\n\n // Handle various snippet styles for tests\n const candidates = Array.isArray(wf) ? wf : [wf];\n for (const item of candidates) {\n if (typeof item === 'object' && item !== null) {\n analisarEstrutura(item as WorkflowNode, probs);\n }\n }\n\n // Compliance checks\n probs.push(...detectarProblemasCompliance(wf, raw));\n\n // Accessibility checks\n probs.push(...detectarProblemasAcessibilidade(wf));\n\n // Passive jobs check\n if (typeof wf === 'object' && 'jobs' in wf) {\n const wfJobs = (wf as {\n jobs?: Record<string, {\n steps?: Array<{\n uses?: string;\n run?: string;\n }>;\n }>;\n }).jobs;\n if (wfJobs) {\n for (const [, job] of Object.entries(wfJobs)) {\n if (detectarJobsPassivos(job as {\n steps?: Array<{\n uses?: string;\n run?: string;\n }>;\n })) {\n probs.push({\n tipo: 'job-passivo-workflow',\n descricao: 'Job passivo detectado',\n severidade: 'baixa'\n });\n }\n }\n }\n }\n\n // Final check for raw string patterns (like sudo)\n if (/sudo\\s+/.test(raw)) {\n probs.push({\n tipo: 'uso-sudo',\n descricao: 'Uso de sudo detectado',\n severidade: 'alta'\n });\n }\n if (raw.includes('pull_request_target:')) {\n probs.push({\n tipo: 'estrutura-workflow',\n descricao: 'Uso de pull_request_target',\n severidade: 'alta'\n });\n }\n return probs;\n}\nfunction analisarEstrutura(wf: WorkflowNode, probs: ProblemaWorkflow[]) {\n // Workflow sem nome\n if (!wf.name) {\n probs.push({\n tipo: 'workflow-sem-nome',\n descricao: 'Workflow sem nome definido',\n severidade: 'baixa'\n });\n }\n\n // Container (Root level for snippets)\n if (wf.container && typeof wf.container === 'string') {\n probs.push({\n tipo: 'container-sem-user',\n descricao: 'Container sem user',\n severidade: 'media'\n });\n }\n\n // Strategy\n if (wf.strategy?.matrix && wf.strategy['fail-fast'] === undefined) {\n probs.push({\n tipo: 'matrix-sem-fail-fast',\n descricao: 'Matrix sem fail-fast',\n severidade: 'baixa'\n });\n }\n\n // Detect Secrets in generic maps (for environment snippets in tests)\n for (const [chave, valor] of Object.entries(wf)) {\n if (/(KEY|TOKEN|SECRET|PASSWORD)/i.test(chave) && valor && typeof valor !== 'object' && !String(valor).includes('${{')) {\n probs.push({\n tipo: 'env-sensivel',\n descricao: `Secret hardcoded em ${chave}`,\n severidade: 'critica'\n });\n }\n }\n\n // Jobs\n if (wf.jobs) {\n const jobEntries = Object.entries(wf.jobs);\n for (const [id, job] of jobEntries) {\n if (job?.strategy?.matrix && job.strategy['fail-fast'] === undefined) {\n probs.push({\n tipo: 'matrix-sem-fail-fast',\n descricao: `Job ${id} sem fail-fast`,\n severidade: 'baixa'\n });\n }\n if (job?.container && typeof job.container === 'string') {\n probs.push({\n tipo: 'container-sem-user',\n descricao: 'Container rodando como root',\n severidade: 'media'\n });\n }\n\n // --- v0.4.5: Job sem nome descritivo ---\n if (/^(job\\d+|step\\d+|build\\d*|test\\d*|j\\d+)$/i.test(id) && !job?.name) {\n probs.push({\n tipo: 'job-sem-nome',\n descricao: `Job '${id}' usa ID genérico sem campo 'name'`,\n severidade: 'baixa',\n sugestao: 'Usar nomes semânticos como build-backend, test-integration'\n });\n }\n if (job?.steps) {\n for (const string of job.steps) analisarStep(string, probs);\n\n // --- v0.4.5: Steps sem nome ---\n analisarStepsSemNome(job.steps, probs);\n\n // --- v0.7.0: Jobs muito longos ---\n if (job.steps.length > 15) {\n probs.push({\n tipo: 'job-longo',\n descricao: `Job '${id}' possui ${job.steps.length} steps, o que dificulta a manutenção`,\n severidade: 'baixa',\n sugestao: 'Considere quebrar em jobs menores ou usar composite actions'\n });\n }\n }\n }\n\n // --- v0.4.5: Build sem parallelismo ---\n analisarParalelismo(jobEntries, probs);\n\n // --- v0.4.5: Download desnecessário de artifacts ---\n analisarDownloadArtifacts(jobEntries, probs);\n\n // --- v0.4.5: Múltiplas instalações de dependências ---\n analisarMultiplasInstalacoesDeps(jobEntries, probs);\n }\n\n // Se forem passos diretos na raiz (snippet)\n if (wf.steps && Array.isArray(wf.steps)) {\n for (const string of wf.steps) analisarStep(string, probs);\n analisarStepsSemNome(wf.steps, probs);\n }\n\n // Direct steps (if snippet is a list)\n if (wf.uses || wf.run) analisarStep(wf as WorkflowStep, probs);\n}\nfunction analisarStep(string: WorkflowStep, probs: ProblemaWorkflow[]) {\n if (!string) return;\n // Pinning - only for non-verified orgs\n if (string.uses && /@v\\d+/.test(string.uses)) {\n const actionRef = string.uses.split('@')[0];\n if (!isOrgVerificada(actionRef)) {\n probs.push({\n tipo: 'falta-sha-pinning',\n descricao: 'Pinning por SHA faltando',\n severidade: 'media'\n });\n }\n }\n // Upload\n if (string.uses?.includes('upload-artifact') && string.with?.path?.includes('.env')) {\n probs.push({\n tipo: 'upload-sensivel',\n descricao: 'Upload de .env',\n severidade: 'critica'\n });\n }\n // Env\n if (string.env) {\n for (const [chave, valor] of Object.entries(string.env)) {\n if (/(KEY|TOKEN|SECRET|PASSWORD)/i.test(chave) && valor && typeof valor !== 'object' && !String(valor).includes('${{')) {\n probs.push({\n tipo: 'env-sensivel',\n descricao: `Env ${chave} hardcoded`,\n severidade: 'critica'\n });\n }\n }\n }\n // Injection\n if (string.run && /\\$\\{\\{\\s*github\\.event\\./.test(string.run)) {\n probs.push({\n tipo: 'script-injection',\n descricao: 'Script injection',\n severidade: 'alta'\n });\n }\n\n // --- v0.4.5: Docker build sem layer caching ---\n if (string.uses && /docker\\/build-push-action/.test(string.uses)) {\n const hasCacheFrom = string.with?.['cache-from'] !== undefined;\n const hasCacheTo = string.with?.['cache-to'] !== undefined;\n if (!hasCacheFrom && !hasCacheTo) {\n probs.push({\n tipo: 'docker-sem-layer-cache',\n descricao: 'Docker build sem cache de layers configurado',\n severidade: 'media',\n sugestao: 'Adicionar cache-from e cache-to para otimizar builds Docker'\n });\n }\n }\n\n // --- v0.4.5: Checkout com fetch-depth: 0 desnecessário ---\n if (string.uses && /actions\\/checkout/.test(string.uses) && string.with) {\n const fd = string.with['fetch-depth'];\n if (fd === 0 || fd === '0') {\n // Não emitir se já foi identificado que o workflow precisa de histórico completo\n if (!_workflowNeedsFullHistory) {\n probs.push({\n tipo: 'fetch-depth-desnecessario',\n descricao: 'checkout com fetch-depth: 0 baixa todo o histórico do repositório',\n severidade: 'baixa',\n sugestao: 'Usar fetch-depth: 1 (default) a menos que precise do histórico completo para tags/changelog'\n });\n }\n }\n }\n}\n\nconst ACTIONS_AUTO_EXPLICATIVAS = [\n 'actions/checkout',\n 'actions/setup-node',\n 'actions/setup-python',\n 'actions/setup-java',\n 'actions/setup-go',\n 'actions/setup-dotnet',\n 'actions/setup-ruby',\n 'actions/upload-artifact',\n 'actions/download-artifact',\n 'actions/cache',\n 'actions/stale',\n 'actions/labeler',\n 'actions/dependency-review',\n 'actions/attest-build-provenance',\n 'docker/login-action',\n 'docker/build-push-action',\n 'docker/metadata-action',\n 'docker/setup-buildx-action',\n 'docker/setup-qemu-action',\n 'azure/login',\n 'azure/webapps-deploy',\n 'aws-actions/configure-aws-credentials',\n 'google-github-actions/auth',\n 'github/codeql-action/init',\n 'github/codeql-action/analyze',\n 'github/codeql-action/autobuild',\n 'softprops/action-gh-release',\n 'cypress-io/github-action',\n];\n\n/**\n * v0.4.5: Detecta steps sem campo 'name'\n * Não reporta para actions bem conhecidas e auto-explicativas\n */\nfunction analisarStepsSemNome(steps: WorkflowStep[], probs: ProblemaWorkflow[]) {\n for (const string of steps) {\n if (!string || string.name) continue;\n if (string.uses || string.run) {\n // Pular actions auto-explicativas (não precisam de name)\n if (string.uses && ACTIONS_AUTO_EXPLICATIVAS.some(action => string.uses?.startsWith(action))) {\n continue;\n }\n const ident = string.uses ? `uses: ${string.uses}` : 'run command';\n probs.push({\n tipo: 'step-sem-nome',\n descricao: `Step sem campo 'name' (${ident})`,\n severidade: 'baixa',\n sugestao: 'Adicionar campo name: para melhor legibilidade nos logs do Actions'\n });\n }\n }\n}\n\n/**\n * v0.4.5: Detecta jobs que poderiam rodar em paralelo mas têm 'needs' desnecessário\n * Heurística: se todos os jobs têm 'needs' formando uma cadeia linear, sugere paralelismo\n * Exceção: workflows de release/deploy são intrinsecamente sequenciais\n */\nfunction analisarParalelismo(jobEntries: [string, WorkflowJob][], probs: ProblemaWorkflow[]) {\n if (jobEntries.length < 3) return;\n\n // Check if this is a release/deploy workflow (sequential by nature)\n const workflowName = jobEntries[0]?.[1]?.name?.toLowerCase() || '';\n const jobNames = jobEntries.map(([, j]) => j?.name?.toLowerCase() || '').join(' ');\n const isReleaseWorkflow = /release|deploy|publish|ship/i.test(workflowName) || /release|deploy|publish|ship/i.test(jobNames);\n if (isReleaseWorkflow) return;\n\n let totalWithNeeds = 0;\n for (const [, job] of jobEntries) {\n if (job?.needs) totalWithNeeds++;\n }\n\n // Se todos os jobs (exceto o primeiro) dependem do anterior em cadeia linear\n if (totalWithNeeds === jobEntries.length - 1) {\n probs.push({\n tipo: 'build-sem-parallelismo',\n descricao: 'Todos os jobs estão em cadeia linear - considere paralelizar jobs independentes',\n severidade: 'media',\n sugestao: 'Remover dependências (needs) desnecessárias para permitir execução paralela'\n });\n }\n}\n\n/**\n * v0.4.5: Detecta múltiplos download-artifact em jobs diferentes\n */\nfunction analisarDownloadArtifacts(jobEntries: [string, WorkflowJob][], probs: ProblemaWorkflow[]) {\n let downloadCount = 0;\n for (const [, job] of jobEntries) {\n if (!job?.steps) continue;\n for (const string of job.steps) {\n if (string.uses && /download-artifact/.test(string.uses)) downloadCount++;\n }\n }\n if (downloadCount >= 3) {\n probs.push({\n tipo: 'download-artifacts-desnecessario',\n descricao: `${downloadCount} download-artifact encontrados - considere consolidar artifacts`,\n severidade: 'baixa',\n sugestao: 'Consolidar artifacts ou usar cache compartilhado'\n });\n }\n}\n\n/**\n * v0.4.5: Detecta npm ci/npm install em múltiplos jobs sem cache compartilhado\n */\nfunction analisarMultiplasInstalacoesDeps(jobEntries: [string, WorkflowJob][], probs: ProblemaWorkflow[]) {\n let installCount = 0;\n let hasCacheStep = false;\n let hasSetupNodeWithCache = false;\n for (const [, job] of jobEntries) {\n if (!job?.steps) continue;\n let jobHasInstall = false;\n for (const string of job.steps) {\n if (string.run && /\\b(npm\\s+(ci|install)|yarn\\s+install|pnpm\\s+install)\\b/.test(string.run)) {\n jobHasInstall = true;\n }\n if (string.uses && /actions\\/cache/.test(string.uses)) {\n hasCacheStep = true;\n }\n if (string.uses && /actions\\/setup-node/.test(string.uses) && string.with?.cache) {\n hasSetupNodeWithCache = true;\n }\n }\n if (jobHasInstall) installCount++;\n }\n if (installCount >= 2 && !hasCacheStep && !hasSetupNodeWithCache) {\n probs.push({\n tipo: 'multiplas-instalacoes-deps',\n descricao: `Instalação de dependências em ${installCount} jobs sem cache compartilhado`,\n severidade: 'media',\n sugestao: 'Usar actions/cache ou artifact de node_modules para evitar instalações duplicadas'\n });\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"analyst-github-actions.js","sourceRoot":"","sources":["../../../../src/analysts/github-actions/analysts/analyst-github-actions.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n\n/**\n * @fileoverview Analista de qualidade para workflows do GitHub Actions (v0.6.0)\n */\n\nimport type { NodePath } from '@babel/traverse';\nimport { parseDocument } from 'yaml';\n\nimport type { Analista, ContextoExecucao, DeteccaoCustom, Ocorrencia, ProblemaWorkflow } from '@';\n\nimport { detectorDependenciasVulneraveis } from '../detectors/detector-dependencies-vulnerable.js';\nimport { detectarProblemasAcessibilidade } from '../detectors/detector-workflow-accessibility.js';\nimport { detectarProblemasCompliance } from '../detectors/detector-workflow-compliance.js';\nimport { detectorWorkflowPerformance } from '../detectors/detector-workflow-performance.js';\nimport { detectorWorkflowSecurity } from '../detectors/detector-workflow-security.js';\nimport { detectarJobsPassivos, detectorWorkflowEstrutura } from '../detectors/detector-workflow-structure.js';\nimport { detectorWorkflowTriggerInseguro } from '../detectors/detector-workflow-trigger-unsafe.js';\nimport { isOrgVerificada } from '../detectors/org-verified.js';\nimport { messages } from '@core/messages';\n\ninterface WorkflowStep {\n name?: string;\n uses?: string;\n with?: {\n path?: string;\n 'fetch-depth'?: number | string;\n 'cache-from'?: string;\n 'cache-to'?: string;\n [chave: string]: unknown;\n };\n env?: Record<string, unknown>;\n run?: string;\n}\ninterface WorkflowJob {\n name?: string;\n needs?: string | string[];\n strategy?: {\n matrix?: unknown;\n 'fail-fast'?: unknown;\n };\n container?: unknown;\n steps?: WorkflowStep[];\n}\ninterface WorkflowNode extends Record<string, unknown> {\n name?: string;\n container?: unknown;\n strategy?: {\n matrix?: unknown;\n 'fail-fast'?: unknown;\n };\n jobs?: Record<string, WorkflowJob>;\n steps?: WorkflowStep[];\n uses?: string;\n run?: string;\n}\n/** Flag global temporária (resetada a cada execução) para indicar se o workflow precisa de histórico completo do git */\nlet _workflowNeedsFullHistory = false;\n\nconst detectoresRegistrados: DeteccaoCustom[] = [];\nexport function registrarDetectorGithubActions(detector: DeteccaoCustom): void {\n detectoresRegistrados.push(detector);\n}\nexport function obterDetectoresGithubActions(): DeteccaoCustom[] {\n return [...detectoresRegistrados];\n}\nexport const analistaGithubActions: Analista = {\n nome: 'github-actions',\n categoria: 'workflows',\n descricao: 'Analista avançado de workflows do GitHub Actions com suporte a plugins',\n test: (relPath: string) => relPath.startsWith('.github/workflows/'),\n async aplicar(conteudo: string, relPath: string, _ast: unknown = null, _fc?: string, contexto?: ContextoExecucao): Promise<Ocorrencia[]> {\n const ocorrencias: Ocorrencia[] = [];\n try {\n const doc = parseDocument(conteudo);\n const workflow = doc.toJS();\n const problemas = await executarDetectoresNativos(workflow, conteudo);\n const caminhos = contexto?.arquivos.map(arquivo => arquivo.relPath) || [];\n const plugResults = await Promise.all(detectoresRegistrados.map(diretorio => Promise.resolve(diretorio.testar(workflow, {\n conteudo,\n caminhos\n })).catch(() => [])));\n const securityResults = await Promise.resolve(detectorWorkflowSecurity.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const performanceResults = await Promise.resolve(detectorWorkflowPerformance.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const estruturaResults = await Promise.resolve(detectorWorkflowEstrutura.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const depsResults = await Promise.resolve(detectorDependenciasVulneraveis.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const triggerResults = await Promise.resolve(detectorWorkflowTriggerInseguro.aplicar(conteudo, relPath, _ast as NodePath | null, _fc, contexto));\n const todos = [...problemas, ...plugResults.flat()];\n ocorrencias.push(...(securityResults as Ocorrencia[]), ...(performanceResults as Ocorrencia[]), ...(estruturaResults as Ocorrencia[]), ...(depsResults as Ocorrencia[]), ...(triggerResults as Ocorrencia[]));\n for (const caminho of todos) {\n ocorrencias.push({\n tipo: `GITHUB_ACTIONS_${caminho.tipo.toUpperCase().replace(/-/g, '_')}`,\n mensagem: caminho.descricao,\n relPath,\n linha: caminho.linha || 1,\n coluna: 1,\n sugestao: caminho.sugestao || '',\n nivel: caminho.severidade === 'critica' || caminho.severidade === 'alta' ? 'erro' : caminho.severidade === 'media' ? 'aviso' : 'info'\n });\n }\n } catch {\n // Basic regex fallback if YAML fails\n }\n return ocorrencias;\n }\n};\nexport const analistaGithubActionsGlobal: Analista = {\n nome: 'github-actions-global',\n categoria: 'workflows',\n descricao: 'Governança Global do GitHub',\n test: () => false,\n async aplicar(_c, _p, _a, _f, ctx?: ContextoExecucao): Promise<Ocorrencia[]> {\n if (!ctx) return [];\n const ores: Ocorrencia[] = [];\n const paths = ctx.arquivos.map(arquivo => arquivo.relPath);\n\n // CODEOWNERS\n if (!paths.some(caminho => /CODEOWNERS/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_CODEOWNERS_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingCodeowners,\n relPath: '.github/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // README\n const readme = ctx.arquivos?.find(arquivo => /README\\.md/i.test(arquivo.relPath ?? ''));\n const content = readme ? readme.content as string | null || '' : '';\n if (readme && !/Code of Conduct|Código de Conduta/i.test(content)) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_DOC_GOVERNANCE_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingCodeOfConduct,\n relPath: readme.relPath,\n linha: 1,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // Stale Bot\n if (!paths.some(caminho => /stale/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_STALE_BOT_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingStaleBot,\n relPath: '.github/workflows/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // Release\n if (!paths.some(caminho => /release|deploy/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_RELEASE_AUTOMATION_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingReleaseAutomation,\n relPath: '.github/workflows/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // Issue Templates\n if (!paths.some(caminho => /\\.github\\/ISSUE_TEMPLATE/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_ISSUE_TEMPLATES_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingIssueTemplates,\n relPath: '.github/ISSUE_TEMPLATE/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // PR Template\n if (!paths.some(caminho => /pull_request_template/i.test(caminho))) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_PR_TEMPLATE_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingPrTemplate,\n relPath: '.github/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // Semantic Versioning & Changelog\n const hasSemanticRelease = paths.some(caminho => /semantic-release|semrel/i.test(caminho));\n const hasChangelog = paths.some(caminho => /changelog/i.test(caminho));\n if (!hasSemanticRelease) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_SEMANTIC_VERSIONING_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingSemanticVersioning,\n relPath: '.github/workflows/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n if (!hasChangelog) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_CHANGELOG_AUTOMATION_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingChangelogAutomation,\n relPath: '.github/workflows/',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n\n // License Headers\n const sourceFiles = ctx.arquivos.filter(arquivo => /\\.(ts|js)$/.test(arquivo.relPath));\n const missingLicense = sourceFiles.filter(arquivo => !/SPDX-License-Identifier/i.test(arquivo.content as string || ''));\n if (missingLicense.length > sourceFiles.length / 2) {\n ores.push({\n tipo: 'GITHUB_ACTIONS_LICENSE_HEADERS_MISSING',\n mensagem: messages.AnalistaGithubActionsMensagens.missingLicenseHeaders,\n relPath: './',\n linha: 0,\n coluna: 0,\n nivel: 'info'\n });\n }\n return ores;\n }\n};\n/**\n * Verifica se o workflow contém comandos git que exigem histórico completo.\n */\nfunction workflowRequerHistoricoCompleto(wf: WorkflowNode, raw: string): boolean {\n // Verificar no raw por comandos git conhecidos que precisam de histórico completo\n const gitCommandsQuePrecisamDeHistorico = /\\b(git\\s+(rev-parse|tag|describe|log|shortlog|diff|bisect|blame)|git\\s+checkout\\s+-b|git\\s+fetch\\s+--unshallow|git\\s+clone\\s+--depth)/gi;\n if (gitCommandsQuePrecisamDeHistorico.test(raw)) {\n return true;\n }\n\n // Verificar nas ações steps por comandos que indicam necessidade de histórico\n const jobs = wf?.jobs ? Object.values(wf.jobs) : [];\n const allSteps = jobs.flatMap(job => job?.steps || []);\n for (const step of allSteps) {\n if (step?.run && gitCommandsQuePrecisamDeHistorico.test(step.run)) {\n return true;\n }\n }\n\n return false;\n}\n\nasync function executarDetectoresNativos(wf: unknown, raw: string): Promise<ProblemaWorkflow[]> {\n const probs: ProblemaWorkflow[] = [];\n if (!wf) return probs;\n\n _workflowNeedsFullHistory = workflowRequerHistoricoCompleto(wf as WorkflowNode, raw);\n\n // Handle various snippet styles for tests\n const candidates = Array.isArray(wf) ? wf : [wf];\n for (const item of candidates) {\n if (typeof item === 'object' && item !== null) {\n analisarEstrutura(item as WorkflowNode, probs);\n }\n }\n\n // Compliance checks\n probs.push(...detectarProblemasCompliance(wf, raw));\n\n // Accessibility checks\n probs.push(...detectarProblemasAcessibilidade(wf));\n\n // Passive jobs check\n if (typeof wf === 'object' && 'jobs' in wf) {\n const wfJobs = (wf as {\n jobs?: Record<string, {\n steps?: Array<{\n uses?: string;\n run?: string;\n }>;\n }>;\n }).jobs;\n if (wfJobs) {\n for (const [, job] of Object.entries(wfJobs)) {\n if (detectarJobsPassivos(job as {\n steps?: Array<{\n uses?: string;\n run?: string;\n }>;\n })) {\n probs.push({\n tipo: 'job-passivo-workflow',\n descricao: 'Job passivo detectado',\n severidade: 'baixa'\n });\n }\n }\n }\n }\n\n // Final check for raw string patterns (like sudo)\n if (/sudo\\s+/.test(raw)) {\n probs.push({\n tipo: 'uso-sudo',\n descricao: 'Uso de sudo detectado',\n severidade: 'alta'\n });\n }\n if (raw.includes('pull_request_target:')) {\n probs.push({\n tipo: 'estrutura-workflow',\n descricao: 'Uso de pull_request_target',\n severidade: 'alta'\n });\n }\n return probs;\n}\nfunction analisarEstrutura(wf: WorkflowNode, probs: ProblemaWorkflow[]) {\n // Workflow sem nome\n if (!wf.name) {\n probs.push({\n tipo: 'workflow-sem-nome',\n descricao: 'Workflow sem nome definido',\n severidade: 'baixa'\n });\n }\n\n // Container (Root level for snippets)\n if (wf.container && typeof wf.container === 'string') {\n probs.push({\n tipo: 'container-sem-user',\n descricao: 'Container sem user',\n severidade: 'media'\n });\n }\n\n // Strategy\n if (wf.strategy?.matrix && wf.strategy['fail-fast'] === undefined) {\n probs.push({\n tipo: 'matrix-sem-fail-fast',\n descricao: 'Matrix sem fail-fast',\n severidade: 'baixa'\n });\n }\n\n // Detect Secrets in generic maps (for environment snippets in tests)\n for (const [chave, valor] of Object.entries(wf)) {\n if (/(KEY|TOKEN|SECRET|PASSWORD)/i.test(chave) && valor && typeof valor !== 'object' && !String(valor).includes('${{')) {\n probs.push({\n tipo: 'env-sensivel',\n descricao: `Secret hardcoded em ${chave}`,\n severidade: 'critica'\n });\n }\n }\n\n // Jobs\n if (wf.jobs) {\n const jobEntries = Object.entries(wf.jobs);\n for (const [id, job] of jobEntries) {\n if (job?.strategy?.matrix && job.strategy['fail-fast'] === undefined) {\n probs.push({\n tipo: 'matrix-sem-fail-fast',\n descricao: `Job ${id} sem fail-fast`,\n severidade: 'baixa'\n });\n }\n if (job?.container && typeof job.container === 'string') {\n probs.push({\n tipo: 'container-sem-user',\n descricao: 'Container rodando como root',\n severidade: 'media'\n });\n }\n\n // --- v0.4.5: Job sem nome descritivo ---\n if (/^(job\\d+|step\\d+|build\\d*|test\\d*|j\\d+)$/i.test(id) && !job?.name) {\n probs.push({\n tipo: 'job-sem-nome',\n descricao: `Job '${id}' usa ID genérico sem campo 'name'`,\n severidade: 'baixa',\n sugestao: 'Usar nomes semânticos como build-backend, test-integration'\n });\n }\n if (job?.steps) {\n for (const string of job.steps) analisarStep(string, probs);\n\n // --- v0.4.5: Steps sem nome ---\n analisarStepsSemNome(job.steps, probs);\n\n // --- v0.7.0: Jobs muito longos ---\n if (job.steps.length > 15) {\n probs.push({\n tipo: 'job-longo',\n descricao: `Job '${id}' possui ${job.steps.length} steps, o que dificulta a manutenção`,\n severidade: 'baixa',\n sugestao: 'Considere quebrar em jobs menores ou usar composite actions'\n });\n }\n }\n }\n\n // --- v0.4.5: Build sem parallelismo ---\n analisarParalelismo(jobEntries, probs);\n\n // --- v0.4.5: Download desnecessário de artifacts ---\n analisarDownloadArtifacts(jobEntries, probs);\n\n // --- v0.4.5: Múltiplas instalações de dependências ---\n analisarMultiplasInstalacoesDeps(jobEntries, probs);\n }\n\n // Se forem passos diretos na raiz (snippet)\n if (wf.steps && Array.isArray(wf.steps)) {\n for (const string of wf.steps) analisarStep(string, probs);\n analisarStepsSemNome(wf.steps, probs);\n }\n\n // Direct steps (if snippet is a list)\n if (wf.uses || wf.run) analisarStep(wf as WorkflowStep, probs);\n}\nfunction analisarStep(string: WorkflowStep, probs: ProblemaWorkflow[]) {\n if (!string) return;\n // Pinning - only for non-verified orgs\n if (string.uses && /@v\\d+/.test(string.uses)) {\n const actionRef = string.uses.split('@')[0];\n if (!isOrgVerificada(actionRef)) {\n probs.push({\n tipo: 'falta-sha-pinning',\n descricao: 'Pinning por SHA faltando',\n severidade: 'media'\n });\n }\n }\n // Upload\n if (string.uses?.includes('upload-artifact') && string.with?.path?.includes('.env')) {\n probs.push({\n tipo: 'upload-sensivel',\n descricao: 'Upload de .env',\n severidade: 'critica'\n });\n }\n // Env\n if (string.env) {\n for (const [chave, valor] of Object.entries(string.env)) {\n if (/(KEY|TOKEN|SECRET|PASSWORD)/i.test(chave) && valor && typeof valor !== 'object' && !String(valor).includes('${{')) {\n probs.push({\n tipo: 'env-sensivel',\n descricao: `Env ${chave} hardcoded`,\n severidade: 'critica'\n });\n }\n }\n }\n // Injection\n if (string.run && /\\$\\{\\{\\s*github\\.event\\./.test(string.run)) {\n probs.push({\n tipo: 'script-injection',\n descricao: 'Script injection',\n severidade: 'alta'\n });\n }\n\n // --- v0.4.5: Docker build sem layer caching ---\n if (string.uses && /docker\\/build-push-action/.test(string.uses)) {\n const hasCacheFrom = string.with?.['cache-from'] !== undefined;\n const hasCacheTo = string.with?.['cache-to'] !== undefined;\n if (!hasCacheFrom && !hasCacheTo) {\n probs.push({\n tipo: 'docker-sem-layer-cache',\n descricao: 'Docker build sem cache de layers configurado',\n severidade: 'media',\n sugestao: 'Adicionar cache-from e cache-to para otimizar builds Docker'\n });\n }\n }\n\n // --- v0.4.5: Checkout com fetch-depth: 0 desnecessário ---\n if (string.uses && /actions\\/checkout/.test(string.uses) && string.with) {\n const fd = string.with['fetch-depth'];\n if (fd === 0 || fd === '0') {\n // Não emitir se já foi identificado que o workflow precisa de histórico completo\n if (!_workflowNeedsFullHistory) {\n probs.push({\n tipo: 'fetch-depth-desnecessario',\n descricao: 'checkout com fetch-depth: 0 baixa todo o histórico do repositório',\n severidade: 'baixa',\n sugestao: 'Usar fetch-depth: 1 (default) a menos que precise do histórico completo para tags/changelog'\n });\n }\n }\n }\n}\n\nconst ACTIONS_AUTO_EXPLICATIVAS = [\n 'actions/checkout',\n 'actions/setup-node',\n 'actions/setup-python',\n 'actions/setup-java',\n 'actions/setup-go',\n 'actions/setup-dotnet',\n 'actions/setup-ruby',\n 'actions/upload-artifact',\n 'actions/download-artifact',\n 'actions/cache',\n 'actions/stale',\n 'actions/labeler',\n 'actions/dependency-review',\n 'actions/attest-build-provenance',\n 'docker/login-action',\n 'docker/build-push-action',\n 'docker/metadata-action',\n 'docker/setup-buildx-action',\n 'docker/setup-qemu-action',\n 'azure/login',\n 'azure/webapps-deploy',\n 'aws-actions/configure-aws-credentials',\n 'google-github-actions/auth',\n 'github/codeql-action/init',\n 'github/codeql-action/analyze',\n 'github/codeql-action/autobuild',\n 'softprops/action-gh-release',\n 'cypress-io/github-action',\n];\n\n/**\n * v0.4.5: Detecta steps sem campo 'name'\n * Não reporta para actions bem conhecidas e auto-explicativas\n */\nfunction analisarStepsSemNome(steps: WorkflowStep[], probs: ProblemaWorkflow[]) {\n for (const string of steps) {\n if (!string || string.name) continue;\n if (string.uses || string.run) {\n // Pular actions auto-explicativas (não precisam de name)\n if (string.uses && ACTIONS_AUTO_EXPLICATIVAS.some(action => string.uses?.startsWith(action))) {\n continue;\n }\n const ident = string.uses ? `uses: ${string.uses}` : 'run command';\n probs.push({\n tipo: 'step-sem-nome',\n descricao: `Step sem campo 'name' (${ident})`,\n severidade: 'baixa',\n sugestao: 'Adicionar campo name: para melhor legibilidade nos logs do Actions'\n });\n }\n }\n}\n\n/**\n * v0.4.5: Detecta jobs que poderiam rodar em paralelo mas têm 'needs' desnecessário\n * Heurística: se todos os jobs têm 'needs' formando uma cadeia linear, sugere paralelismo\n * Exceção: workflows de release/deploy são intrinsecamente sequenciais\n */\nfunction analisarParalelismo(jobEntries: [string, WorkflowJob][], probs: ProblemaWorkflow[]) {\n if (jobEntries.length < 3) return;\n\n // Check if this is a release/deploy workflow (sequential by nature)\n const workflowName = jobEntries[0]?.[1]?.name?.toLowerCase() || '';\n const jobNames = jobEntries.map(([, j]) => j?.name?.toLowerCase() || '').join(' ');\n const isReleaseWorkflow = /release|deploy|publish|ship/i.test(workflowName) || /release|deploy|publish|ship/i.test(jobNames);\n if (isReleaseWorkflow) return;\n\n let totalWithNeeds = 0;\n for (const [, job] of jobEntries) {\n if (job?.needs) totalWithNeeds++;\n }\n\n // Se todos os jobs (exceto o primeiro) dependem do anterior em cadeia linear\n if (totalWithNeeds === jobEntries.length - 1) {\n probs.push({\n tipo: 'build-sem-parallelismo',\n descricao: 'Todos os jobs estão em cadeia linear - considere paralelizar jobs independentes',\n severidade: 'media',\n sugestao: 'Remover dependências (needs) desnecessárias para permitir execução paralela'\n });\n }\n}\n\n/**\n * v0.4.5: Detecta múltiplos download-artifact em jobs diferentes\n */\nfunction analisarDownloadArtifacts(jobEntries: [string, WorkflowJob][], probs: ProblemaWorkflow[]) {\n let downloadCount = 0;\n for (const [, job] of jobEntries) {\n if (!job?.steps) continue;\n for (const string of job.steps) {\n if (string.uses && /download-artifact/.test(string.uses)) downloadCount++;\n }\n }\n if (downloadCount >= 3) {\n probs.push({\n tipo: 'download-artifacts-desnecessario',\n descricao: `${downloadCount} download-artifact encontrados - considere consolidar artifacts`,\n severidade: 'baixa',\n sugestao: 'Consolidar artifacts ou usar cache compartilhado'\n });\n }\n}\n\n/**\n * v0.4.5: Detecta npm ci/npm install em múltiplos jobs sem cache compartilhado\n */\nfunction analisarMultiplasInstalacoesDeps(jobEntries: [string, WorkflowJob][], probs: ProblemaWorkflow[]) {\n let installCount = 0;\n let hasCacheStep = false;\n let hasSetupNodeWithCache = false;\n for (const [, job] of jobEntries) {\n if (!job?.steps) continue;\n let jobHasInstall = false;\n for (const string of job.steps) {\n if (string.run && /\\b(npm\\s+(ci|install)|yarn\\s+install|pnpm\\s+install)\\b/.test(string.run)) {\n jobHasInstall = true;\n }\n if (string.uses && /actions\\/cache/.test(string.uses)) {\n hasCacheStep = true;\n }\n if (string.uses && /actions\\/setup-node/.test(string.uses) && string.with?.cache) {\n hasSetupNodeWithCache = true;\n }\n }\n if (jobHasInstall) installCount++;\n }\n if (installCount >= 2 && !hasCacheStep && !hasSetupNodeWithCache) {\n probs.push({\n tipo: 'multiplas-instalacoes-deps',\n descricao: `Instalação de dependências em ${installCount} jobs sem cache compartilhado`,\n severidade: 'media',\n sugestao: 'Usar actions/cache ou artifact de node_modules para evitar instalações duplicadas'\n });\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autofix-engine.d.ts","sourceRoot":"","sources":["../../../../src/analysts/github-actions/corrections/autofix-engine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"autofix-engine.d.ts","sourceRoot":"","sources":["../../../../src/analysts/github-actions/corrections/autofix-engine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AASrC,qBAAa,aAAa;IAOjB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC,GAAG,MAAM;IAwB7E,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;CAGjF;AACD,eAAO,MAAM,aAAa,eAAsB,CAAC"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { getMessages } from '../../../core/messages/index.js';
|
|
1
2
|
import { parseDocument } from 'yaml';
|
|
3
|
+
const { AnalistaGithubActionsMensagens } = getMessages();
|
|
2
4
|
export class AutofixEngine {
|
|
3
5
|
aplicarFixes(content, fixers) {
|
|
4
6
|
if (!content || fixers.length === 0)
|
|
@@ -12,7 +14,7 @@ export class AutofixEngine {
|
|
|
12
14
|
fix(doc);
|
|
13
15
|
}
|
|
14
16
|
catch (err) {
|
|
15
|
-
console.error(
|
|
17
|
+
console.error(AnalistaGithubActionsMensagens.erroAplicarCorrecao(err));
|
|
16
18
|
}
|
|
17
19
|
}
|
|
18
20
|
return doc.toString();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autofix-engine.js","sourceRoot":"","sources":["../../../../src/analysts/github-actions/corrections/autofix-engine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"autofix-engine.js","sourceRoot":"","sources":["../../../../src/analysts/github-actions/corrections/autofix-engine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,EAAE,8BAA8B,EAAE,GAAG,WAAW,EAAE,CAAC;AAMzD,MAAM,OAAO,aAAa;IAOjB,YAAY,CAAC,OAAe,EAAE,MAAsC;QACzE,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QACpD,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAGnC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,OAAO,CAAC;QACjB,CAAC;QAGD,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,GAAG,CAAC,GAAG,CAAC,CAAC;YACX,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAMM,aAAa,CAAC,QAA0B;QAC7C,OAAO,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,SAAS,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,QAAmC,CAAC,CAAC;IAChJ,CAAC;CACF;AACD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\nimport { getMessages } from '@core/messages';\nimport type { DeteccaoCustom } from '@types';\nimport type { Document } from 'yaml';\nimport { parseDocument } from 'yaml';\n\nconst { AnalistaGithubActionsMensagens } = getMessages();\n\n/**\n * Motor de Auto-fix para GitHub Actions\n * Utiliza a biblioteca 'yaml' para mutar o documento preservando a formatação.\n */\nexport class AutofixEngine {\n /**\n * Aplica uma lista de mutadores a um conteúdo YAML\n * @param content O conteúdo original do arquivo YAML\n * @param fixers Lista de funções de correção que operam na AST (Document)\n * @returns O conteúdo corrigido\n */\n public aplicarFixes(content: string, fixers: Array<(doc: Document) => void>): string {\n if (!content || fixers.length === 0) return content;\n const doc = parseDocument(content);\n\n // Se o documento tiver erros de parse, não aplicamos correções para evitar corromper\n if (doc.errors.length > 0) {\n return content;\n }\n\n // Executa cada mutador na AST\n for (const fix of fixers) {\n try {\n fix(doc);\n } catch (err) {\n console.error(AnalistaGithubActionsMensagens.erroAplicarCorrecao(err));\n }\n }\n return doc.toString();\n }\n\n /**\n * Converte o método corrigir de DeteccaoCustom para um formato compatível com o motor\n * @param detecoes Lista de detecções que possuem método corrigir\n */\n public extrairFixers(detecoes: DeteccaoCustom[]): Array<(doc: Document) => void> {\n return detecoes.filter(diretorio => typeof diretorio.corrigir === 'function').map(diretorio => diretorio.corrigir as (doc: Document) => void);\n }\n}\nexport const autofixEngine = new AutofixEngine();"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"correction-workflow.d.ts","sourceRoot":"","sources":["../../../../src/analysts/github-actions/corrections/correction-workflow.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"correction-workflow.d.ts","sourceRoot":"","sources":["../../../../src/analysts/github-actions/corrections/correction-workflow.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,GAAG,CAAC;AAG9C,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAmC7F;AACD,eAAO,MAAM,kBAAkB,EAAE,QAsBhC,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { messages } from '../../../core/messages/index.js';
|
|
1
2
|
import { splitLines } from '../../../shared/helpers/index.js';
|
|
2
3
|
import { criarOcorrencia } from '../../../types/index.js';
|
|
3
4
|
export function detectarCorrecoesWorkflow(src, _relPath) {
|
|
@@ -48,7 +49,7 @@ export const correctionWorkflow = {
|
|
|
48
49
|
return correcoes.map(elem => criarOcorrencia({
|
|
49
50
|
tipo: `correction-${elem.tipo}`,
|
|
50
51
|
nivel: elem.confianca > 85 ? 'aviso' : 'info',
|
|
51
|
-
mensagem:
|
|
52
|
+
mensagem: messages.SharedCommonMensagens.correcaoSugerida(elem.tipo),
|
|
52
53
|
relPath,
|
|
53
54
|
linha: elem.linha,
|
|
54
55
|
sugestao: ` ${elem.original}\n ${elem.sugerido}\nConfiança: ${elem.confianca}%`,
|