ganbatte-os 0.2.37 → 0.2.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gos/agents/profiles/ganbatte-os-master.md +100 -0
- package/.gos/libraries/caveman-rules.md +58 -0
- package/.gos/libraries/cloudflare-stack-kb.md +161 -0
- package/.gos/libraries/component-reuse-gate.md +75 -0
- package/.gos/libraries/default-stack-kb.md +98 -0
- package/.gos/libraries/engineering-best-practices.md +208 -0
- package/.gos/libraries/gos-compress-setup.md +62 -0
- package/.gos/libraries/intake-questions-mom-test.md +91 -0
- package/.gos/libraries/lucide-icons-policy.md +174 -0
- package/.gos/libraries/security-best-practices.md +138 -0
- package/.gos/libraries/supabase-stack-kb.md +124 -0
- package/.gos/libraries/timer-pattern-spec.md +252 -0
- package/.gos/libraries/typeform-pattern-spec.md +204 -0
- package/.gos/libraries/ui-guardrails-checklist.md +144 -0
- package/.gos/libraries/visual-diff-lenses.md +114 -0
- package/.gos/playbooks/audit-streaming-playbook.md +86 -0
- package/.gos/skills/adr-tech-decisions/SKILL.md +166 -0
- package/.gos/skills/audit-screenshots/SKILL.md +200 -142
- package/.gos/skills/cloudflare-pages-setup/SKILL.md +180 -0
- package/.gos/skills/figma-print-diff/SKILL.md +170 -0
- package/.gos/skills/gos-caveman/SKILL.md +110 -0
- package/.gos/skills/gos-compress/SKILL.md +134 -0
- package/.gos/skills/gos-compress/scripts/compress.py +346 -0
- package/.gos/skills/gos-compress/scripts/setup.py +91 -0
- package/.gos/skills/idea-intake/SKILL.md +147 -0
- package/.gos/skills/plan-blueprint/SKILL.md +18 -3
- package/.gos/skills/plan-to-tasks/SKILL.md +37 -1
- package/.gos/skills/prd-from-intake/SKILL.md +94 -0
- package/.gos/skills/prototype-orchestrator/SKILL.md +120 -0
- package/.gos/skills/registry.json +12 -1
- package/.gos/skills/timer-component-pattern/SKILL.md +245 -0
- package/.gos/skills/typeform-form-pattern/SKILL.md +210 -0
- package/.gos/skills/ui-guardrails/SKILL.md +111 -0
- package/.gos/templates/intakeTemplate.md +41 -0
- package/.gos/templates/planTemplate.md +25 -4
- package/.gos/templates/prdLeanTemplate.md +40 -0
- package/.gos/templates/taskTemplate.md +29 -5
- package/package.json +1 -1
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# UI Guardrails Checklist (detalhe)
|
|
2
|
+
|
|
3
|
+
> Detalhe expandido de cada item do `ui-guardrails`. Consultar quando uma violacao precisar ser explicada ao usuario.
|
|
4
|
+
|
|
5
|
+
## A — Estados visuais
|
|
6
|
+
|
|
7
|
+
### A1 — Loading
|
|
8
|
+
- Tela inteira: skeleton com a estrutura visual (header skeleton, lista de cards skeleton).
|
|
9
|
+
- Componente isolado (ex: botao salvando): spinner inline ou disabled state.
|
|
10
|
+
- Anti-padrao: tela em branco enquanto carrega.
|
|
11
|
+
|
|
12
|
+
Codegen exige no plan:
|
|
13
|
+
```markdown
|
|
14
|
+
### Estado: loading
|
|
15
|
+
- Skeleton: 3 cards 240x80px com bg-muted-foreground/10 + shimmer.
|
|
16
|
+
- Trigger: query.isPending
|
|
17
|
+
- Duracao max: 3s antes de error.
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### A2 — Empty
|
|
21
|
+
- Copy explicando POR QUE esta vazio.
|
|
22
|
+
- Ilustracao OU icone grande.
|
|
23
|
+
- CTA primario para sair do empty (criar item, importar, etc.).
|
|
24
|
+
- Anti-padrao: "Nenhum dado" sem nada mais.
|
|
25
|
+
|
|
26
|
+
Codegen exige:
|
|
27
|
+
```markdown
|
|
28
|
+
### Estado: empty
|
|
29
|
+
- Copy: "Voce ainda nao tem nenhum projeto. Comece criando um."
|
|
30
|
+
- Icone: FolderPlus 48px text-muted-foreground.
|
|
31
|
+
- CTA: "Criar primeiro projeto" (Button variant=primary).
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### A3 — Error
|
|
35
|
+
- Mensagem clara (nao "erro 500").
|
|
36
|
+
- Acao de recovery (tentar de novo, voltar, contato).
|
|
37
|
+
- Distincao: erro recuperavel vs nao-recuperavel.
|
|
38
|
+
|
|
39
|
+
```markdown
|
|
40
|
+
### Estado: error
|
|
41
|
+
- Tipo recuperavel: toast variant=error + retry inline.
|
|
42
|
+
- Tipo nao-recuperavel: tela full com copy + CTA voltar.
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### A4 — Success (quando aplicavel)
|
|
46
|
+
- Toast inline ou success state pos-form.
|
|
47
|
+
- Auto-dismiss em 3-5s OU acao explicita do usuario.
|
|
48
|
+
|
|
49
|
+
### A5 — Default
|
|
50
|
+
- Estado normal, dados presentes.
|
|
51
|
+
|
|
52
|
+
## B — Responsividade
|
|
53
|
+
|
|
54
|
+
### Breakpoints obrigatorios
|
|
55
|
+
- Mobile: <768px (preferencia: comeca daqui — mobile-first).
|
|
56
|
+
- Tablet: 768-1024px.
|
|
57
|
+
- Desktop: 1024-1920px.
|
|
58
|
+
|
|
59
|
+
### Comportamentos esperados
|
|
60
|
+
- Sidebar -> drawer no mobile.
|
|
61
|
+
- Tabela -> cards no mobile.
|
|
62
|
+
- Drawer right -> bottom sheet no mobile.
|
|
63
|
+
- Tipografia escala (text-base mobile, text-lg desktop ou similar).
|
|
64
|
+
|
|
65
|
+
### Codegen exige no plan
|
|
66
|
+
```markdown
|
|
67
|
+
### Responsividade
|
|
68
|
+
- Mobile: lista vira cards verticais empilhados, sem hover.
|
|
69
|
+
- Tablet: 2 colunas de cards.
|
|
70
|
+
- Desktop: tabela tradicional com hover.
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## C — Acessibilidade
|
|
74
|
+
|
|
75
|
+
### Roles ARIA
|
|
76
|
+
- `<button>` para acao -> nao usar `<div onClick>`.
|
|
77
|
+
- `<dialog>` ou `role="dialog"` + aria-labelledby para modals.
|
|
78
|
+
- `role="listbox"` + `role="option"` em selects custom.
|
|
79
|
+
|
|
80
|
+
### Labels
|
|
81
|
+
- Input sem `<label>` visivel: usar `aria-label`.
|
|
82
|
+
- Icon-only button: `aria-label="Fechar"` obrigatorio.
|
|
83
|
+
|
|
84
|
+
### Focus
|
|
85
|
+
- Modal aberto: focus vai para primeiro elemento focavel.
|
|
86
|
+
- Modal fechado: focus volta para trigger.
|
|
87
|
+
- Tab order segue ordem visual.
|
|
88
|
+
- Focus indicator distinto de hover (outline 2px ring-primary).
|
|
89
|
+
|
|
90
|
+
### Contraste
|
|
91
|
+
- AA: 4.5:1 texto, 3:1 UI.
|
|
92
|
+
- Erro inline NAO so vermelho — adicionar icone/texto "Erro:".
|
|
93
|
+
|
|
94
|
+
## D — Tokens do DS
|
|
95
|
+
|
|
96
|
+
### Cores
|
|
97
|
+
- OK: `bg-primary`, `text-foreground`, `border-border`.
|
|
98
|
+
- Anti: `bg-[#3b82f6]`, `text-blue-500` quando primary existe.
|
|
99
|
+
|
|
100
|
+
### Spacing
|
|
101
|
+
- OK: `gap-2`, `p-4`, `mt-6`.
|
|
102
|
+
- Anti: `gap-[7px]`, `p-[13px]`.
|
|
103
|
+
|
|
104
|
+
### Typography
|
|
105
|
+
- OK: `text-sm`, `font-semibold`, `leading-tight`.
|
|
106
|
+
- Anti: `text-[13px]`, `tracking-[0.02em]` quando token existe.
|
|
107
|
+
|
|
108
|
+
### Radius
|
|
109
|
+
- OK: `rounded`, `rounded-md`, `rounded-lg`.
|
|
110
|
+
- Anti: `rounded-[7px]`.
|
|
111
|
+
|
|
112
|
+
### Excecoes permitidas (com justificativa)
|
|
113
|
+
- Animacao especifica nao-mapeada: `[animation-delay:120ms]` OK.
|
|
114
|
+
- Posicionamento dinamico: `top-[calc(100%+8px)]` OK.
|
|
115
|
+
|
|
116
|
+
## E — Interacao
|
|
117
|
+
|
|
118
|
+
### Trigger declaration
|
|
119
|
+
Cada elemento interativo precisa:
|
|
120
|
+
- Trigger: o que dispara (click, hover, focus, keypress, mount, query)
|
|
121
|
+
- Acao: que callback/mutation roda
|
|
122
|
+
- Resultado: qual estado muda + UI feedback
|
|
123
|
+
|
|
124
|
+
### Edge cases obrigatorios
|
|
125
|
+
- Double-click rapido em CTA -> debounce 300ms ou disabled durante mutation.
|
|
126
|
+
- Mutation lenta (>3s) -> mostrar loading inline ou progress.
|
|
127
|
+
- Mutation falha -> rollback ou error state com retry.
|
|
128
|
+
- Concorrencia (2 usuarios editando) -> conflict resolution declarado.
|
|
129
|
+
|
|
130
|
+
## Self-check rapido
|
|
131
|
+
|
|
132
|
+
Antes de submeter tela para codegen:
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
[ ] A1 loading state declarado e visualmente coerente?
|
|
136
|
+
[ ] A2 empty state existe + CTA primaria?
|
|
137
|
+
[ ] A3 error state com recovery?
|
|
138
|
+
[ ] B responsividade nos 3 breakpoints?
|
|
139
|
+
[ ] C aria-label em icon buttons + focus visivel?
|
|
140
|
+
[ ] D 0 valores hardcoded fora do DS?
|
|
141
|
+
[ ] E todos os triggers tem acao + resultado + edge cases?
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Falhou em algum -> NAO codar ainda. Volte ao plano.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Visual Diff Lenses
|
|
2
|
+
|
|
3
|
+
> Referencia das 6 lenses usadas por `figma-print-diff` e `audit-screenshots`. Inspirado em Nielsen Heuristics + design-critique (uxdudu) + WCAG.
|
|
4
|
+
|
|
5
|
+
## Lens 1 — Layout & hierarquia
|
|
6
|
+
|
|
7
|
+
Pergunta-mestra: "A estrutura espacial bate?"
|
|
8
|
+
|
|
9
|
+
Sub-checks:
|
|
10
|
+
- Containers principais (sidebar, header, footer, main) presentes em ambos?
|
|
11
|
+
- Ordem de filhos dentro de cada container coincide?
|
|
12
|
+
- Proporcoes (sidebar 240px, main 1fr) coerentes?
|
|
13
|
+
- Densidade visual (cards/lista) similar?
|
|
14
|
+
|
|
15
|
+
Severity guide:
|
|
16
|
+
- high: container ausente/extra
|
|
17
|
+
- medium: ordem trocada
|
|
18
|
+
- low: proporcao 10-20% diferente
|
|
19
|
+
|
|
20
|
+
## Lens 2 — Tokens visuais
|
|
21
|
+
|
|
22
|
+
Pergunta-mestra: "Cor, tipo, espacamento batem com o DS?"
|
|
23
|
+
|
|
24
|
+
Sub-checks:
|
|
25
|
+
- Cor de background dos blocos
|
|
26
|
+
- Cor de texto (primary, secondary, muted)
|
|
27
|
+
- Borders e radius
|
|
28
|
+
- Tipografia (family, size, weight, line-height)
|
|
29
|
+
- Spacing (padding/margin/gap)
|
|
30
|
+
- Shadows e elevations
|
|
31
|
+
|
|
32
|
+
Severity guide:
|
|
33
|
+
- high: cor de acao primaria errada
|
|
34
|
+
- medium: spacing 2x diferente
|
|
35
|
+
- low: radius cosmetico
|
|
36
|
+
|
|
37
|
+
## Lens 3 — Estados
|
|
38
|
+
|
|
39
|
+
Pergunta-mestra: "Todos os estados estao implementados?"
|
|
40
|
+
|
|
41
|
+
Sub-checks:
|
|
42
|
+
- Loading (skeleton, spinner)
|
|
43
|
+
- Empty (placeholder, CTA)
|
|
44
|
+
- Error (mensagem, recovery)
|
|
45
|
+
- Success (toast, inline)
|
|
46
|
+
- Hover/Focus/Active
|
|
47
|
+
- Disabled
|
|
48
|
+
|
|
49
|
+
Severity guide:
|
|
50
|
+
- high: empty/error nao implementado
|
|
51
|
+
- medium: hover sem feedback
|
|
52
|
+
- low: focus ring cosmetico
|
|
53
|
+
|
|
54
|
+
## Lens 4 — Conteudo
|
|
55
|
+
|
|
56
|
+
Pergunta-mestra: "Textos e visuais coincidem?"
|
|
57
|
+
|
|
58
|
+
Sub-checks:
|
|
59
|
+
- Textos literais (sem inventar traducao)
|
|
60
|
+
- Icones (mesma lib, mesma variante)
|
|
61
|
+
- Imagens (placeholder vs real)
|
|
62
|
+
- Dados mockados (formato, plausibilidade)
|
|
63
|
+
|
|
64
|
+
Severity guide:
|
|
65
|
+
- high: copy errada que altera significado
|
|
66
|
+
- medium: icone trocado
|
|
67
|
+
- low: lorem ipsum esquecido
|
|
68
|
+
|
|
69
|
+
## Lens 5 — Interacao (inferida do estatico)
|
|
70
|
+
|
|
71
|
+
Pergunta-mestra: "Affordances batem?"
|
|
72
|
+
|
|
73
|
+
Sub-checks:
|
|
74
|
+
- Cursor pointer onde Figma mostra elemento "clicavel"
|
|
75
|
+
- Botoes com aparencia de botao (nao texto plano)
|
|
76
|
+
- Inputs com aparencia de input (border, placeholder)
|
|
77
|
+
- Tooltips/popovers posicionados corretamente quando visiveis
|
|
78
|
+
|
|
79
|
+
Severity guide:
|
|
80
|
+
- high: botao primario sem aparencia de botao
|
|
81
|
+
- medium: link disfarcado de texto
|
|
82
|
+
- low: cursor em element nao-clicavel
|
|
83
|
+
|
|
84
|
+
## Lens 6 — Acessibilidade visual
|
|
85
|
+
|
|
86
|
+
Pergunta-mestra: "Acessivel ao olhar?"
|
|
87
|
+
|
|
88
|
+
Sub-checks:
|
|
89
|
+
- Contraste AA (4.5:1 texto, 3:1 UI components)
|
|
90
|
+
- Toque minimo 44x44px em mobile
|
|
91
|
+
- Focus indicator distinto de hover
|
|
92
|
+
- Texto sem so cor (icone + cor para indicar erro)
|
|
93
|
+
|
|
94
|
+
Severity guide:
|
|
95
|
+
- high: contraste reprovado em texto principal
|
|
96
|
+
- medium: toque <44px em mobile
|
|
97
|
+
- low: focus mesmo cor que hover
|
|
98
|
+
|
|
99
|
+
## Composicao das lenses
|
|
100
|
+
|
|
101
|
+
Ordem fixa: 1 -> 2 -> 3 -> 4 -> 5 -> 6.
|
|
102
|
+
|
|
103
|
+
Por que essa ordem?
|
|
104
|
+
- Layout antes de token (sem layout, token nao importa).
|
|
105
|
+
- Token antes de estado (estado depende de tokens corretos).
|
|
106
|
+
- Estado antes de conteudo (conteudo so faz sentido com estado completo).
|
|
107
|
+
- Interacao depois de conteudo (precisa ver afford).
|
|
108
|
+
- A11y por ultimo (gate final).
|
|
109
|
+
|
|
110
|
+
## Anti-patterns
|
|
111
|
+
|
|
112
|
+
- Pular lens 3: time esquece estados, codegen sai sem loading/empty/error.
|
|
113
|
+
- Inverter 1 e 2: comeca medindo cor e nao percebe que falta sidebar inteira.
|
|
114
|
+
- Severity hyperinflation: tudo high -> nada e high.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Playbook — Auditoria visual streaming (audit-screenshots)
|
|
2
|
+
|
|
3
|
+
Guia de uso do fluxo de correção visual **plano-primeiro, task-por-insumo**. Confronta o app implementado
|
|
4
|
+
contra o Figma e gera UM plano de correção com tasks escritas na hora — cada divergência passa pelo gate
|
|
5
|
+
de reuso de componente (reuse / create / merge). Substitui o modelo antigo de fila (acumular prints →
|
|
6
|
+
materializar no `close`).
|
|
7
|
+
|
|
8
|
+
## Quando usar
|
|
9
|
+
|
|
10
|
+
- Você tem N telas com divergências visuais (cola prints, ou aponta rotas) e quer UM plano de fix.
|
|
11
|
+
- Quer auditar sistematicamente um tipo de tela contra o Figma (`validate`).
|
|
12
|
+
- NÃO use para planejar tela nova (use `*plan` / plan-blueprint) nem para executar (use `*execute-plan`).
|
|
13
|
+
|
|
14
|
+
## Pré-requisitos do workspace
|
|
15
|
+
|
|
16
|
+
1. `.gos-local/plan-paths.json` configurado (campo `figma_screen_map`; default `docs/figma-screen-map.md`).
|
|
17
|
+
2. `docs/figma-screen-map.md` — mapa canônico `Rota app ↔ node-id` (contrato tela↔Figma do projeto).
|
|
18
|
+
3. **Figma MCP** ativo (expected) e **Playwright** disponível (actual, captura do app vivo).
|
|
19
|
+
4. `progress.txt` na raiz (criado no primeiro `*plan`/`open`).
|
|
20
|
+
|
|
21
|
+
## Fluxo end-to-end
|
|
22
|
+
|
|
23
|
+
### 1. Abrir o plano (uma vez por auditoria)
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
*audit-screenshots open [SLUG]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Cria `docs/plans/PLAN-NNN-fix-<SLUG>/` com `plan.md` em **`status: aberto`** (draft) + `context.md` +
|
|
30
|
+
`tasks/` vazio + `audit-evidence/`. **Não** roda check-plan (o plano ainda é rascunho).
|
|
31
|
+
|
|
32
|
+
### 2. Adicionar insumos (quantos quiser, a qualquer momento)
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
# Cole o print + contexto, OU aponte a rota para o Playwright capturar:
|
|
36
|
+
*audit-screenshots add "a aba negocios esta sem a coluna Area" # + imagem colada
|
|
37
|
+
*audit-screenshots add /dashboard/projetos/123?tab=negocios # captura via Playwright
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Cada insumo, NA HORA: resolve tela no mapa → captura actual (print ou Playwright) → pull Figma (MCP) →
|
|
41
|
+
confronta via `figma-print-diff` (single-pass, lenses 1-6) → **gate de reuso** por divergência estrutural
|
|
42
|
+
→ escreve `tasks/T-NN-*.md` (`status: pendente`) com evidência anexada. Sem fila, sem `close` no fim.
|
|
43
|
+
|
|
44
|
+
### 3. (Opcional) Sweep de validação por tipo de tela
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
*audit-screenshots validate listagem # todas as telas tipo "listagem" no mapa
|
|
48
|
+
*audit-screenshots validate --all # varre o mapa inteiro
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Itera o `figma-screen-map.md`, captura Playwright + pull Figma, confronta e escreve tasks — mesmo fluxo do `add`.
|
|
52
|
+
|
|
53
|
+
### 4. Revisar e finalizar
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
*audit-screenshots list # tasks escritas ate agora + decisoes de componente
|
|
57
|
+
*audit-screenshots finalize # flip status: pendente -> roda check-plan.js -> pronto p/ execute-plan
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`finalize` valida que cada task é self-contained, vira o plano para `status: pendente`, dispara
|
|
61
|
+
`ui-guardrails` e roda `check-plan.js` (gate determinístico). Exit 0 → o plano é input de `*execute-plan`.
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
*execute-plan PLAN-NNN-fix-<SLUG>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
`*audit-screenshots discard` aborta o plano aberto a qualquer momento.
|
|
68
|
+
|
|
69
|
+
## Gate de reuso de componente (design-to-code)
|
|
70
|
+
|
|
71
|
+
Cada divergência em estrutura reusável (table, card, form, list…) NÃO vira patch one-off. O fluxo mapeia o
|
|
72
|
+
elemento → checa a biblioteca (`component-dedup`) → decide **reuse | create | merge** (ver
|
|
73
|
+
`libraries/component-reuse-gate.md`). A task grava `component_decision` + `component_target`.
|
|
74
|
+
|
|
75
|
+
**Exemplo (Fractus):** divergência numa tabela → a primitiva `DataTable` (TanStack) já existe →
|
|
76
|
+
decisão **reuse**. A correção é nas `columns`/dados daquela tela OU na própria primitiva (se o defeito é
|
|
77
|
+
compartilhado) — nunca um `<table>` novo. `negocios-table`, `funders-table` etc. = 1 primitiva, N usos.
|
|
78
|
+
|
|
79
|
+
## Por que mudou (vs modelo de fila)
|
|
80
|
+
|
|
81
|
+
| Antes (fila) | Agora (streaming) |
|
|
82
|
+
|--------------|-------------------|
|
|
83
|
+
| `add` acumula em `audit-session.json` | `open` cria plano draft; o diretório É o estado |
|
|
84
|
+
| Tasks só nascem no `close` (perda de contexto) | Task escrita NA HORA, por insumo, com evidência |
|
|
85
|
+
| Correção = patch da tela | Correção passa pelo gate de reuso (reuse/create/merge) |
|
|
86
|
+
| check-plan no `close` | check-plan só no `finalize` (plano `aberto` é estado válido) |
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: adr-tech-decisions
|
|
3
|
+
description: >
|
|
4
|
+
Decide stack tecnico de um PRD interativamente, com KB embutido de Cloudflare (Workers,
|
|
5
|
+
Pages, D1, R2, KV, DO, Realtime via WebSocket) e Supabase (Auth, Postgres, Realtime).
|
|
6
|
+
SEMPRE pergunta ao usuario as decisoes-chave antes de chumbar — MVPs descartaveis tem
|
|
7
|
+
estrategia diferente de produtos continuos. Output: docs/adr/ADR-NNN-<slug>.md.
|
|
8
|
+
argument-hint: "<PRD-id> [--cloudflare-only] [--with-supabase] [--websocket]"
|
|
9
|
+
allowedTools: [Read, Glob, Grep, Bash, Write, Edit, AskUserQuestion]
|
|
10
|
+
sourceDocs:
|
|
11
|
+
- libraries/cloudflare-stack-kb.md
|
|
12
|
+
- libraries/supabase-stack-kb.md
|
|
13
|
+
- templates/adr-tmpl.yaml
|
|
14
|
+
use-when:
|
|
15
|
+
- tem-se PRD pronto e precisa decidir arquitetura
|
|
16
|
+
- antes de plan-blueprint quando o projeto e novo
|
|
17
|
+
- quando ha duvida entre Cloudflare-only vs hibrido com Supabase
|
|
18
|
+
do-not-use-for:
|
|
19
|
+
- projetos que ja tem stack.md definido (use plan-blueprint direto)
|
|
20
|
+
- mudanca pontual de lib (registrar via comment no plan)
|
|
21
|
+
metadata:
|
|
22
|
+
category: architecture
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
Voce esta executando como **Arquiteto Pragmatico** via skill `adr-tech-decisions`. Le PRD, faz 5-7 perguntas direcionadas ao usuario (todas em PT-BR, sem jargao quando possivel), consulta KB embutido e produz ADR + stack.md compatibilizado com plan-blueprint.
|
|
26
|
+
|
|
27
|
+
## Contrato
|
|
28
|
+
|
|
29
|
+
1. Input obrigatorio: `PRD-id`. Resolver `docs/prd/<PRD-id>/prd.md`. Ausente -> abortar.
|
|
30
|
+
2. Ler `descartavel` do frontmatter PRD — afeta perfil de decisoes (ver matriz).
|
|
31
|
+
3. SEMPRE perguntar ao usuario antes de fechar (regra do dono do framework: `SEMPRE pergunte ao usuario`).
|
|
32
|
+
4. Output: `docs/adr/ADR-NNN-<slug>.md` + `docs/stack.md` (criar ou atualizar).
|
|
33
|
+
5. Apos ADR: `docs/stack.md` fica disponivel para `plan-blueprint` consumir.
|
|
34
|
+
|
|
35
|
+
## Matriz de decisao por perfil
|
|
36
|
+
|
|
37
|
+
### Perfil A — Descartavel (uso unico, vida util semanas)
|
|
38
|
+
|
|
39
|
+
Default proposto (nao chumbar — pergunte):
|
|
40
|
+
- Frontend: Vite + React + TypeScript + Tailwind + shadcn/ui
|
|
41
|
+
- Hosting: Cloudflare Pages (free, deploy via git)
|
|
42
|
+
- Backend: NENHUM (somente front, dados em localStorage ou Cloudflare KV se publico)
|
|
43
|
+
- Auth: nenhuma OU Cloudflare Access (free para 50 users, sem codigo)
|
|
44
|
+
- Realtime: nenhum
|
|
45
|
+
- DB: nenhum OU Cloudflare KV (free 100k reads/dia)
|
|
46
|
+
|
|
47
|
+
### Perfil B — Continuo, simples (CRUD basico, ate 1k users)
|
|
48
|
+
|
|
49
|
+
Default proposto:
|
|
50
|
+
- Frontend: Vite + React + TS + Tailwind + shadcn/ui em Cloudflare Pages
|
|
51
|
+
- Backend: Cloudflare Workers (free 100k reqs/dia)
|
|
52
|
+
- DB: Cloudflare D1 (free 5GB) OU Supabase Postgres (free 500MB)
|
|
53
|
+
- Auth: Supabase Auth (free 50k MAU)
|
|
54
|
+
- Realtime: nenhum
|
|
55
|
+
- Storage: Cloudflare R2 (free 10GB)
|
|
56
|
+
|
|
57
|
+
### Perfil C — Continuo, realtime (chat, dashboard ao vivo, jogo)
|
|
58
|
+
|
|
59
|
+
Default proposto:
|
|
60
|
+
- Frontend: idem perfil B
|
|
61
|
+
- Backend: Cloudflare Workers + Durable Objects (free 1M ops/dia) — para WebSocket
|
|
62
|
+
- Realtime: WebSocket via DO (sem servidor separado)
|
|
63
|
+
- DB: Supabase Postgres + Realtime (channels via Postgres logical replication)
|
|
64
|
+
- Auth: Supabase Auth
|
|
65
|
+
|
|
66
|
+
## Perguntas obrigatorias (ordem)
|
|
67
|
+
|
|
68
|
+
Sempre perguntar via `AskUserQuestion`:
|
|
69
|
+
|
|
70
|
+
1. "Esse produto e pra usar uma vez ou rodar continuo?" -> define perfil A vs B/C.
|
|
71
|
+
2. "Vai precisar de login? (sim/nao/talvez)" -> define auth.
|
|
72
|
+
3. "Vai ter dados que mudam ao vivo (chat, notificacao em tempo real)?" -> define realtime.
|
|
73
|
+
4. "Tem orcamento mensal pra infra ou precisa caber 100% no free tier?" -> define limites.
|
|
74
|
+
5. "Algum lock-in que voce QUER ter ou EVITAR? (ex: ja uso Supabase no outro projeto)" -> overrides.
|
|
75
|
+
6. (Se perfil C) "Quantos usuarios simultaneos voce espera ter conectados ao mesmo tempo?" -> dimensiona DO.
|
|
76
|
+
7. "Quer separar frontend e backend em projetos diferentes ou monolito?" -> define repo strategy.
|
|
77
|
+
|
|
78
|
+
## Pre-flight
|
|
79
|
+
|
|
80
|
+
1. Verificar se KB esta disponivel: `libraries/cloudflare-stack-kb.md` e `libraries/supabase-stack-kb.md`. Se ausentes, abortar com instrucao para rodar setup do G-OS.
|
|
81
|
+
2. Resolver `dirs.adr` via `.gos-local/plan-paths.json` (default: `docs/adr/`).
|
|
82
|
+
|
|
83
|
+
## Output (ADR-NNN-<slug>.md)
|
|
84
|
+
|
|
85
|
+
Use template `templates/adr-tmpl.yaml` mas exporta como markdown:
|
|
86
|
+
|
|
87
|
+
```markdown
|
|
88
|
+
# ADR-NNN: <decisao principal>
|
|
89
|
+
|
|
90
|
+
**Status**: accepted
|
|
91
|
+
**Date**: <iso>
|
|
92
|
+
**PRD**: PRD-NNN-<slug>
|
|
93
|
+
**Perfil**: A (descartavel) | B (continuo simples) | C (realtime)
|
|
94
|
+
|
|
95
|
+
## Contexto
|
|
96
|
+
<2-3 paragrafos, citando trechos do PRD que motivam>
|
|
97
|
+
|
|
98
|
+
## Decisoes (resumo executivo)
|
|
99
|
+
|
|
100
|
+
| Camada | Escolha | Alternativa rejeitada | Motivo |
|
|
101
|
+
|--------|---------|----------------------|--------|
|
|
102
|
+
| Frontend | Vite + React + TS + Tailwind + shadcn | Next.js | <motivo> |
|
|
103
|
+
| Hosting | Cloudflare Pages | Vercel | <motivo> |
|
|
104
|
+
| Backend | Cloudflare Workers | Express+VPS | <motivo> |
|
|
105
|
+
| DB | <D1\|Supabase\|nenhum> | <alternativa> | <motivo> |
|
|
106
|
+
| Auth | <opcao> | <alternativa> | <motivo> |
|
|
107
|
+
| Realtime | <DO+WS\|Supabase Realtime\|nenhum> | <alternativa> | <motivo> |
|
|
108
|
+
|
|
109
|
+
## Constraints respeitados
|
|
110
|
+
- Free tier: <lista de limites e como ficamos abaixo deles>
|
|
111
|
+
- Descartavel: <true/false> -> <decisoes simplificadas tomadas>
|
|
112
|
+
|
|
113
|
+
## Consequencias
|
|
114
|
+
- (+) <positivas>
|
|
115
|
+
- (-) <negativas>
|
|
116
|
+
- (~) <neutras>
|
|
117
|
+
|
|
118
|
+
## Proximo passo
|
|
119
|
+
- Atualizar `docs/stack.md` (ja feito automaticamente).
|
|
120
|
+
- Rodar `*plan-blueprint <tela>` para primeira tela.
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Saida secundaria (docs/stack.md)
|
|
124
|
+
|
|
125
|
+
Atualizar/criar stack.md com formato compativel com `plan-blueprint`:
|
|
126
|
+
|
|
127
|
+
```markdown
|
|
128
|
+
# Stack do projeto
|
|
129
|
+
|
|
130
|
+
## Frontend
|
|
131
|
+
- Framework: <Vite + React + TS>
|
|
132
|
+
- Styling: Tailwind v4 + shadcn/ui + tv()
|
|
133
|
+
- State: <local|zustand|jotai>
|
|
134
|
+
- Data fetching: <fetch|swr|tanstack-query>
|
|
135
|
+
|
|
136
|
+
## Backend
|
|
137
|
+
- Runtime: <Cloudflare Workers|nenhum>
|
|
138
|
+
- DB: <D1|Supabase Postgres|nenhum>
|
|
139
|
+
- Auth: <opcao>
|
|
140
|
+
- Realtime: <opcao>
|
|
141
|
+
|
|
142
|
+
## Hosting
|
|
143
|
+
- Frontend: Cloudflare Pages
|
|
144
|
+
- Backend: <Cloudflare Workers|N/A>
|
|
145
|
+
|
|
146
|
+
## Bindings (Cloudflare)
|
|
147
|
+
- D1: <DB_NAME> (se aplicavel)
|
|
148
|
+
- KV: <NAMESPACE> (se aplicavel)
|
|
149
|
+
- R2: <BUCKET> (se aplicavel)
|
|
150
|
+
- DO: <CLASS_NAME> (se aplicavel)
|
|
151
|
+
|
|
152
|
+
## Decisoes-chave (refs ADRs)
|
|
153
|
+
- ADR-NNN: <decisao>
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Regras criticas
|
|
157
|
+
|
|
158
|
+
- **NUNCA chumbar tecnologia sem perguntar**. Mesmo que o perfil indique padrao, perguntar ao usuario antes de escrever ADR.
|
|
159
|
+
- **Free tier first**: para descartaveis, recusar opcoes pagas mesmo que tecnicamente melhores.
|
|
160
|
+
- **Linkar com plan-blueprint**: o `arch_change` flag dele depende do stack.md gerado aqui.
|
|
161
|
+
- **Anti-overengineer**: para perfil A, recusar microservicos, kubernetes, message queues, observability stack — limite e localStorage + fetch.
|
|
162
|
+
- **Citar KB**: ao recomendar uma tecnologia, citar limite especifico do KB ("Workers free = 100k reqs/dia, suficiente para 1k users ativos").
|
|
163
|
+
|
|
164
|
+
## Input
|
|
165
|
+
|
|
166
|
+
$ARGUMENTS
|