@mocoto/mahoraga 0.15.0 → 0.15.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Docs/.obsidian/app.json +7 -0
- package/Docs/.obsidian/appearance.json +8 -0
- package/Docs/.obsidian/community-plugins.json +28 -0
- package/Docs/.obsidian/core-plugins-migration.json +18 -0
- package/Docs/.obsidian/core-plugins.json +73 -0
- package/Docs/.obsidian/graph.json +22 -0
- package/Docs/.obsidian/workspace.json +196 -0
- package/Docs/01-arquitetura/ADR-001-estrutura-testes.md +31 -0
- package/Docs/01-arquitetura/_index.md +152 -0
- package/Docs/02-componentes/_index.md +294 -0
- package/Docs/02-componentes/configuracao.md +110 -0
- package/Docs/02-componentes/supressao-inline.md +88 -0
- package/Docs/03-guias/_index.md +173 -0
- package/Docs/03-guias/contribuindo.md +71 -0
- package/Docs/03-guias/testes.md +133 -0
- package/Docs/04-glossario/_index.md +29 -0
- package/Docs/04-glossario/termos.md +247 -0
- package/Docs/05-referencias/_index.md +88 -0
- package/Docs/06-feedbacks/feedback.md +74 -0
- package/Docs/Sem t/303/255tulo.base" +3 -0
- package/Docs/Sem t/303/255tulo.md +0 -0
- package/Docs/_home.md +140 -0
- package/Docs/partials/AVISO-PROVENIENCIA.md +3 -0
- package/Docs/templates/ADR.md +24 -0
- package/Docs/templates/componente.md +34 -0
- package/Docs/templates/guia.md +28 -0
- package/README.md +269 -26
- package/dist/analysts/detectors/detector-bugs-ml.js +5 -0
- package/dist/analysts/js-ts/registrar.js +1 -1
- package/dist/analysts/plugins/detector-markdown.js +2 -2
- package/dist/analysts/react/analysts/analyst-react-hooks.js +30 -15
- package/dist/analysts/react/analysts/analyst-react.js +11 -2
- package/dist/analysts/react/detectors/detector-react-best-practices.js +7 -4
- package/dist/caretakers/caretaker-imports.js +0 -9
- package/dist/cli/commands/command-github-actions.js +0 -27
- package/dist/cli/diagnostic/filters.js +1 -4
- package/dist/core/config/config.js +2 -3
- package/dist/core/config/excludes-padrao.js +3 -2
- package/dist/core/messages/en/cli/cli-command-github-actions-messages.js +0 -5
- package/dist/core/messages/en/github/index.js +0 -1
- package/dist/core/messages/ja/cli/cli-command-github-actions-messages.js +0 -5
- package/dist/core/messages/ja/github/index.js +0 -1
- package/dist/core/messages/pt/cli/cli-command-github-actions-messages.js +0 -5
- package/dist/core/messages/pt/github/index.js +0 -1
- package/dist/core/messages/zh/cli/cli-command-github-actions-messages.js +0 -5
- package/dist/core/messages/zh/github/index.js +0 -1
- package/dist/core/registry/file-registry.js +1 -1
- package/dist/node.loader.js +0 -2
- package/dist/reports/report-structure.js +2 -8
- package/dist/shared/formatters/formatters/commons.js +36 -10
- package/dist/shared/formatters/formatters/shell.js +6 -3
- package/dist/shared/helpers/magic-constants-whitelist.js +14 -1
- package/dist/types/analysts/index.js +1 -1
- package/dist/types/processing/filters.js +1 -4
- package/package.json +31 -32
- package/dist/app/github.js +0 -14
- package/dist/app/index.js +0 -1
- package/dist/core/messages/en/github/github-app-messages.js +0 -9
- package/dist/core/messages/ja/github/github-app-messages.js +0 -9
- package/dist/core/messages/pt/github/github-app-messages.js +0 -9
- package/dist/core/messages/zh/github/github-app-messages.js +0 -9
package/Docs/_home.md
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
---
|
|
2
|
+
Proveniência e Autoria: Este documento integra o projeto @mocoto/mahoraga (licença MIT-0).
|
|
3
|
+
tags: [moc, index]
|
|
4
|
+
created: 2026-07-24
|
|
5
|
+
updated: 2026-07-25
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# @mocoto/mahoraga: Documentação Viva
|
|
9
|
+
|
|
10
|
+
CLI modular para análise, diagnóstico e manutenção de projetos JavaScript/TypeScript e multi-stack leve.
|
|
11
|
+
|
|
12
|
+
## Navegação
|
|
13
|
+
|
|
14
|
+
| Área | Descrição |
|
|
15
|
+
| ---------------------------------- | ------------------ | ------------------------------------------------------------ |
|
|
16
|
+
| [[01-arquitetura/_index\ | Arquitetura]] | Decisões arquiteturais, ADRs, diagramas, fluxos |
|
|
17
|
+
| [[02-componentes/_index\ | Componentes]] | Documentação de todos os módulos do sistema |
|
|
18
|
+
| [[02-componentes/supressao-inline\ | Supressão Inline]] | Sistema de `@mahoraga-disable` para analistas e formatadores |
|
|
19
|
+
| [[03-guias/_index\ | Guias]] | Guias de contribuição, testes, CLI, debug |
|
|
20
|
+
| [[04-glossario/_index\ | Glossário]] | Termos do domínio e conceitos |
|
|
21
|
+
| [[05-referencias/_index\ | Referências]] | Links externos, specs, recursos |
|
|
22
|
+
|
|
23
|
+
## Visão Geral
|
|
24
|
+
|
|
25
|
+
Mahoraga é uma ferramenta CLI que funciona como "médico de projetos": analisa código fonte, detecta problemas de qualidade, segurança e arquitetura, e oferece correções automatizadas. Suporta múltiplas linguagens (JS, TS, React, CSS, HTML, Python, Shell, SQL, Go, Rust, PHP) e plataformas de CI/CD (GitHub Actions, GitLab CI, CircleCI, Jenkins, Azure Pipelines).
|
|
26
|
+
|
|
27
|
+
## Stack
|
|
28
|
+
|
|
29
|
+
- **Runtime:** Node.js >=24.16.0
|
|
30
|
+
- **Linguagem:** TypeScript (ES2024, NodeNext)
|
|
31
|
+
- **Build:** tsc + tsc-alias
|
|
32
|
+
- **Testes:** Vitest v4 + v8 coverage
|
|
33
|
+
- **CLI:** Commander.js
|
|
34
|
+
- **Parser:** Babel (AST), postcss, htmlparser2, fast-xml-parser
|
|
35
|
+
- **GPG:** openpgp (Ed25519)
|
|
36
|
+
- **i18n:** pt, en, zh, ja
|
|
37
|
+
- **Licença:** MIT-0
|
|
38
|
+
|
|
39
|
+
## Snapshot do Projeto
|
|
40
|
+
|
|
41
|
+
| Métrica | Valor |
|
|
42
|
+
|---------|-------|
|
|
43
|
+
| Versão | 0.15.1 |
|
|
44
|
+
| Comandos CLI | 27 |
|
|
45
|
+
| Arquivos de teste | ~240 |
|
|
46
|
+
| Testes | ~3300 |
|
|
47
|
+
| Cobertura (statements) | ~48% |
|
|
48
|
+
| Source lines | ~31k |
|
|
49
|
+
| Diretórios em `src/` | 15+ |
|
|
50
|
+
| Analisadores de linguagem | 11 |
|
|
51
|
+
| Analisadores de CI/CD | 5 |
|
|
52
|
+
| Línguas suportadas | 4 (pt, en, zh, ja) |
|
|
53
|
+
|
|
54
|
+
## Arquitetura em Camadas
|
|
55
|
+
|
|
56
|
+
```mermaid
|
|
57
|
+
flowchart TB
|
|
58
|
+
subgraph Entry
|
|
59
|
+
bin["src/bin/index.ts<br/>Entry Point"]
|
|
60
|
+
end
|
|
61
|
+
subgraph CLI["CLI Layer<br/>src/cli/"]
|
|
62
|
+
CMDS["27 comandos<br/>Commander.js"]
|
|
63
|
+
DIAG["Diagnóstico"]
|
|
64
|
+
HELP["Helpers"]
|
|
65
|
+
end
|
|
66
|
+
subgraph CORE["Core Layer<br/>src/core/"]
|
|
67
|
+
EXEC["Execução<br/>Scanner / Workers"]
|
|
68
|
+
CONF["Config"]
|
|
69
|
+
PARSE["Parsing<br/>Babel + langs"]
|
|
70
|
+
I18N["i18n<br/>pt/en/zh/ja"]
|
|
71
|
+
CORR["Correções"]
|
|
72
|
+
end
|
|
73
|
+
subgraph ANALYSTS["Analysis Layer<br/>src/analysts/"]
|
|
74
|
+
DETECT["Detectores<br/>15+ especializados"]
|
|
75
|
+
LANG["Analisadores<br/>11 linguagens"]
|
|
76
|
+
CICD["Analisadores<br/>5 plataformas CI/CD"]
|
|
77
|
+
PLUGINS["Plugins"]
|
|
78
|
+
end
|
|
79
|
+
subgraph SERVICES["Service Layer"]
|
|
80
|
+
GUARDIAN["Guardian<br/>Integridade GPG"]
|
|
81
|
+
LICENSES["Licenças<br/>SPDX + scanner"]
|
|
82
|
+
VULN["Vulnerabilidades<br/>npm audit"]
|
|
83
|
+
CARETAKERS["Caretakers<br/>Transformações"]
|
|
84
|
+
REPORTS["Relatórios<br/>Compliance + Advisor"]
|
|
85
|
+
end
|
|
86
|
+
subgraph SHARED["Shared Layer<br/>src/shared/"]
|
|
87
|
+
FORM["Formatters"]
|
|
88
|
+
PERSIST["Persistência"]
|
|
89
|
+
VAL["Validação"]
|
|
90
|
+
MP["Marketplace"]
|
|
91
|
+
end
|
|
92
|
+
subgraph TYPES["Types<br/>src/types/"]
|
|
93
|
+
TINDEX["14 namespaces"]
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
bin --> CLI
|
|
97
|
+
CLI --> CORE
|
|
98
|
+
CORE --> ANALYSTS
|
|
99
|
+
CORE --> SERVICES
|
|
100
|
+
SERVICES --> SHARED
|
|
101
|
+
ANALYSTS --> SHARED
|
|
102
|
+
CORE --> TYPES
|
|
103
|
+
ANALYSTS --> TYPES
|
|
104
|
+
SERVICES --> TYPES
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Comandos Rápidos
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# Diagnóstico
|
|
111
|
+
mahoraga diagnosticar # análise padrão
|
|
112
|
+
mahoraga diagnosticar --full # completa
|
|
113
|
+
mahoraga diagnosticar --fast # rápida
|
|
114
|
+
mahoraga diagnosticar --json # JSON output
|
|
115
|
+
|
|
116
|
+
# Integridade
|
|
117
|
+
mahoraga guardian # verificar integridade
|
|
118
|
+
mahoraga guardian --accept-baseline # aceitar baseline
|
|
119
|
+
|
|
120
|
+
# CI/CD
|
|
121
|
+
mahoraga github-actions scan
|
|
122
|
+
mahoraga gitlab-ci scan
|
|
123
|
+
mahoraga circleci scan
|
|
124
|
+
mahoraga convert --from github --to gitlab
|
|
125
|
+
|
|
126
|
+
# Licenças
|
|
127
|
+
mahoraga licencas scan
|
|
128
|
+
mahoraga licencas notices generate
|
|
129
|
+
mahoraga licencas disclaimer add
|
|
130
|
+
|
|
131
|
+
# Manutenção
|
|
132
|
+
mahoraga formatar --write
|
|
133
|
+
mahoraga podar
|
|
134
|
+
mahoraga fix-types --target src
|
|
135
|
+
mahoraga imports --scan
|
|
136
|
+
|
|
137
|
+
# Compliance
|
|
138
|
+
mahoraga compliance report iso-27001
|
|
139
|
+
mahoraga compliance report soc2
|
|
140
|
+
```
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
Proveniência e Autoria: Este documento integra o projeto @mocoto/mahoraga (licença MIT-0).
|
|
3
|
+
tags: [adr]
|
|
4
|
+
status: proposto | aceito | deprecated
|
|
5
|
+
created: {{date}}
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# ADR-NNN: Título da Decisão
|
|
9
|
+
|
|
10
|
+
## Contexto
|
|
11
|
+
|
|
12
|
+
<!-- Por que essa decisão foi necessária? Qual problema resolve? -->
|
|
13
|
+
|
|
14
|
+
## Decisão
|
|
15
|
+
|
|
16
|
+
<!-- O que foi decidido? Qual caminho foi escolhido? -->
|
|
17
|
+
|
|
18
|
+
## Consequências
|
|
19
|
+
|
|
20
|
+
<!-- Impactos positivos e negativos da decisão -->
|
|
21
|
+
|
|
22
|
+
## Alternativas Consideradas
|
|
23
|
+
|
|
24
|
+
<!-- Quais outras opções foram avaliadas e por que foram descartadas? -->
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
Proveniência e Autoria: Este documento integra o projeto @mocoto/mahoraga (licença MIT-0).
|
|
3
|
+
tags: [componente]
|
|
4
|
+
status: rascunho
|
|
5
|
+
created: {{date}}
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Nome do Componente
|
|
9
|
+
|
|
10
|
+
## Propósito
|
|
11
|
+
|
|
12
|
+
<!-- O que este componente faz? Qual problema resolve? -->
|
|
13
|
+
|
|
14
|
+
## Dependências
|
|
15
|
+
|
|
16
|
+
- Entrada: <!-- o que ele recebe -->
|
|
17
|
+
- Saída: <!-- o que ele produz -->
|
|
18
|
+
- Importa de: <!-- módulos que usa -->
|
|
19
|
+
|
|
20
|
+
## API Pública
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
// Assinaturas principais
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Exemplo de Uso
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Testes
|
|
33
|
+
|
|
34
|
+
<!-- Onde estão os testes e como rodá-los -->
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
Proveniência e Autoria: Este documento integra o projeto @mocoto/mahoraga (licença MIT-0).
|
|
3
|
+
tags: [guia]
|
|
4
|
+
status: rascunho
|
|
5
|
+
created: {{date}}
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Título do Guia
|
|
9
|
+
|
|
10
|
+
## Objetivo
|
|
11
|
+
|
|
12
|
+
<!-- O que este guia ensina? -->
|
|
13
|
+
|
|
14
|
+
## Passo a Passo
|
|
15
|
+
|
|
16
|
+
1. <!-- passo 1 -->
|
|
17
|
+
2. <!-- passo 2 -->
|
|
18
|
+
3. <!-- passo 3 -->
|
|
19
|
+
|
|
20
|
+
## Exemplos
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# Comandos de exemplo
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Referências
|
|
27
|
+
|
|
28
|
+
- Links para notas relacionadas
|
package/README.md
CHANGED
|
@@ -8,9 +8,9 @@ Proveniência e Autoria: Este documento integra o projeto @mocoto/mahoraga (lice
|
|
|
8
8
|
|
|
9
9
|
</div>
|
|
10
10
|
|
|
11
|
-
Caso queira ajudar com
|
|
11
|
+
Caso queira ajudar com relatórios de bugs e erros ou com sugestões, entre em contato pelo e-mail abaixo.
|
|
12
12
|
|
|
13
|
-
[ProtonMail](mailto:mahoraga.
|
|
13
|
+
[ProtonMail](mailto:mahoraga.able522@passfwd.com)
|
|
14
14
|
|
|
15
15
|
---
|
|
16
16
|
|
|
@@ -43,7 +43,9 @@ mahoraga diagnosticar --json > relatorio.json
|
|
|
43
43
|
| `guardian` | Monitoramento de integridade com GPG | `mahoraga guardian --accept-baseline` |
|
|
44
44
|
| `fix-types` | Corrigir tipos inseguros (`any`/`unknown`) | `mahoraga fix-types --target src` |
|
|
45
45
|
| `formatar` | Formatação automática de código | `mahoraga formatar --write` |
|
|
46
|
+
| `formatters` | Gerenciamento de formatadores | `mahoraga formatters list` |
|
|
46
47
|
| `podar` | Remover arquivos órfãos e código morto | `mahoraga podar` |
|
|
48
|
+
| `otimizar-svg` | Otimizar arquivos SVG | `mahoraga otimizar-svg --write` |
|
|
47
49
|
| `names` | Extração e renomeação em massa de variáveis | `mahoraga names --scan` |
|
|
48
50
|
| `imports` | Gerenciar aliases de import (`@/`) | `mahoraga imports --scan` |
|
|
49
51
|
| `barrels` | Gerenciar barrels (`index.ts`) | `mahoraga barrels --generate` |
|
|
@@ -92,7 +94,6 @@ mahoraga guardian --json # saída JSON estruturada
|
|
|
92
94
|
```bash
|
|
93
95
|
mahoraga github-actions scan # GitHub Actions
|
|
94
96
|
mahoraga github-actions gate --threshold 80 # quality gate
|
|
95
|
-
mahoraga github-actions app --port 3000 # servidor GitHub App
|
|
96
97
|
mahoraga gitlab-ci scan # GitLab CI
|
|
97
98
|
mahoraga circleci scan # CircleCI
|
|
98
99
|
mahoraga jenkins scan # Jenkins
|
|
@@ -120,6 +121,7 @@ mahoraga fix-types --interactive # modo interativo
|
|
|
120
121
|
mahoraga formatar --write # formatar código
|
|
121
122
|
mahoraga formatar --check # apenas verificar
|
|
122
123
|
mahoraga podar # remover arquivos órfãos
|
|
124
|
+
mahoraga otimizar-svg --write # otimizar SVGs
|
|
123
125
|
mahoraga names --scan # extrair nomes de variáveis
|
|
124
126
|
mahoraga names --apply # aplicar renomeações
|
|
125
127
|
mahoraga reverter listar # listar reversões disponíveis
|
|
@@ -140,7 +142,6 @@ mahoraga marketplace list # listar instalados
|
|
|
140
142
|
### Utilitários
|
|
141
143
|
|
|
142
144
|
```bash
|
|
143
|
-
mahoraga otimizar-svg --write # otimizar SVGs
|
|
144
145
|
mahoraga imports --scan # escanear aliases de import
|
|
145
146
|
mahoraga imports --apply # aplicar correções de import
|
|
146
147
|
mahoraga barrels --scan # preview de barrels
|
|
@@ -158,7 +159,8 @@ mahoraga atualizar --global # auto-update
|
|
|
158
159
|
|
|
159
160
|
- **Diagnóstico completo**: qualidade, segurança e arquitetura
|
|
160
161
|
- **15+ detectores especializados**: código frágil, duplicação, complexidade, performance, vazamentos de memória, tipos inseguros
|
|
161
|
-
- **
|
|
162
|
+
- **14 analisadores de linguagem**: JS, TS, React, CSS, CSS-in-JS, HTML, SVG, XML, Tailwind, Python, Shell, SQL, Go, Rust, PHP
|
|
163
|
+
- **5 analisadores de CI/CD**: GitHub Actions, GitLab CI, CircleCI, Jenkins, Azure Pipelines
|
|
162
164
|
- **Detecção de bugs via ML**: 8 padrões com pontuação Bayesiana
|
|
163
165
|
- **Registro inteligente**: descoberta automática de analistas built-in e customizados
|
|
164
166
|
- **Análise de monorepos**: pnpm-workspace, lerna, nx, turbo
|
|
@@ -168,7 +170,7 @@ mahoraga atualizar --global # auto-update
|
|
|
168
170
|
- **Guardian**: monitoramento contínuo com assinatura GPG (Ed25519), baselines criptográficos e verificação de integridade
|
|
169
171
|
- **Fix Types**: correção automática de `any` e `unknown`
|
|
170
172
|
- **Poda inteligente**: identificação e remoção de arquivos órfãos e código morto
|
|
171
|
-
- **Formatação**: formatação automática do código
|
|
173
|
+
- **Formatação**: formatação automática do código com supressão inline via `@mahoraga-disable`
|
|
172
174
|
- **Names/Rename**: extração e renomeação em massa de variáveis
|
|
173
175
|
- **Reverter**: rollback de movimentações aplicadas
|
|
174
176
|
- **Imports**: gerenciamento de aliases de import
|
|
@@ -183,7 +185,7 @@ mahoraga atualizar --global # auto-update
|
|
|
183
185
|
|
|
184
186
|
### Integrações CI/CD
|
|
185
187
|
|
|
186
|
-
- **GitLab CI / CircleCI / Jenkins / Azure Pipelines**: análise de pipelines
|
|
188
|
+
- **GitHub Actions / GitLab CI / CircleCI / Jenkins / Azure Pipelines**: análise de pipelines com detectores e correções específicos
|
|
187
189
|
- **Conversão** entre plataformas de CI/CD
|
|
188
190
|
|
|
189
191
|
### Extensível
|
|
@@ -213,7 +215,7 @@ npx mahoraga --help
|
|
|
213
215
|
### Verificar Instalação
|
|
214
216
|
|
|
215
217
|
```bash
|
|
216
|
-
mahoraga --version # v0.
|
|
218
|
+
mahoraga --version # v0.15.1
|
|
217
219
|
mahoraga --help # lista todos os comandos
|
|
218
220
|
mahoraga analistas --json # analistas disponíveis
|
|
219
221
|
```
|
|
@@ -222,20 +224,176 @@ mahoraga analistas --json # analistas disponíveis
|
|
|
222
224
|
|
|
223
225
|
## Configuração
|
|
224
226
|
|
|
225
|
-
O Mahoraga lê um arquivo `mahoraga.config.json` na raiz do seu projeto (
|
|
227
|
+
O Mahoraga lê um arquivo `mahoraga.config.json` na raiz do seu projeto. A configuração usa **deep merge** com esta precedência (maior para menor):
|
|
228
|
+
1. CLI flags / environment variables (`MAHORAGA_*`)
|
|
229
|
+
2. `mahoraga.config.json` (ou `src/config.json` como fallback)
|
|
230
|
+
3. System defaults (hardcoded)
|
|
231
|
+
|
|
232
|
+
### Comportamento de Merge
|
|
233
|
+
|
|
234
|
+
- **Objetos** (`languages`, `suppress`, `rules`, `detectorMarkdown`, `autoFix`, `ANALISE_LIMITES`, `nameConventions`): faz merge recursivo — você pode definir apenas os campos que deseja sobrescrever; os demais mantêm os defaults.
|
|
235
|
+
- **Arrays** (`exclude`): são **aditivos** — os padrões que você definir em `exclude` são adicionados aos defaults do sistema, não os substituem. Se você quer excluir `temp/**` além dos defaults, basta incluir `"exclude": ["temp/**"]`.
|
|
236
|
+
- **Primitivos** (`locale`, `verbose`, `LOG_LEVEL`, `GUARDIAN_ENABLED`, etc.): substituem o valor default quando definidos.
|
|
237
|
+
- **`suppress.paths` e `suppress.filePatterns`**: substituem a lista de supressão (não é merge).
|
|
226
238
|
|
|
227
|
-
###
|
|
239
|
+
### Exemplo Completo
|
|
228
240
|
|
|
229
|
-
```
|
|
241
|
+
```jsonc
|
|
230
242
|
{
|
|
231
|
-
|
|
232
|
-
"
|
|
233
|
-
|
|
234
|
-
|
|
243
|
+
// === LOCALIDADE ===
|
|
244
|
+
"locale": "pt", // Idioma: pt, en, zh, ja
|
|
245
|
+
|
|
246
|
+
// === LOG E DEBUG ===
|
|
247
|
+
"verbose": false, // Saída verbosa
|
|
248
|
+
"LOG_LEVEL": "info", // Nível: erro, aviso, info, debug
|
|
249
|
+
"LOG_ESTRUTURADO": false, // Logs em JSON estruturado
|
|
250
|
+
"DEV_MODE": false, // Modo desenvolvimento
|
|
251
|
+
|
|
252
|
+
// === LINGUAGENS ===
|
|
253
|
+
"languages": { // Habilita/desabilita analisadores
|
|
235
254
|
"javascript": { "enabled": true },
|
|
236
255
|
"typescript": { "enabled": true },
|
|
256
|
+
"react": { "enabled": true },
|
|
237
257
|
"html": { "enabled": true },
|
|
238
|
-
"css": { "enabled": true }
|
|
258
|
+
"css": { "enabled": true },
|
|
259
|
+
"scss": { "enabled": false },
|
|
260
|
+
"sass": { "enabled": false },
|
|
261
|
+
"css-in-js": { "enabled": false },
|
|
262
|
+
"tailwind": { "enabled": false },
|
|
263
|
+
"xml": { "enabled": true },
|
|
264
|
+
"svg": { "enabled": false },
|
|
265
|
+
"python": { "enabled": false },
|
|
266
|
+
"shell": { "enabled": false },
|
|
267
|
+
"sql": { "enabled": false },
|
|
268
|
+
"go": { "enabled": false },
|
|
269
|
+
"rust": { "enabled": false },
|
|
270
|
+
"php": { "enabled": false },
|
|
271
|
+
"astro": { "enabled": false },
|
|
272
|
+
"gradle": { "enabled": false }
|
|
273
|
+
},
|
|
274
|
+
|
|
275
|
+
// === INCLUDE/EXCLUDE ===
|
|
276
|
+
"exclude": [ // Glob patterns para excluir do scan
|
|
277
|
+
"node_modules/**", "dist/**", "build/**", "coverage/**",
|
|
278
|
+
".git/**", ".next/**", ".turbo/**", ".vercel/**",
|
|
279
|
+
"**/*.min.js", "**/*.min.css", "**/*.log", "**/*.lock",
|
|
280
|
+
"package-lock.json", "yarn.lock", "pnpm-lock.yaml",
|
|
281
|
+
"**/.mahoraga/**"
|
|
282
|
+
],
|
|
283
|
+
|
|
284
|
+
// === SUPRESSÃO DE OCORRÊNCIAS ===
|
|
285
|
+
"suppress": {
|
|
286
|
+
"rules": ["no-console"], // Suprimir regras específicas
|
|
287
|
+
"severity": { "some-rule": "warning" }, // Override de severidade
|
|
288
|
+
"paths": ["**/test/**"], // Suprimir por caminho
|
|
289
|
+
"filePatterns": ["*.test.ts"] // Suprimir por padrão de arquivo
|
|
290
|
+
},
|
|
291
|
+
|
|
292
|
+
// === REGRAS PERSONALIZADAS ===
|
|
293
|
+
"rules": {
|
|
294
|
+
"nome-da-regra": {
|
|
295
|
+
"severity": "error", // error, warning, info, off
|
|
296
|
+
"exclude": ["**/generated/**"], // Exclusão por glob
|
|
297
|
+
"allowTestFiles": false // Permitir em testes
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
|
|
301
|
+
// === GUARDIAN (INTEGRIDADE) ===
|
|
302
|
+
"GUARDIAN_ENABLED": true, // Habilitar Guardian
|
|
303
|
+
"GUARDIAN_ENFORCE_PROTECTION": true, // Impedir alterações não autorizadas
|
|
304
|
+
"GUARDIAN_ALLOW_ADDS": false, // Permitir adição de arquivos
|
|
305
|
+
"GUARDIAN_ALLOW_CHG": false, // Permitir modificação de arquivos
|
|
306
|
+
"GUARDIAN_ALLOW_DELS": false, // Permitir deleção de arquivos
|
|
307
|
+
|
|
308
|
+
// === WORKERS (PARALELISMO) ===
|
|
309
|
+
"WORKER_POOL_ENABLED": true, // Habilitar worker pool
|
|
310
|
+
"WORKER_POOL_MAX_WORKERS": 0, // Máx workers (0 = auto)
|
|
311
|
+
"WORKER_POOL_BATCH_SIZE": 10, // Arquivos por lote
|
|
312
|
+
"WORKER_POOL_AUTO_THRESHOLD": 50, // Threshold para auto-pool
|
|
313
|
+
|
|
314
|
+
// === ANÁLISE ===
|
|
315
|
+
"ANALISE_INCREMENTAL_ENABLED": false, // Análise incremental
|
|
316
|
+
"ANALISE_CACHE_ENABLED": false, // Cache de análise
|
|
317
|
+
"ANALISE_CACHE_TTL_MS": 86400000, // TTL do cache (24h)
|
|
318
|
+
"ANALISE_METRICAS_ENABLED": true, // Coleta de métricas
|
|
319
|
+
"ANALISE_PRIORIZACAO_ENABLED": true, // Priorização de ocorrências
|
|
320
|
+
"ANALISE_TIMEOUT_POR_ANALISTA_MS": 30000, // Timeout por analista
|
|
321
|
+
"SCAN_ONLY": false, // Modo scan-only (sem correções)
|
|
322
|
+
"COMPACT_MODE": false, // Modo compacto
|
|
323
|
+
|
|
324
|
+
// === LIMITES DE ANÁLISE ===
|
|
325
|
+
"ANALISE_LIMITES": {
|
|
326
|
+
"FUNCOES_LONGAS": {
|
|
327
|
+
"MAX_LINHAS": 30, // Máx linhas por função
|
|
328
|
+
"MAX_PARAMETROS": 4, // Máx parâmetros
|
|
329
|
+
"MAX_ANINHAMENTO": 3 // Máx aninhamento if
|
|
330
|
+
},
|
|
331
|
+
"CODIGO_FRAGIL": {
|
|
332
|
+
"MAX_LINHAS_FUNCAO": 30,
|
|
333
|
+
"MAX_PARAMETROS": 4,
|
|
334
|
+
"MAX_NESTED_CALLBACKS": 2 // Máx callbacks aninhados
|
|
335
|
+
}
|
|
336
|
+
},
|
|
337
|
+
|
|
338
|
+
// === RELATÓRIOS ===
|
|
339
|
+
"REPORT_EXPORT_ENABLED": false, // Exportar relatórios
|
|
340
|
+
"REPORT_EXPORT_FULL": false, // Relatório completo (não diff)
|
|
341
|
+
"REPORT_OUTPUT_DIR": ".mahoraga/reports",
|
|
342
|
+
"REPORT_SILENCE_LOGS": false, // Silenciar logs durante geração
|
|
343
|
+
"REPORT_STREAM_ENABLED": false, // Streaming NDJSON
|
|
344
|
+
"REPORT_STREAM_AUTO_THRESHOLD": 5000, // Auto-stream para projetos grandes
|
|
345
|
+
"REPORT_FRAGMENT_OCCURRENCES": 2000, // Máx ocorrências por fragmento
|
|
346
|
+
"REPORT_FRAGMENT_FILEENTRIES": 500, // Máx entradas por fragmento
|
|
347
|
+
|
|
348
|
+
// === ESTRUTURA DO PROJETO ===
|
|
349
|
+
"STRUCTURE_AUTO_FIX": false, // Auto-fix de violações estruturais
|
|
350
|
+
"STRUCTURE_CONCURRENCY": 5, // Concorrência
|
|
351
|
+
"ESTRUTURA_ARQUIVOS_RAIZ_MAX": 10, // Máx arquivos na raiz
|
|
352
|
+
"ESTRUTURA_PLANO_MAX_FILE_SIZE": 262144, // Tam máx para plano (256KB)
|
|
353
|
+
|
|
354
|
+
// === CONVENÇÕES DE NOMES ===
|
|
355
|
+
"nameConventions": { // Personalizar nomes de diretórios
|
|
356
|
+
"typesDirectory": "types",
|
|
357
|
+
"testsDirectory": "tests",
|
|
358
|
+
"docsDirectory": "docs",
|
|
359
|
+
"srcDirectory": "src",
|
|
360
|
+
"componentsDirectory": "components",
|
|
361
|
+
"utilsDirectory": "utils",
|
|
362
|
+
"servicesDirectory": "services",
|
|
363
|
+
"stylesDirectory": "styles",
|
|
364
|
+
"assetsDirectory": "assets"
|
|
365
|
+
},
|
|
366
|
+
|
|
367
|
+
// === MARKDOWN DETECTOR ===
|
|
368
|
+
"detectorMarkdown": {
|
|
369
|
+
"checkProveniencia": true, // Verificar headers de proveniência
|
|
370
|
+
"checkLicenses": true, // Verificar compatibilidade de licença
|
|
371
|
+
"checkReferences": true, // Verificar referências externas
|
|
372
|
+
"headerLines": 30, // Linhas para scan de headers
|
|
373
|
+
"whitelist": {
|
|
374
|
+
"paths": [],
|
|
375
|
+
"patterns": [],
|
|
376
|
+
"dirs": []
|
|
377
|
+
},
|
|
378
|
+
"whitelistMode": "merge" // merge | replace
|
|
379
|
+
},
|
|
380
|
+
|
|
381
|
+
// === SEGURANÇA ===
|
|
382
|
+
"SAFE_MODE": true, // Modo seguro
|
|
383
|
+
"ALLOW_PLUGINS": false, // Permitir carregamento de plugins
|
|
384
|
+
"ALLOW_EXEC": false, // Permitir execução de código
|
|
385
|
+
"ALLOW_MUTATE_FS": true, // Permitir mutação do filesystem
|
|
386
|
+
|
|
387
|
+
// === AUTO-FIX ===
|
|
388
|
+
"autoFix": { // Configuração de correção automática
|
|
389
|
+
"mode": "balanced", // balanced | conservative | aggressive
|
|
390
|
+
"minConfidence": 75, // Confiança mínima (0-100)
|
|
391
|
+
"maxFixesPerArquivo": 5, // Máx correções por arquivo
|
|
392
|
+
"createBackup": true, // Criar backup (.local.bak)
|
|
393
|
+
"validateAfterFix": true, // Validar após correção
|
|
394
|
+
"allowedCategories": [
|
|
395
|
+
"security", "performance", "style", "documentation"
|
|
396
|
+
]
|
|
239
397
|
}
|
|
240
398
|
}
|
|
241
399
|
```
|
|
@@ -244,10 +402,76 @@ O Mahoraga lê um arquivo `mahoraga.config.json` na raiz do seu projeto (ou vari
|
|
|
244
402
|
|
|
245
403
|
| Variável | Descrição | Padrão |
|
|
246
404
|
|----------|-----------|--------|
|
|
247
|
-
| `LOG_LEVEL` | Nível de log | `info` |
|
|
248
|
-
| `LOG_ESTRUTURADO` | Logs em JSON | `false` |
|
|
249
|
-
| `MAHORAGA_DEBUG` |
|
|
405
|
+
| `LOG_LEVEL` | Nível de log (`erro`, `aviso`, `info`, `debug`) | `info` |
|
|
406
|
+
| `LOG_ESTRUTURADO` | Logs em JSON estruturado | `false` |
|
|
407
|
+
| `MAHORAGA_DEBUG` | Ativa modo debug | não definido |
|
|
250
408
|
| `MAHORAGA_STATE_DIR` | Diretório de estado | `.mahoraga` |
|
|
409
|
+
| `MAHORAGA_VERBOSE` | Saída verbosa | `false` |
|
|
410
|
+
| `MAHORAGA_SAFE_MODE` | Modo segurança (`0` desativa) | `1` |
|
|
411
|
+
| `MAHORAGA_ALLOW_PLUGINS` | Permite plugins (`1` ativa) | `0` |
|
|
412
|
+
| `MAHORAGA_ALLOW_EXEC` | Permite execução (`1` ativa) | `0` |
|
|
413
|
+
| `MAHORAGA_DEV` | Ativa modo dev | não definido |
|
|
414
|
+
|
|
415
|
+
---
|
|
416
|
+
|
|
417
|
+
## Supressão Inline (`@mahoraga-disable`)
|
|
418
|
+
|
|
419
|
+
Além da supressão por configuração, o Mahoraga suporta **supressão inline** via comentários no código fonte. Funciona tanto para analistas quanto para o formatador.
|
|
420
|
+
|
|
421
|
+
### Formatos
|
|
422
|
+
|
|
423
|
+
| Diretiva | Escopo | Exemplo |
|
|
424
|
+
|----------|--------|---------|
|
|
425
|
+
| `@mahoraga-disable-next-line <regras>` | Próxima linha | `// @mahoraga-disable-next-line pontuacao-repetida` |
|
|
426
|
+
| `@mahoraga-disable <regras>` | Bloco (até `@mahoraga-enable`) | `// @mahoraga-disable formatador` |
|
|
427
|
+
| `@mahoraga-enable <regras>` | Fim de bloco | `// @mahoraga-enable formatador` |
|
|
428
|
+
| `@mahoraga-disable-all` | Bloco total | `// @mahoraga-disable-all` |
|
|
429
|
+
| `@mahoraga-enable-all` | Fim de bloco total | `// @mahoraga-enable-all` |
|
|
430
|
+
|
|
431
|
+
### Sintaxes de comentário suportadas
|
|
432
|
+
|
|
433
|
+
| Linguagem | Sintaxe |
|
|
434
|
+
|-----------|---------|
|
|
435
|
+
| JS/TS/CSS | `// @mahoraga-disable regra` / `/* @mahoraga-disable regra */` |
|
|
436
|
+
| Python/Shell/YAML | `# @mahoraga-disable regra` |
|
|
437
|
+
| SQL | `-- @mahoraga-disable regra` |
|
|
438
|
+
| INI | `; @mahoraga-disable regra` |
|
|
439
|
+
| HTML | `<!-- @mahoraga-disable regra -->` |
|
|
440
|
+
|
|
441
|
+
### Regras do formatador
|
|
442
|
+
|
|
443
|
+
| Regra | Efeito |
|
|
444
|
+
|-------|--------|
|
|
445
|
+
| `pontuacao-repetida` | Impede colapso de pontuação repetida (`;;`, ` ...`, etc.) |
|
|
446
|
+
| `espacamento-incorreto` | Impede correção de espaçamento ao redor de pontuação |
|
|
447
|
+
| `formatador` | Desativa todas as correções do formatador na linha/bloco |
|
|
448
|
+
| `analista-formatador` | Desativa apenas o analista de verificação de formatação |
|
|
449
|
+
| `*` | Desativa regras de todos os sistemas |
|
|
450
|
+
|
|
451
|
+
### Exemplos
|
|
452
|
+
|
|
453
|
+
```typescript
|
|
454
|
+
// @mahoraga-disable-next-line pontuacao-repetida
|
|
455
|
+
const x = a;; // <-- os dois ;; serão preservados
|
|
456
|
+
|
|
457
|
+
// @mahoraga-disable formatador
|
|
458
|
+
function exemplo() {
|
|
459
|
+
const url = "https://example.com/path?v=1&x=2";
|
|
460
|
+
return url;
|
|
461
|
+
}
|
|
462
|
+
// @mahoraga-enable formatador
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
```bash
|
|
466
|
+
# @mahoraga-disable-next-line espacamento-incorreto
|
|
467
|
+
case $x in a) echo "a" ;; esac # <-- ;; preservado
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
```html
|
|
471
|
+
<!-- @mahoraga-disable formatador -->
|
|
472
|
+
<pre> texto com espaços intencionais </pre>
|
|
473
|
+
<!-- @mahoraga-enable formatador -->
|
|
474
|
+
```
|
|
251
475
|
|
|
252
476
|
---
|
|
253
477
|
|
|
@@ -270,8 +494,12 @@ npm run lint # ESLint
|
|
|
270
494
|
|-----------|--------|---------|
|
|
271
495
|
| JavaScript | Babel | Nativo |
|
|
272
496
|
| TypeScript | Babel | Nativo |
|
|
497
|
+
| React/JSX | Babel | Nativo |
|
|
273
498
|
| HTML | htmlparser2 | Nativo |
|
|
274
499
|
| CSS | postcss | Nativo |
|
|
500
|
+
| CSS-in-JS | postcss | Nativo |
|
|
501
|
+
| Tailwind CSS | Heurístico | Nativo |
|
|
502
|
+
| SVG | Heurístico | Nativo |
|
|
275
503
|
| XML | fast-xml-parser | Nativo |
|
|
276
504
|
| Python | Heurístico | Nativo |
|
|
277
505
|
| PHP | Heurístico | Nativo |
|
|
@@ -284,12 +512,27 @@ npm run lint # ESLint
|
|
|
284
512
|
|
|
285
513
|
## Qualidade
|
|
286
514
|
|
|
287
|
-
- TypeScript
|
|
288
|
-
- Testes com Vitest
|
|
289
|
-
- ESLint 10.x
|
|
290
|
-
- Worker pool
|
|
291
|
-
- i18n
|
|
292
|
-
- Schema versioning
|
|
515
|
+
- **TypeScript estrito**: `strict: true`, `verbatimModuleSyntax: true`
|
|
516
|
+
- **Testes com Vitest**: ~3300 testes em ~240 arquivos
|
|
517
|
+
- **ESLint 10.x**: configuração strict
|
|
518
|
+
- **Worker pool**: processamento paralelo
|
|
519
|
+
- **i18n**: PT, EN, ZH, JA
|
|
520
|
+
- **Schema versioning**: relatórios versionados
|
|
521
|
+
- **Documentação viva**: `Docs/` em formato Obsidian vault
|
|
522
|
+
|
|
523
|
+
---
|
|
524
|
+
|
|
525
|
+
## Documentação
|
|
526
|
+
|
|
527
|
+
A documentação completa do projeto está disponível em `Docs/` no formato **Obsidian vault**:
|
|
528
|
+
|
|
529
|
+
- **Arquitetura**: camadas, fluxos, diagramas, ADRs
|
|
530
|
+
- **Componentes**: documentação de todos os módulos
|
|
531
|
+
- **Guias**: contribuição, testes, referência de comandos
|
|
532
|
+
- **Glossário**: termos do domínio de A a Z
|
|
533
|
+
- **Referências**: links, specs, configurações
|
|
534
|
+
|
|
535
|
+
Abra `Docs/` como vault no [Obsidian](https://obsidian.md/) para navegação completa com wikilinks.
|
|
293
536
|
|
|
294
537
|
---
|
|
295
538
|
|
|
@@ -297,7 +540,7 @@ npm run lint # ESLint
|
|
|
297
540
|
|
|
298
541
|
Contribuições são bem-vindas! Como o projeto não está mais no GitHub:
|
|
299
542
|
|
|
300
|
-
1. Entre em contato pelo e-mail: [ProtonMail](mailto:mahoraga.
|
|
543
|
+
1. Entre em contato pelo e-mail: [ProtonMail](mailto:mahoraga.able522@passfwd.com)
|
|
301
544
|
2. Envie patches ou sugestões por e-mail
|
|
302
545
|
3. Reporte bugs com descrição detalhada e exemplo mínimo
|
|
303
546
|
|
|
@@ -2,6 +2,7 @@ import { parse as babelParse } from '@babel/parser';
|
|
|
2
2
|
import traverse from '@babel/traverse';
|
|
3
3
|
import * as t from '@babel/types';
|
|
4
4
|
import { getMessages } from '../../core/messages/index.js';
|
|
5
|
+
import { isWhitelistedConstant } from '../../shared/helpers/index.js';
|
|
5
6
|
const MAX_MESSAGE_PREVIEW_LENGTH = 60;
|
|
6
7
|
const BUG_PATTERNS = [
|
|
7
8
|
{
|
|
@@ -224,6 +225,10 @@ const BUG_PATTERNS = [
|
|
|
224
225
|
const matches = content.matchAll(magicNumPattern);
|
|
225
226
|
const results = [];
|
|
226
227
|
for (const m of matches) {
|
|
228
|
+
const value = parseInt(m[0], 10);
|
|
229
|
+
if (isWhitelistedConstant(value, [])) {
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
227
232
|
const line = contarLinhasAtePos(content, m.index);
|
|
228
233
|
const lineContent = content.split('\n')[line - 1] || '';
|
|
229
234
|
if (!lineContent.includes('const') && !lineContent.includes('let') && !lineContent.includes('var') && !lineContent.includes('//') && !lineContent.includes('/*')) {
|
|
@@ -8,9 +8,9 @@ const LICENCA_PADROES = {
|
|
|
8
8
|
referenciasRisco: [/Stack\s*Overflow/i, /(?:^|https?:\/\/|\/\/)(?:[^\/\s@]+\.)?stackoverflow\.com(?::\d+)?(?:[\/?#]|$)/i, /\bassign\b/i, /\bcession\b/i]
|
|
9
9
|
};
|
|
10
10
|
const PADRAO_LISTA_BRANCA = {
|
|
11
|
-
paths: ['.github/copilot-instructions.md', 'docs/POLICY-PROVENIENCIA.md', 'docs/partials/AVISO-PROVENIENCIA.md'],
|
|
11
|
+
paths: ['.github/copilot-instructions.md', 'docs/POLICY-PROVENIENCIA.md', 'docs/partials/AVISO-PROVENIENCIA.md', 'README.md'],
|
|
12
12
|
patterns: ['**/reports/**', 'docs/history/**', 'tests/**', 'tmp*.md'],
|
|
13
|
-
dirs: ['pre-public', 'preview-mahoraga', '.abandonados', '.deprecados', 'reports']
|
|
13
|
+
dirs: ['pre-public', 'preview-mahoraga', '.abandonados', '.deprecados', 'reports', 'docs']
|
|
14
14
|
};
|
|
15
15
|
function createRiskRegex() {
|
|
16
16
|
const allPadroes = [...LICENCA_PADROES.incompativeis, ...LICENCA_PADROES.cessaoDireitos, ...LICENCA_PADROES.referenciasRisco].map(raiz => raiz.source).join('|');
|