|
| 1 | +# CLAUDE.md — flutter_modular |
| 2 | + |
| 3 | +Guia rápido para trabalhar neste repositório. Explicações simples + o que fazer |
| 4 | +e o que **não** fazer. Leia antes de mexer no código ou na documentação. |
| 5 | + |
| 6 | +## O que é este projeto |
| 7 | + |
| 8 | +`flutter_modular` é um pacote Flutter de **injeção de dependência + gerência de |
| 9 | +rotas**, com **estado escopo-de-página** (page-scoped). A versão atual é a **v7**, |
| 10 | +uma reescrita do zero (branch `v7`). |
| 11 | + |
| 12 | +> Era um monorepo (melos). Agora é **um único pacote** na raiz. `modular_core` foi |
| 13 | +> achatado para dentro de `flutter_modular`, e `shelf_modular` está sendo |
| 14 | +> descontinuado. |
| 15 | +
|
| 16 | +## Estrutura do repositório |
| 17 | + |
| 18 | +``` |
| 19 | +lib/ # o pacote flutter_modular v7 (código publicado) |
| 20 | + flutter_modular.dart # exports públicos |
| 21 | + src/{app,module,navigation,route,state}/ |
| 22 | +test/ # testes do pacote (flutter test) |
| 23 | +example/ # app de demonstração (rotas aninhadas, guards, DI, etc.) |
| 24 | +doc/ # site de documentação (Docusaurus 3.10) — NÃO é o pacote |
| 25 | + docs/ # markdown das docs (fonte da verdade do conteúdo) |
| 26 | +tool/docs_mcp/ # servidor MCP em Dart que SERVE as docs (pacote pub.dev separado) |
| 27 | +art/ # identidade visual (logo Modular) |
| 28 | +``` |
| 29 | + |
| 30 | +## API v7 (use estes idiomas — não os da v6) |
| 31 | + |
| 32 | +```dart |
| 33 | +// Módulo = DI + rotas, declarado de forma funcional: |
| 34 | +final appModule = createModule(register: (c) { |
| 35 | + c |
| 36 | + ..addSingleton<Counter>(Counter.new) |
| 37 | + ..route('/', child: (ctx, state) => const HomePage()) |
| 38 | + ..route('/details/:id', child: (ctx, state) => DetailsPage(id: state.params['id']!)) |
| 39 | + ..module('/admin', module: adminModule); |
| 40 | +}); |
| 41 | +
|
| 42 | +// Bootstrap (ModularApp acima do MaterialApp): |
| 43 | +ModularApp(module: appModule, child: AppRoot()); |
| 44 | +MaterialApp.router(routerConfig: ModularApp.routerConfigOf(context)); |
| 45 | +
|
| 46 | +// Navegação: |
| 47 | +context.pushNamed('/details/42'); // empilha página (push NÃO entra na URL) |
| 48 | +context.navigate('/'); // troca a stack (dona da URL, reseta histórico) |
| 49 | +context.pop(result); // volta entregando resultado ao pushNamed |
| 50 | +
|
| 51 | +// Estado page-scoped (criado e descartado junto com a rota): |
| 52 | +c.route('/counter', |
| 53 | + provide: (s) => s.addChangeNotifier<CounterVM>(CounterVM.new), |
| 54 | + child: (ctx, state) => const CounterPage()); |
| 55 | +final vm = context.watch<CounterVM>(); // rebuild quando notifica |
| 56 | +``` |
| 57 | + |
| 58 | +Modelo de rotas v7: a **URL representa a base da stack** (push não aparece na |
| 59 | +URL); rotas são **relativas** (semântica de diretório); deep-link entra via |
| 60 | +`defaultRouteName`; `navigatorKey`/`observers` ficam no `ModularApp`. |
| 61 | + |
| 62 | +## Comandos comuns |
| 63 | + |
| 64 | +```sh |
| 65 | +# Pacote (raiz): |
| 66 | +flutter test # roda os testes |
| 67 | +flutter analyze # lint (usa flutterando_analysis) |
| 68 | + |
| 69 | +# Exemplo: |
| 70 | +cd example && flutter run |
| 71 | + |
| 72 | +# Site de docs (Docusaurus): |
| 73 | +cd doc && yarn install && yarn start # dev em http://localhost:3000 |
| 74 | +cd doc && yarn build # build de produção |
| 75 | + |
| 76 | +# Servidor MCP de docs: |
| 77 | +cd tool/docs_mcp && dart test # testes do servidor |
| 78 | +``` |
| 79 | + |
| 80 | +## ✅ Faça (DO) |
| 81 | + |
| 82 | +- Use a **API v7** (acima). Confira `README.md`, `lib/` e `example/` como fonte |
| 83 | + da verdade da API. |
| 84 | +- Rode `flutter test` e `flutter analyze` antes de concluir uma mudança no pacote. |
| 85 | +- Siga **Conventional Commits** (`feat:`, `fix:`, `docs:`, `chore:` …) — veja |
| 86 | + `CONTRIBUTING.md`. |
| 87 | +- Mantenha o pacote raiz enxuto: só `lib/` (mais os metadados) vai para o pub.dev. |
| 88 | +- Para o fluxo de release do MCP, siga o passo a passo em |
| 89 | + [`tool/docs_mcp/CLAUDE.md`](tool/docs_mcp/CLAUDE.md). |
| 90 | + |
| 91 | +## ❌ Não faça (DON'T) |
| 92 | + |
| 93 | +- **Não** use a API da v6 (`extends Module`, `Modular.get`, `Modular.to.push`). |
| 94 | + É a v7 agora. |
| 95 | +- **Não** conserte os testes do `shelf_modular` — ele está sendo descontinuado. |
| 96 | +- **Não** confie nas docs em `doc/docs/flutter_modular/**` para a API: o prosa |
| 97 | + ainda descreve a **v6** e contradiz o README v7. Ao escrever docs novas, use a |
| 98 | + API v7. |
| 99 | +- **Não** edite `tool/docs_mcp/lib/src/generated/docs_data.g.dart` à mão — é |
| 100 | + gerado (veja lembrete abaixo). |
| 101 | +- **Não** faça blanket-exclude de `tool/` no `.pubignore` da raiz (veja gotcha). |
| 102 | + |
| 103 | +## ⚠️ Lembretes importantes (tipo) |
| 104 | + |
| 105 | +**Mexeu na documentação → rebuilde o MCP e republique.** As docs ficam |
| 106 | +**embutidas em build time** dentro do servidor MCP. Editar `doc/docs` **não muda |
| 107 | +nada** até regenerar o índice. Sempre que adicionar/alterar conteúdo em |
| 108 | +`doc/docs`: |
| 109 | + |
| 110 | +1. Regenere o índice embutido: |
| 111 | + ```sh |
| 112 | + cd tool/docs_mcp && dart run bin/build_index.dart |
| 113 | + ``` |
| 114 | + (varre `doc/docs`: `intro.md`, `platforms.md`, `flutter_modular/**`; ignora |
| 115 | + `legacy*/` e `shelf_modular/`). Isso reescreve `lib/src/generated/docs_data.g.dart`. |
| 116 | +2. Verifique: `dart analyze` e `dart test` (ambos limpos). |
| 117 | +3. **Bump de versão em DOIS lugares** (precisam bater): `pubspec.yaml` → `version:` |
| 118 | + e `lib/src/server.dart` → `const String serverVersion`; adicione entrada no |
| 119 | + `CHANGELOG.md`. |
| 120 | +4. Commit (o `dart pub publish` só envia arquivos versionados no git). |
| 121 | +5. `dart pub publish --dry-run` → depois `dart pub publish`. |
| 122 | +6. Recompile o binário local para o Claude Code pegar o conteúdo novo: |
| 123 | + ```sh |
| 124 | + dart compile exe bin/server.dart -o ~/.local/bin/flutter_modular_docs_mcp |
| 125 | + ``` |
| 126 | + (MCP carrega no início da sessão — abra uma sessão nova do Claude Code.) |
| 127 | + |
| 128 | +Passo a passo completo: [`tool/docs_mcp/CLAUDE.md`](tool/docs_mcp/CLAUDE.md). |
| 129 | + |
| 130 | +**Gotcha do `.pubignore`.** `dart pub publish` aplica o `.pubignore` da **raiz** |
| 131 | +também aos pacotes aninhados (`tool/docs_mcp`). Se a raiz fizer blanket-exclude de |
| 132 | +`tool/`, o publish do `flutter_modular_docs_mcp` sai com o archive **vazio** |
| 133 | +("the pubspec is hidden", "LICENSE missing", "bin/server.dart does not exist"). |
| 134 | +Exclua apenas artefatos de build sob `tool/` (`tool/**/.dart_tool/`, |
| 135 | +`tool/**/build/`), não a pasta inteira. |
| 136 | + |
| 137 | +**Os docs estão atrasados (v6).** A reescrita da prosa de `doc/docs` para a API |
| 138 | +v7 é trabalho em aberto. Até lá, o MCP serve conteúdo v6 — regenerar só re-embute |
| 139 | +o que estiver em `doc/docs`. |
0 commit comments