Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 88 additions & 0 deletions .claude/instructions/android-patterns.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# Android / KMP — Instruções de plataforma

> Leia este arquivo ao iniciar qualquer task Android/KMP. Ignore `ios/` e `flutter/`.

---

## Abstrações principais

| Classe | Papel |
|---|---|
| `CraftDBuilder` | Interface base para criar componentes |
| `CraftDBuilderManager` | Registra e resolve builders pelo `key` |
| `CraftDynamic` | Composable principal que renderiza o SDUI |
| `SimpleProperties` | Modelo base de dados (`key` + `value` JSON) |
| `ActionProperties` | Dados de ação (deeplink + analytics) |
| `CraftDComponentKey` | Enum com as chaves de componentes built-in |
| `CraftDViewListener` | Callback de ações para o consumidor |

---

## Estrutura de pastas

### craftd-core (modelos e abstrações)
```
commonMain/
data/
model/
base/ → SimpleProperties, SimplePropertiesResponse
action/ → ActionProperties, AnalyticsProperties
[name]/ → [Name]Properties.kt para cada componente
domain/ → enums e sealed classes (CraftDAlign, CraftDTextStyle)
presentation/ → CraftDViewListener, CraftDComponentKey
extensions/ → funções de extensão
```

### craftd-compose (implementação Compose/KMP)
```
commonMain/
builder/ → CraftDBuilder.kt (interface), CraftDBuilderManager.kt
ui/
[name]/
CraftD[Name].kt → o @Composable do componente
CraftD[Name]Builder.kt → implementa CraftDBuilder
extensions/ → funções utilitárias Compose
```

### craftd-xml (implementação View System)
```
src/main/kotlin/.../
ui/
[name]/
CraftD[Name]Component.kt → custom View
CraftD[Name]ComponentRender.kt → implementa CraftDViewRenderer
builder/
CraftDBuilderManager.kt → getBuilderRenders()
```

### Padrão por novo componente (exemplo: CraftDFoo)

1. `craftd-core/commonMain/data/model/foo/FooProperties.kt` — data class do modelo
2. `craftd-compose/commonMain/ui/foo/CraftDFoo.kt` — composable
3. `craftd-compose/commonMain/ui/foo/CraftDFooBuilder.kt` — builder
4. `craftd-xml/src/main/kotlin/.../ui/foo/CraftDFooComponent.kt` — custom View
5. `craftd-xml/src/main/kotlin/.../ui/foo/CraftDFooComponentRender.kt` — render
6. Registrar no `CraftDBuilderManager` de cada módulo
7. Adicionar ao `app-sample-android` (Compose + XML) e ao `dynamic.json`

---

## Princípios Compose

- Composables **stateless** — estado vem do caller (state hoisting)
- Todo componente expõe `modifier: Modifier = Modifier`
- Sem valores hardcoded de cor ou tipografia — usar `MaterialTheme.colorScheme` e `MaterialTheme.typography`
- Todo componente interativo: touch target mínimo de 48x48dp

## Build

- Dependências sempre via `libs.versions.toml` — nunca versão hardcoded no `build.gradle.kts`
- Configuração compartilhada entre módulos vai em convention plugin no `build-logic/`
- Rodar `./gradlew build` em `android_kmp/` após cada task antes de marcar `[x]`

## Testes

- JUnit4 + MockK para testes Android
- `kotlin("test")` + `kotlinx.serialization` + `compose.runtime` para commonTest
- Nomenclatura em backtick: `` `given X when Y then Z` ``
- Path espelha o source: `src/commonTest/kotlin/...`
50 changes: 50 additions & 0 deletions .claude/instructions/flutter-patterns.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# Flutter — Instruções de plataforma

> Leia este arquivo ao iniciar qualquer task Flutter. Ignore `android_kmp/` e `ios/`.

---

## Abstrações principais

| Classe | Papel |
|---|---|
| `CraftDynamic` | Widget principal que renderiza o SDUI |
| `CraftDViewListener` | Callback de ações para o consumidor |
| `SimpleProperties` | Modelo base de dados |
| `ActionProperties` | Dados de ação (deeplink + analytics) |
| `CraftDAlign` | Alinhamento de componentes |

