Skip to content

chore: npm workspaces na raiz, e o setup instalando linter e formatação - #9

Merged
ronifabio merged 3 commits into
mainfrom
chore/npm-workspaces
Sep 10, 2026
Merged

ronifabio merged 3 commits into
mainfrom
chore/npm-workspaces

Conversation

@ronifabio

@ronifabio ronifabio commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

Closes #

O que este PR faz e por quê

Dois defeitos do /utf-setup que só apareceram quando fui escrever o enunciado da atividade que roda esse comando. Os dois têm a mesma forma: o workflow exige uma coisa que ele mesmo nunca cria.

Primeiro, a raiz do monorepo. O Passo 3 mandava criar o package.json da raiz "com os scripts de orquestração descritos no architecture.md" — só que o architecture.md não tinha seção nenhuma onde descrevê-los, e a raiz nem aparecia na árvore do §3. Cada equipe inventava a própria raiz, e o setup adivinhava. Pior: sem workspaces o repositório tem dois pacotes com dependências de verdade (o json-server na raiz, o Angular em apps/web), então quem clona instala duas vezes, em duas pastas — a fricção clássica que derruba integrante novo, sem dar mensagem de erro nenhuma. O documento ganha a §3.1 com o package.json declarado por extenso (private, workspaces: ["apps/*"], os scripts) e a nota explicando o que isso compra. O workflow ganha a ordem correta, que é a parte sutil: gerar com --skip-install, criar a raiz, e só então instalar uma vez — fora dessa ordem o npm instala dentro de apps/web antes de a raiz existir, o hoisting não acontece, e sobra um node_modules duplicado que ninguém percebe porque tudo continua funcionando.

Segundo, o linter. O Passo 5 manda rodar o lint como prova de vida, e o §2 exige declarar "os comandos exatos de suíte e lint" — mas nada instalava linter nenhum, e o ng new não traz ESLint. O setup declarava um comando, exigia que ele passasse, e entregava ao aluno um npm run lint inexistente. Agora o Passo 2 roda ng add angular-eslint quando o documento declara comando de lint, e o Passo 3 acrescenta Prettier, eslint-config-prettier, .prettierrc e .editorconfig na raiz. O eslint-config-prettier não é precaução teórica: a config recomendada do angular-eslint inclui tseslint.configs.stylistic, então o conflito com o Prettier é real.

Nx e Turborepo seguem fora, e agora o documento diz por quê em vez de só omitir: eles resolvem cache de build e grafo de dependências entre muitos subprojetos, que não é o problema desta disciplina. Extensão de IDE também fica de fora de propósito — o que se versiona aqui é a regra que o agente lê; obedecer a ela é configuração da máquina de cada um.

Apontamentos da revisão

Não se aplica — PR de manutenção, sem spec.md.

🤖 Generated with Claude Code

O `architecture.md` mandava o `/utf-setup` copiar "os scripts de orquestração
descritos no documento", mas não havia seção nenhuma onde descrevê-los — e a
raiz sequer aparecia na árvore do §3. Sem isso, cada repositório inventava a
sua raiz, e quem clonava instalava dependência duas vezes: uma na raiz (pelo
json-server) e outra em `apps/web`.

- `docs/architecture.md`: nova §3.1 com o `package.json` da raiz —
  `"private": true`, `"workspaces": ["apps/*"]` e os scripts `start`, `build`,
  `test`, `lint` e `api`. A raiz também passa a aparecer na árvore do §3.
- `.agents/workflows/utf-setup.md`: gerar o app com `--skip-install` e instalar
  uma vez só, na raiz, depois que o `package.json` dela existir. Fora dessa
  ordem o npm cria um `node_modules` dentro de `apps/web` e o hoisting não
  acontece — sem erro nenhum, só desperdício invisível.

Nx e Turborepo continuam fora: resolvem cache de build e grafo de dependências
entre muitos subprojetos, que não é o problema desta disciplina.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ronifabio ronifabio added the manutencao PR tecnico, sem spec label Sep 10, 2026
O Passo 5 mandava rodar o lint como prova de vida, e o `architecture.md` §2 exige
declarar "os comandos exatos de suíte e lint" — mas nada instalava linter nenhum.
O `ng new` não traz ESLint. Na prática o setup declarava um comando, exigia que
ele passasse, e deixava o aluno com `npm run lint` inexistente.

- Passo 2: `ng add angular-eslint` quando o documento declara comando de lint —
  gera o `eslint.config.js` e o alvo `lint` no `angular.json`. (O pacote é
  `angular-eslint`; `@angular-eslint/schematics` é o nome antigo.)
- Passo 3, item 4: Prettier e `eslint-config-prettier` na raiz, mais `.prettierrc`
  e `.editorconfig`, e o script `format`. O `eslint-config-prettier` não é
  precaução teórica: a config recomendada do angular-eslint inclui
  `tseslint.configs.stylistic`, que conflita com o Prettier de verdade.
- `architecture.md`: a linha de testes passa a dizer que o linter não vem no
  gerador, e o §3.1 ganha o script `format`.

Extensão de IDE fica de fora de propósito — o que se versiona aqui é a regra que
o agente lê; obedecer a ela é configuração da máquina de cada um.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ronifabio ronifabio changed the title chore: adota npm workspaces na raiz do monorepo chore: npm workspaces na raiz, e o setup instalando linter e formatação Sep 10, 2026
O /utf-design conduzia uma entrevista inteira para decidir paleta com papel
semântico, tipografia, espaçamento e breakpoints — e nada nunca escrevia isso no
arquivo de estilo do app. O `design-tokens.md` prometia ser "de onde a IA vai ler
quando começar a gerar tela", mas o Tailwind lê o bloco `@theme`, não o Markdown.
Na prática o aluno decidia a paleta e o app seguia com as cores de fábrica.

- Passo 2: depois de instalar o framework CSS, o setup **pergunta** se escreve o
  bloco de tema a partir do `design-tokens.md` ou se o aluno prefere escrever.
  Escrevendo, transcreve só o que está no documento para os namespaces do
  Tailwind, mantendo os nomes semânticos da equipe; valor ausente é pergunta,
  nunca invenção. Biblioteca com mecanismo próprio de tema (daisyUI) usa o dela,
  para não declarar cor em dois lugares.
- Passo 0: `docs/design-tokens.md` entra nas pré-condições, já que agora é lido.
- Passo 6: o despacho do tutor leva o `design-tokens.md` e o arquivo de estilo.
- Tutor, modo `setup`: nova seção "O tema, do documento ao CSS" — token por
  token, por que o nome é o do papel e não o da cor, e o que muda no app inteiro
  quando um valor é trocado.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ronifabio
ronifabio merged commit 402f0f8 into main Sep 10, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

manutencao PR tecnico, sem spec

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant