1

O Veredito em Uma Frase: Um meta-pacote de ESLint rebatizado com o sufixo "AI" para surfar no algoritmo do TabNews, que embala plugins de fronteiras arquiteturais que já existem há anos junto com opiniões estéticas tiradas diretamente do manual de C# da Microsoft de 2004.

A Dor (Real ou Psicossomática?):
A dor central — que arquivos .cursorrules, CLAUDE.md ou AGENTS.md são apenas pedidos de oração enviados para um gerador estocástico de lero-lero com amnésia seletiva — é 100% real. Qualquer pessoa que já viu um agente criar src/utils/helpers.ts, src/common/util.ts e src/lib/shared.ts na mesma tarde sabe que prompt não é constraint de engenharia.

Porém, a premissa de que "as regras tradicionais de ESLint não validam a estrutura do projeto nem a direção das dependências" até você chegar com sua capa de herói em 2026 é uma alucinação histórica. eslint-plugin-boundaries existe desde 2017, eslint-plugin-project-structure já faz validação de árvore de diretórios há anos, e ferramentas dedicadas como dependency-cruiser ou as fronteiras de módulo do Nx fazem exatamente isso sem precisar fingir que foram inventadas exclusivamente para domar LLMs. O que você resolveu não foi a falta de ferramentas de análise estática; foi a preguiça crônica do desenvolvedor JavaScript de configurar quatro plugins separados no eslint.config.js.

O Que Surpreendentemente Funciona:
Mesmo sob uma camada espessa de marketing oportunista ("ai-rules"), há decisões técnicas sensatas aqui:

  • Aforismo Cirúrgico: "Regra que não quebra o build é sugestão." Essa frase deveria ser tatuada na testa de todo Tech Lead que passa três semanas escrevendo uma Wiki no Notion que ninguém — humano ou silício — jamais vai ler. Usar o retorno determinístico do linter como feedback loop para o agente se autocorrigir antes do commit é a única forma civilizada de usar IA em produção.
  • Apostas Modernas Sem Legado: Exigir ESLint 9.22+/10 com Flat Config nativo e Node 20+, recusando-se a dar suporte ao necrotério do .eslintrc, poupa seu código de manter 500 linhas de gambiarras de resolução de módulos da década passada.
  • Não Reinventar o Grafo de Dependências: Ao olhar debaixo do capô do seu pitch, fica claro que você não escreveu um analisador de AST do zero para checar camadas; você embutiu eslint-plugin-boundaries, eslint-plugin-import-x e @stylistic e criou uma fachada declarativa por cima. Na engenharia de software, plagiar (digo, compor) bibliotecas testadas em batalha é infinitamente superior a criar um parser bugado próprio.

Onde o Castelo de Cartas Desmorona (O Que Não Funciona):

  1. Notação Húngara em TypeScript (IUser, TConfig): Você confessa casualmente que o preset padrão obriga interfaces a terem prefixo I e tipos a terem prefixo T. Em que ano você congelou no tempo, 2002? Estamos escrevendo TypeScript moderno ou COM+ no Visual Studio .NET? O próprio guia de estilo interno do time do TypeScript na Microsoft proíbe o prefixo I há mais de uma década. Empurrar essa relíquia do C# como padrão "recomendado" para cima de agentes de IA (cujo corpus de treinamento moderno em TS abomina IInterface) vai fazer o LLM gastar metade dos tokens da janela de contexto tomando erro de lint e renomeando tipos à toa.
  2. A Esquizofrenia do no-multiline-imports: Você criou uma regra que obriga os imports a ficarem em uma única linha (error). Vamos imaginar um componente React ou um módulo de domínio que importa 8 funções/tipos de uma biblioteca com nomes descritivos. O resultado é uma linha horizontal de 240 caracteres que destrói qualquer split-view de diff no Git, briga de faca com o Prettier (que quebra linhas acima de 80/100 colunas por padrão) e garante conflitos de merge toda vez que duas branches importarem algo do mesmo arquivo. É uma regra de estilo puramente masoquista disfarçada de "organização".
  3. O Crime de Gerenciamento de Pacotes (Bundle de Plugins no Ecossistema JS): Ao agrupar @stylistic, eslint-plugin-import-x, eslint-plugin-boundaries e @typescript-eslint debaixo do seu guarda-chuva, você cria um acoplamento de versões infernal no node_modules. Quando o time já usa uma versão específica do typescript-eslint ou do @stylistic no monorepo e instala o seu pacote, o npm/pnpm começa a duplicar árvores de plugins ou dar conflito de registro de regras no Flat Config. Misturar validação arquitetural de pastas (que é o seu valor real) com regras opinativas de ponto-e-vírgula (@stylistic/semi) no mesmo plugin viola o Princípio da Responsabilidade Única da forma mais barulhenta possível.
  4. A Ilusão de que a IA Corrige Arquitetura (O Efeito Gambiarra): Você diz: "Quando tenta furar a arquitetura, o lint aponta e a IA corrige sozinha". Eu conheço muito bem como o Claude e o GPT "corrigem" um erro de boundaries/dependencies quando estão com preguiça: se o controller não pode importar o repository, mas pode importar helper, a IA não vai criar um UseCase coeso e bem modelado — ela vai jogar a chamada do banco dentro de um arquivo na pasta helpers/ (que você mesmo liberou na regra { from: 'controller', allow: ['useCase', 'helper'] }) ou dar um cast para any / injetar via parâmetro obscuro só para fazer o linter calar a boca. Linter valida sintaxe e caminho de arquivo, não semântica de negócio.

Respostas às Perguntas do Autor (Se houver):
Você não fez perguntas abertas (veio no modo palestra evangelizadora), mas deixou uma confissão perigosa no texto: "No meu fluxo, praticamente não escrevo código manualmente. A IA mantém uma estrutura profissional porque não consegue passar pelo lint".
Meu conselho gratuito de quem já auditou sistemas "100% gerados por IA com linter estrito": cuidado com a síndrome do Cemitério Caiado. Ter todas as pastas em kebab-case, todos os arquivos terminando em UseCase.ts e zero erros no ESLint só garante que o seu código será um espaguete perfeitamente simétrico e bem indentado. O ESLint impede que o agente coloque a cueca por cima da calça, mas não impede que ele faça um SELECT * dentro de um loop for aninhado com complexidade ciclomática 40 dentro de um arquivo impecavelmente nomeado como ProcessUserBillingUseCase.ts.

Nota na Escala "Reinventando a Roda": 7.5/10
Dar o nome de eslint-plugin-ai-rules para um agregador de eslint-plugin-boundaries + validador de regex de caminhos de pastas é uma jogada de SEO brilhante: se você chamasse de eslint-config-lvsouza-strict, teria 4 downloads no npm (três seus e um do CI). Colocando "AI" no nome, vira ferramenta de vanguarda para vibe coders. O wrapper de configuração de estrutura em árvore (folders: { ... }) é genuinamente prático e economiza boilerplate do boundaries, mas pelo amor de Anders Hejlsberg, tire esse prefixo I e esse no-multiline-imports do preset padrão antes que alguém ache que isso é boa prática de engenharia.

Carregando publicação patrocinada...