---

## Estrutura de pastas

```
flutter/craftd_widget/
lib/
src/
builder/ → CraftDBuilder (abstract), CraftDBuilderManager
ui/
[name]/
craftd_[name].dart → Widget do componente
craftd_[name]_builder.dart → implementa CraftDBuilder
model/
[name]_properties.dart → classe do modelo
```

## Padrão por novo componente (exemplo: CraftDFoo)

1. `lib/src/model/foo_properties.dart` — classe do modelo
2. `lib/src/ui/foo/craftd_foo.dart` — Widget
3. `lib/src/ui/foo/craftd_foo_builder.dart` — implementa CraftDBuilder
4. Registrar no `CraftDBuilderManager`
5. Adicionar ao sample app Flutter

## Convenções

- Nomes de arquivos em `snake_case`
- Classes em `PascalCase` com prefixo `CraftD`
- Dependências externas (ex: cached_network_image) injetadas via construtor, nunca acopladas no builder

## Referência

Consultar `CraftDButton` / `CraftDButtonBuilder` como padrão antes de criar algo novo.
44 changes: 44 additions & 0 deletions .claude/instructions/ios-patterns.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# iOS / SwiftUI — Instruções de plataforma

> Leia este arquivo ao iniciar qualquer task iOS. Ignore `android_kmp/` e `flutter/`.

---

## Abstrações principais

| Classe | Papel |
|---|---|
| `CraftDBuilder` | Protocol base para criar componentes |
| `CraftDBuilderManager` | Registra e resolve builders pelo `key` |
| `CraftDynamic` | View principal que renderiza o SDUI |
| `SimpleProperties` | Modelo base de dados |
| `ActionProperties` | Dados de ação (deeplink + analytics) |
| `CraftDViewListener` | Callback de ações para o consumidor |

---

## Estrutura de pastas

```
ios/craftd-swiftui/
Sources/CraftD/
builder/ → CraftDBuilder.swift (protocol), CraftDBuilderManager.swift
ui/
[name]/
CraftD[Name].swift → SwiftUI View do componente
CraftD[Name]Builder.swift → implementa CraftDBuilder
model/
[Name]Properties.swift → struct do modelo
```

## Padrão por novo componente (exemplo: CraftDFoo)

1. `Sources/CraftD/model/FooProperties.swift` — struct do modelo
2. `Sources/CraftD/ui/foo/CraftDFoo.swift` — SwiftUI View
3. `Sources/CraftD/ui/foo/CraftDFooBuilder.swift` — implementa CraftDBuilder
4. Registrar no `CraftDBuilderManager`
5. Adicionar ao sample app iOS

## Referência

Consultar `CraftDButton` / `CraftDButtonBuilder` como padrão antes de criar algo novo.
161 changes: 84 additions & 77 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,106 +56,113 @@ docs/ # documentação do site (MkDocs)

---

## Abstrações principais por plataforma
## Contexto por plataforma

As três plataformas espelham os mesmos conceitos com nomes equivalentes.
Antes de iniciar qualquer task, identifique a plataforma e leia o arquivo correspondente em `.claude/instructions/`:

### Android / KMP (Kotlin)
- Android/KMP → `.claude/instructions/android-patterns.md`
- iOS → `.claude/instructions/ios-patterns.md`
- Flutter → `.claude/instructions/flutter-patterns.md`

| Classe | Papel |
|---|---|
| `CraftDBuilder` | Interface base para criar componentes |
| `CraftDBuilderManager` | Registra e resolve builders pelo `key` |
| `CraftDynamic` | Composable principal que renderiza o SDUI |
| `SimpleProperties` | Modelo base de dados (`key` + `value` JSON) |
| `ActionProperties` | Dados de ação (deeplink + analytics) |
| `CraftDComponentKey` | Enum com as chaves de componentes built-in |
| `CraftDViewListener` | Callback de ações para o consumidor |
Ao gerar um `proposal.md` via `/propose`, detecte a plataforma na descrição do usuário e adicione frontmatter no início do arquivo:

### iOS / SwiftUI (Swift — `ios/craftd-swiftui/`)
```
---
platform: android # mencionou android / compose / xml / kmp
platform: ios # mencionou ios / swiftui / swift
platform: flutter # mencionou flutter / dart
platform: all # multiplatforma ou não ficou claro
---
```

| Classe | Papel |
|---|---|
| `CraftDBuilder` | Protocol base para criar componentes |
| `CraftDBuilderManager` | Registra e resolve builders pelo `key` |
| `CraftDynamic` | View principal que renderiza o SDUI |
| `SimpleProperties` | Modelo base de dados |
| `ActionProperties` | Dados de ação (deeplink + analytics) |
| `CraftDViewListener` | Callback de ações para o consumidor |
Ao iniciar `/apply`, leia o campo `platform:` do `proposal.md` da change e carregue o arquivo de instructions correspondente antes de qualquer outra leitura.

### Flutter (Dart — `flutter/craftd_widget/`)
---

| Classe | Papel |
|---|---|
| `CraftDynamic` | Widget principal que renderiza o SDUI |
| `CraftDViewListener` | Callback de ações para o consumidor |
| `SimpleProperties` | Modelo base de dados |
| `ActionProperties` | Dados de ação (deeplink + analytics) |
| `CraftDAlign` | Alinhamento de componentes |
## Convenções de código

> Ao adicionar um novo componente, ele deve ser implementado nas três plataformas seguindo a mesma abstração de cada uma. Consultar `CraftDButton` / `CraftDButtonBuilder` como referência em todas.
- **Kotlin:** segue as convenções oficiais do Kotlin. Prefere `data class` para modelos.
- **Nomenclatura de componentes:** prefixo `CraftD` em tudo que é parte da lib (ex: `CraftDButton`, `CraftDButtonBuilder`).
- **Testes:** JUnit4 + MockK. Nomenclatura em backtick: `` `given X when Y then Z` ``. Path espelha o source: `src/test/java/...`
- **Commits:** mensagens em inglês, semânticas (`feat:`, `fix:`, `test:`, `chore:`, `docs:`).

---

## Padrão de estrutura de pastas
## Implementação de tasks

### craftd-core (modelos e abstrações)
```
commonMain/
data/
model/
base/ → SimpleProperties, SimplePropertiesResponse
action/ → ActionProperties, AnalyticsProperties
[name]/ → [Name]Properties.kt para cada componente
domain/ → enums e sealed classes (CraftDAlign, CraftDTextStyle)
presentation/ → CraftDViewListener, CraftDComponentKey
extensions/ → funções de extensão
```
Ao concluir cada task de um `tasks.md`:
1. Implemente o código da task
2. Rode `./gradlew build` no módulo afetado (`android_kmp/`)
3. Corrija erros de compilação se houver
4. Só então marque `[x]` no `tasks.md`

### craftd-compose (implementação Compose/KMP)
```
commonMain/
builder/ → CraftDBuilder.kt (interface), CraftDBuilderManager.kt
ui/
[name]/
CraftD[Name].kt → o @Composable do componente
CraftD[Name]Builder.kt → implementa CraftDBuilder
extensions/ → funções utilitárias Compose
```
Nunca marcar `[x]` antes do build passar.

### Padrão por novo componente (exemplo: CraftDImage)
### Orquestração com agents para componentes Android/KMP

1. `craftd-core/commonMain/data/model/image/ImageProperties.kt` — data class do modelo
2. `craftd-compose/commonMain/ui/image/CraftDImage.kt` — composable
3. `craftd-compose/commonMain/ui/image/CraftDImageBuilder.kt` — builder
4. Equivalentes em `ios/craftd-swiftui/` e `flutter/craftd_widget/` com a mesma estrutura
Ao aplicar uma change que adiciona um novo componente Android/KMP (detectável pela estrutura das tasks: core → compose/xml → docs/sample), usar agents paralelos com worktrees isoladas seguindo estas rodadas:

---
**Rodada 1** — sequencial (core é dependência das demais):
- Agent Core → tasks de `craftd-core` (model, enum, key)

