chore: npm workspaces na raiz, e o setup instalando linter e formatação - #9
Merged
Merged
Conversation
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>
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>
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #
O que este PR faz e por quê
Dois defeitos do
/utf-setupque 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.jsonda raiz "com os scripts de orquestração descritos noarchitecture.md" — só que oarchitecture.mdnã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 (ojson-serverna raiz, o Angular emapps/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 opackage.jsondeclarado 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 deapps/webantes de a raiz existir, o hoisting não acontece, e sobra umnode_modulesduplicado 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 newnão traz ESLint. O setup declarava um comando, exigia que ele passasse, e entregava ao aluno umnpm run lintinexistente. Agora o Passo 2 rodang add angular-eslintquando o documento declara comando de lint, e o Passo 3 acrescenta Prettier,eslint-config-prettier,.prettierrce.editorconfigna raiz. Oeslint-config-prettiernão é precaução teórica: a config recomendada do angular-eslint incluitseslint.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