## Princípios de desenvolvimento
**Rodada 2** — paralelo (após Rodada 1 mergeada):
- Agent Compose → tasks de `craftd-compose` (composable, builder, registro, testes)
- Agent XML → tasks de `craftd-xml` (render, registro)

### Compose
- Composables devem ser **stateless** — estado vem sempre do caller (state hoisting)
- Todo componente expõe `modifier: Modifier = Modifier` como parâmetro
- Sem valores hardcoded de cor ou tipografia — usar `MaterialTheme.colorScheme` e `MaterialTheme.typography`
- Todo componente interativo deve ter **touch target mínimo de 48x48dp**
**Rodada 3** — sequencial (após Rodada 2):
- Agent Docs/Sample → tasks de documentação e sample app

### Arquitetura
- A camada `domain` não pode ter dependências Android — apenas Kotlin puro
- Repositórios usam `suspend functions` main-safe
**Rodada 4** — revisor (após Rodada 3):
- Agent Revisor → revisa todo o código produzido seguindo as regras de review do CLAUDE.md. Não faz build — cada agent já validou o seu.

### Build
- Dependências sempre via `libs.versions.toml` — nunca versão hardcoded no `build.gradle.kts`
- Configuração compartilhada entre módulos vai em convention plugin no `build-logic/`
Cada agent roda em worktree isolada (`isolation: "worktree"`) e valida o build antes de marcar `[x]`.

---
### Custo de contexto — diretrizes para agents

## Convenções de código
**Escopo de plataforma — ignorar pastas irrelevantes:**
- Tasks Android/KMP → ignorar `ios/` e `flutter/`
- Tasks iOS → ignorar `android_kmp/` e `flutter/`
- Tasks Flutter → ignorar `android_kmp/` e `ios/`

- **Kotlin:** segue as convenções oficiais do Kotlin. Prefere `data class` para modelos.
- **Nomenclatura de componentes:** prefixo `CraftD` em tudo que é parte da lib (ex: `CraftDButton`, `CraftDButtonBuilder`).
- **Testes:** JUnit4 + MockK. Nomenclatura em backtick: `` `given X when Y then Z` ``. Path espelha o source: `src/test/java/...`
- **Commits:** mensagens em inglês, semânticas (`feat:`, `fix:`, `test:`, `chore:`, `docs:`).
Nunca ler, listar ou referenciar arquivos fora da plataforma da task em execução.

**Quando NÃO usar agent (fazer inline):**
- Rodada 3 (Docs/Sample) e Rodada 4 (Revisor) — edições simples, o overhead do agent supera o benefício
- Qualquer task com menos de 10 arquivos a editar e sem necessidade de build isolado

**Quando usar agent com worktree:**
- Rodadas 1 e 2 — compilação isolada necessária, risco de conflito entre módulos paralelos

**Como montar o prompt de um agent:**
- Passar os caminhos exatos dos arquivos relevantes
- Incluir o trecho de código de referência (ex: o builder existente que deve ser replicado)
- Nunca escrever "leia o projeto e implemente" — especificar o quê e onde

**Modelo por tipo de tarefa:**
- Edições mecânicas (JSON, doc, registro simples): usar `model: "haiku"`
- Lógica, compilação e decisões arquiteturais: Sonnet (default)

Após cada mudança de estado relevante (agent iniciado, concluído ou com erro), exibir tabela de progresso:

| Agent | Status | Tasks |
|---|---|---|
| Agent Core | ✓ Completo | 1.x |
| Agent Compose | ⟳ Rodando | 2.x |
| Agent XML | ⏳ Aguardando | 3.x |

Ícones: `⟳` rodando, `✓` completo, `⏳` aguardando, `✗` erro.

Durante a execução, reportar progresso no formato:

```
[Agent Core] ✓ 1.1 IMAGE_COMPONENT adicionado
[Agent Core] ✓ 1.2 CraftDContentScale criado
[Agent Compose] ⟳ 2.2 Criando CraftDImage composable...
[Agent XML] ⟳ 3.1 Criando CraftDImageComponent...
[Agent Compose] ✓ 2.2 CraftDImage composable criado
```

Usar `⟳` para em progresso e `✓` para concluído. Reportar a cada task iniciada e concluída.

---

Expand Down
Loading
Loading