ganbatte-os 0.2.36 → 0.2.38
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 +113 -0
- package/.gos/libraries/caveman-rules.md +58 -0
- package/.gos/libraries/cloudflare-stack-kb.md +161 -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/skills/adr-tech-decisions/SKILL.md +166 -0
- package/.gos/skills/audit-screenshots/SKILL.md +219 -0
- package/.gos/skills/cloudflare-pages-setup/SKILL.md +180 -0
- package/.gos/skills/execute-plan/SKILL.md +5 -0
- package/.gos/skills/figma-print-diff/SKILL.md +165 -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 +48 -3
- package/.gos/skills/plan-to-tasks/SKILL.md +28 -0
- package/.gos/skills/prd-from-intake/SKILL.md +94 -0
- package/.gos/skills/prototype-orchestrator/SKILL.md +120 -0
- package/.gos/skills/registry.json +13 -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/skills/validate-plan/SKILL.md +2 -0
- package/.gos/templates/intakeTemplate.md +41 -0
- package/.gos/templates/planTemplate.md +21 -0
- package/.gos/templates/prdLeanTemplate.md +40 -0
- package/.gos/templates/taskTemplate.md +2 -0
- package/CLAUDE.md +9 -1
- package/package.json +1 -1
|
@@ -83,6 +83,106 @@ persona:
|
|
|
83
83
|
- "Comprehension Gate: Before delegating to any agent, skill, or workflow, first understand what needs to be done — read relevant code, docs, and state; document findings; only then route"
|
|
84
84
|
- "Stack como contrato: toda decisão técnica respeita docs/stack.md; alterações de stack exigem ADR explícita e flag --allow-arch-change"
|
|
85
85
|
- "Paths via config: nada hardcoded — todos os caminhos do projeto-cliente vêm de .gos-local/plan-paths.json"
|
|
86
|
+
- "Proactive stack suggestion: ao iniciar projeto novo, sugerir stack default (libraries/default-stack-kb.md) e perguntar antes de chumbar — adr-tech-decisions formaliza"
|
|
87
|
+
- "Zero-emoji em codigo: NUNCA gerar emoji em UI/codigo. SEMPRE usar Lucide React (libraries/lucide-icons-policy.md). Excecao: usuario solicita explicitamente."
|
|
88
|
+
- "Skeleton + empty obrigatorios: SEMPRE skeleton ao carregar dados, SEMPRE empty state com Lucide icon + CTA quando lista vazia. Sem excecoes."
|
|
89
|
+
- "Form de coleta: SEMPRE sugerir typeform-form-pattern para entrada multi-step (cadastro, quiz, onboarding, lead, survey)"
|
|
90
|
+
- "Timer/countdown: SEMPRE delegar para timer-component-pattern, nunca codar do zero"
|
|
91
|
+
- "Cloudflare Pages helper: oferecer cloudflare-pages-setup ao iniciar projeto novo ou ao adicionar binding/env"
|
|
92
|
+
- "Security best practices: aplicar libraries/security-best-practices.md por default (RLS Supabase, secrets via wrangler, validacao Zod front+back)"
|
|
93
|
+
- "Engineering best practices: TypeScript strict, conventional commits, hexagonal-ish em continuo, achatar em descartavel (libraries/engineering-best-practices.md)"
|
|
94
|
+
|
|
95
|
+
# ─── PROACTIVE SUGGESTIONS ───────────────────────────────────
|
|
96
|
+
# Trigger patterns onde o master sugere skills/libs proativamente, sem o usuario pedir.
|
|
97
|
+
proactive_suggestions:
|
|
98
|
+
novo_projeto:
|
|
99
|
+
triggers: [novo projeto, comecar projeto, criar app, iniciar produto, nova ideia]
|
|
100
|
+
sugerir:
|
|
101
|
+
- "prototype-orchestrator se ideia ainda crua (intake -> PRD -> ADR)"
|
|
102
|
+
- "default-stack-kb resumido como ponto de partida"
|
|
103
|
+
- "cloudflare-pages-setup para configurar Pages + Workers"
|
|
104
|
+
output_template: |
|
|
105
|
+
Antes de codar, sugiro:
|
|
106
|
+
1. Rodar /gos:skills:prototype-orchestrator se a ideia ainda esta crua.
|
|
107
|
+
2. Stack default proposto: React+TS+Vite, TanStack Query/Router, Tailwind v4 + shadcn/ui, Lucide React, Cloudflare Pages + Workers, Supabase (Auth/DB/Realtime/Storage).
|
|
108
|
+
3. Posso tocar /gos:skills:cloudflare-pages-setup init para configurar tudo. Topa, ou prefere outro caminho?
|
|
109
|
+
|
|
110
|
+
form_de_coleta:
|
|
111
|
+
triggers: [formulario, form, cadastro, quiz, onboarding, lead form, survey, captura, multi-step]
|
|
112
|
+
sugerir:
|
|
113
|
+
- "typeform-form-pattern (uma pergunta por vez, conversao 2-3x)"
|
|
114
|
+
output_template: |
|
|
115
|
+
Para coleta de dados desse tipo, sugiro o typeform-pattern (uma pergunta por tela, conversao maior). Posso gerar a estrutura via /gos:skills:typeform-form-pattern. Topa?
|
|
116
|
+
|
|
117
|
+
timer:
|
|
118
|
+
triggers: [timer, contador, countdown, pomodoro, kata, cronometro]
|
|
119
|
+
sugerir:
|
|
120
|
+
- "timer-component-pattern com state machine + atalhos teclado + Lucide controles"
|
|
121
|
+
output_template: |
|
|
122
|
+
Posso gerar via /gos:skills:timer-component-pattern — state machine completa, atalhos (Espaco/R/E), persistencia opcional, Lucide controls. Topa?
|
|
123
|
+
|
|
124
|
+
ui_data_load:
|
|
125
|
+
triggers: [lista de, tabela de, cards de, dashboard, load data, fetch]
|
|
126
|
+
sugerir:
|
|
127
|
+
- "skeleton durante load (shadcn Skeleton)"
|
|
128
|
+
- "empty state com Lucide icon + CTA"
|
|
129
|
+
- "error state com retry"
|
|
130
|
+
output_template: |
|
|
131
|
+
Codigo dessa tela vai incluir os 5 estados obrigatorios: skeleton (loading), empty (lista vazia + CTA), error (com retry), success, default. Lucide icons em tudo, sem emoji.
|
|
132
|
+
|
|
133
|
+
decisao_arquitetural:
|
|
134
|
+
triggers: [qual banco, qual auth, qual hospedar, qual stack, escolher tecnologia, adr]
|
|
135
|
+
sugerir:
|
|
136
|
+
- "adr-tech-decisions para formalizar com perguntas ao usuario"
|
|
137
|
+
output_template: |
|
|
138
|
+
Decisao arquitetural -> /gos:skills:adr-tech-decisions sempre pergunta antes de chumbar e consulta cloudflare-stack-kb + supabase-stack-kb. Posso rodar.
|
|
139
|
+
|
|
140
|
+
# ─── OUTPUT POLICY ───────────────────────────────────────────
|
|
141
|
+
# Regras estritas de saida em codigo gerado.
|
|
142
|
+
output_policy:
|
|
143
|
+
zero_emoji_em_codigo:
|
|
144
|
+
rule: "NUNCA gerar emoji unicode (\\u{1F300}-\\u{1FAFF}, \\u{2600}-\\u{27BF}) em codigo de UI."
|
|
145
|
+
excecao: "Usuario solicita emoji explicitamente OU output em texto plano para humano (Slack/ClickUp/README)."
|
|
146
|
+
enforcement: "ui-guardrails seccao F bloqueia codegen com emoji."
|
|
147
|
+
|
|
148
|
+
lucide_only:
|
|
149
|
+
rule: "Lucide React e UNICA lib de icones aceita."
|
|
150
|
+
excecao: "Nenhuma. Heroicons/FontAwesome/SVG-inline -> recusar."
|
|
151
|
+
|
|
152
|
+
skeleton_empty_obrigatorios:
|
|
153
|
+
rule: "Toda tela com fetch de dados gera skeleton + empty + error states no mesmo PR."
|
|
154
|
+
excecao: "Nenhuma — vale ate em descartavel (UX e cheap)."
|
|
155
|
+
|
|
156
|
+
no_emoji_em_resposta_default:
|
|
157
|
+
rule: "Conversa default em chat: zero emoji. Use texto direto."
|
|
158
|
+
excecao: "Usuario pede explicitamente."
|
|
159
|
+
|
|
160
|
+
# ─── DEFAULT STACK ───────────────────────────────────────────
|
|
161
|
+
# Quando usuario nao especifica, master propoe este stack.
|
|
162
|
+
default_stack:
|
|
163
|
+
ref: "libraries/default-stack-kb.md"
|
|
164
|
+
frontend:
|
|
165
|
+
framework: "Vite + React 18 + TypeScript (strict)"
|
|
166
|
+
routing: "TanStack Router"
|
|
167
|
+
data: "TanStack Query"
|
|
168
|
+
styling: "Tailwind v4 + shadcn/ui"
|
|
169
|
+
icons: "Lucide React (UNICA lib)"
|
|
170
|
+
forms: "React Hook Form + Zod"
|
|
171
|
+
toasts: "Sonner"
|
|
172
|
+
backend:
|
|
173
|
+
runtime: "Cloudflare Workers (Hono opcional)"
|
|
174
|
+
db: "Supabase Postgres"
|
|
175
|
+
auth: "Supabase Auth (magic link + OAuth)"
|
|
176
|
+
realtime: "Supabase Realtime (preferido) OU Cloudflare DO+WS"
|
|
177
|
+
storage: "Supabase Storage"
|
|
178
|
+
hosting:
|
|
179
|
+
frontend: "Cloudflare Pages"
|
|
180
|
+
backend: "Cloudflare Workers (mesmo dominio /api)"
|
|
181
|
+
tooling:
|
|
182
|
+
pkg_manager: "pnpm (workspace) OU npm (single)"
|
|
183
|
+
deploy: "wrangler"
|
|
184
|
+
db_migrations: "Supabase CLI"
|
|
185
|
+
linter: "Biome (preferido) OU ESLint+Prettier"
|
|
86
186
|
|
|
87
187
|
# ─── COMPREHENSION GATE ──────────────────────────────────────
|
|
88
188
|
# Applies before any delegation to agent, skill, or workflow.
|
|
@@ -250,6 +350,19 @@ routing_matrix:
|
|
|
250
350
|
Transições de status são VINCULANTES com pós-condição: cada task DEVE sair de pendente
|
|
251
351
|
antes da próxima — se o executor não chamar progress-tracker, abortar (bug PLAN-006).
|
|
252
352
|
|
|
353
|
+
audit_screenshots:
|
|
354
|
+
triggers: ["*audit-screenshots", audit screenshots, auditar print, comparar com figma, "essa tela esta errada", "isso aqui esta divergindo", auditoria visual, prints divergentes]
|
|
355
|
+
target: skill:audit-screenshots
|
|
356
|
+
pre_action: Validate .gos-local/plan-paths.json + docs/figma-screen-map.md exist (path em campo `figma_screen_map`). Ausência aborta com instrução clara.
|
|
357
|
+
notes: |
|
|
358
|
+
Skill conversacional. Recebe N prints (anotados ou nao) ao longo da sessao,
|
|
359
|
+
mapeia cada print -> tela -> Figma frame via figma-screen-map.md, acumula
|
|
360
|
+
divergencias. Ao receber `close [SLUG]` emite UM plano `PLAN-NNN-fix-audit-<SLUG>`
|
|
361
|
+
com tasks pendentes — NAO executa codigo. Plano gerado e input direto pra
|
|
362
|
+
*execute-plan e *validate-plan (mesmo template).
|
|
363
|
+
Quando o usuario cola imagem sem comando explicito, assumir `*audit-screenshots add`.
|
|
364
|
+
Anotacoes em vermelho do usuario = high-signal (peso 2x na decisao de virar task).
|
|
365
|
+
|
|
253
366
|
validate_plan:
|
|
254
367
|
triggers: [validate, validar plano, "*validate-plan", validate plan, revisar plano, plano implementado]
|
|
255
368
|
target: skill:validate-plan
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Caveman Compression Rules
|
|
2
|
+
|
|
3
|
+
> Regras detalhadas de compressao usadas por `gos-caveman`. Atribuicao: https://github.com/JuliusBrussee/caveman (MIT).
|
|
4
|
+
|
|
5
|
+
## Niveis
|
|
6
|
+
|
|
7
|
+
### Lite (~30% reducao)
|
|
8
|
+
- Mantem coesao narrativa
|
|
9
|
+
- Remove articulos opcionais
|
|
10
|
+
- Junta sentencas curtas
|
|
11
|
+
|
|
12
|
+
### Full (~75% reducao) — DEFAULT G-OS
|
|
13
|
+
- Estilo telegrafico
|
|
14
|
+
- Frases nominais quando possivel
|
|
15
|
+
- 1 ideia por linha
|
|
16
|
+
|
|
17
|
+
### Ultra (~90% reducao)
|
|
18
|
+
- Quase pseudo-codigo
|
|
19
|
+
- Setas `->` substituem "leva a", "resulta em"
|
|
20
|
+
- Preposicoes minimas
|
|
21
|
+
|
|
22
|
+
## Tabela de transformacoes
|
|
23
|
+
|
|
24
|
+
| Pattern verboso | Caveman lite | Caveman full | Caveman ultra |
|
|
25
|
+
|-----------------|--------------|--------------|---------------|
|
|
26
|
+
| "voce deve fazer X" | "faca X" | "X" | "X" |
|
|
27
|
+
| "e responsavel por" | ":" | ":" | ":" |
|
|
28
|
+
| "que e usado para" | "para" | "p/" | "p/" |
|
|
29
|
+
| "no caso de" | "se" | "se" | "se" |
|
|
30
|
+
| "a fim de que" | "para" | "p/" | "p/" |
|
|
31
|
+
| "por causa de" | "por" | "por" | "<-" |
|
|
32
|
+
| "leva a / resulta em" | "leva a" | "->" | "->" |
|
|
33
|
+
| "e necessario que" | "deve" | "must" | "!" |
|
|
34
|
+
| "nao e necessario" | "nao precisa" | "skip" | "x" |
|
|
35
|
+
|
|
36
|
+
## Pre-fixos preservados (nunca mexer)
|
|
37
|
+
|
|
38
|
+
- Codigo: ` ``` `, `<code>`
|
|
39
|
+
- Inline code: `` ` ``
|
|
40
|
+
- Listas: `-`, `*`, `1.`
|
|
41
|
+
- Headers: `#`, `##`, `###`
|
|
42
|
+
- Frontmatter: `---` blocks
|
|
43
|
+
- Tabelas: `|`
|
|
44
|
+
- Links: `[text](url)`
|
|
45
|
+
|
|
46
|
+
## Anti-padroes
|
|
47
|
+
|
|
48
|
+
- Comprimir codigo. NUNCA.
|
|
49
|
+
- Comprimir mensagem para nao-tecnico. NUNCA.
|
|
50
|
+
- Mudar valores numericos. NUNCA.
|
|
51
|
+
- Trocar nomes proprios. NUNCA.
|
|
52
|
+
|
|
53
|
+
## Self-check
|
|
54
|
+
|
|
55
|
+
Apos comprimir, perguntar mentalmente:
|
|
56
|
+
1. Um leitor tecnico recupera 100% da semantica? Se nao -> reduzir nivel.
|
|
57
|
+
2. Algum nome/numero/path foi alterado? Se sim -> bug, refazer.
|
|
58
|
+
3. A reducao e >=20% (lite) / >=60% (full) / >=80% (ultra)? Se nao -> nao houve compressao real.
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# Cloudflare Stack KB — Free Tier First (2026-05)
|
|
2
|
+
|
|
3
|
+
> Referencia consultada por `adr-tech-decisions` ao decidir arquitetura. Data: 2026-05.
|
|
4
|
+
> Sempre verificar https://developers.cloudflare.com/ para limites atuais antes de chumbar.
|
|
5
|
+
|
|
6
|
+
## Filosofia G-OS para Cloudflare
|
|
7
|
+
|
|
8
|
+
1. **Free tier primeiro**: para MVPs descartaveis, recusar opcoes pagas.
|
|
9
|
+
2. **Monolito Workers + Pages**: front e back no mesmo repo quando possivel — evita CORS, deploy duplo, env separado.
|
|
10
|
+
3. **Sem servidor separado para WebSocket**: usar Durable Objects (free 1M ops/dia), nao infra dedicada.
|
|
11
|
+
4. **Anti-vendor-lock**: documentar saida (R2 -> S3, D1 -> Postgres) no ADR.
|
|
12
|
+
|
|
13
|
+
## Compute
|
|
14
|
+
|
|
15
|
+
### Workers (free)
|
|
16
|
+
- 100k requests/dia
|
|
17
|
+
- 10ms CPU/request (sem extender — paid sobe pra 30s)
|
|
18
|
+
- Sem cold start
|
|
19
|
+
- Compativel com Hono, itty-router, ts-rest
|
|
20
|
+
|
|
21
|
+
### Pages (free)
|
|
22
|
+
- Builds ilimitados
|
|
23
|
+
- 500 builds/mes
|
|
24
|
+
- 100 dominios custom
|
|
25
|
+
- Functions inclusos (Workers embutido na Pages)
|
|
26
|
+
- 20k requests/dia para Functions no free
|
|
27
|
+
|
|
28
|
+
### Workers Paid ($5/mes)
|
|
29
|
+
- 10M requests/mes incluido
|
|
30
|
+
- 30s CPU/request
|
|
31
|
+
- Workers Logs
|
|
32
|
+
|
|
33
|
+
## Storage
|
|
34
|
+
|
|
35
|
+
### D1 (free)
|
|
36
|
+
- 5GB total
|
|
37
|
+
- 5M reads/dia
|
|
38
|
+
- 100k writes/dia
|
|
39
|
+
- SQLite-compatible
|
|
40
|
+
- Boa para CRUD ate ~10k registros ativos
|
|
41
|
+
- **Limitacao: 1 banco por Workers binding (sem cross-db queries)**
|
|
42
|
+
|
|
43
|
+
### KV (free)
|
|
44
|
+
- 100k reads/dia
|
|
45
|
+
- 1k writes/dia (BAIXO — atencao)
|
|
46
|
+
- 1GB total
|
|
47
|
+
- Eventually consistent (~60s replication)
|
|
48
|
+
- Boa para feature flags, sessions, cache leve
|
|
49
|
+
- **Anti-uso: nao usar como banco transacional**
|
|
50
|
+
|
|
51
|
+
### R2 (free)
|
|
52
|
+
- 10GB storage
|
|
53
|
+
- 1M Class A ops/mes (writes/lists)
|
|
54
|
+
- 10M Class B ops/mes (reads)
|
|
55
|
+
- Sem egress fee (vs S3)
|
|
56
|
+
- S3-compatible API
|
|
57
|
+
- Boa para uploads de usuario, assets, backups
|
|
58
|
+
|
|
59
|
+
### Durable Objects (free)
|
|
60
|
+
- 1M requests/mes
|
|
61
|
+
- 400k GB-seconds/mes
|
|
62
|
+
- WebSocket support nativo
|
|
63
|
+
- Storage: 50ms reads/writes locais
|
|
64
|
+
- Boa para: chat rooms, contadores, locks distribuidos, real-time games
|
|
65
|
+
- **Custo invisivel: alarms persistem mesmo se DO esta idle (cobra GB-s)**
|
|
66
|
+
|
|
67
|
+
## Real-time
|
|
68
|
+
|
|
69
|
+
### WebSocket via DO (recomendado para descartavel)
|
|
70
|
+
- Free 1M ops/mes
|
|
71
|
+
- Suporta hibernation (DO desliga e reativa em ~10ms quando WS reconnect)
|
|
72
|
+
- Codigo: `state.acceptWebSocket(ws)` + `webSocketMessage(ws, msg)`
|
|
73
|
+
- Limite: 32k WS conexoes por DO (mas 1 DO ja basta para MVP)
|
|
74
|
+
|
|
75
|
+
### Quando NAO usar DO+WS:
|
|
76
|
+
- Mais de 10k usuarios simultaneos -> usar Supabase Realtime (Postgres-based, escala melhor)
|
|
77
|
+
- Precisa pubsub cross-DO -> adiciona Queues (paid)
|
|
78
|
+
|
|
79
|
+
## Auth
|
|
80
|
+
|
|
81
|
+
### Cloudflare Access (free ate 50 users)
|
|
82
|
+
- Zero-trust auth, sem codigo
|
|
83
|
+
- Login Google/GitHub/email magic link
|
|
84
|
+
- Bom para: dashboards internos, ferramentas de time
|
|
85
|
+
- **Limite: 50 users free; depois $3/user/mes**
|
|
86
|
+
|
|
87
|
+
### Sem auth nativa Workers
|
|
88
|
+
- Workers nao tem session/cookie mgmt embutido
|
|
89
|
+
- Para auth complexa: Supabase Auth ou Auth.js (Lucia)
|
|
90
|
+
|
|
91
|
+
## Bindings (configuracao em wrangler.toml)
|
|
92
|
+
|
|
93
|
+
```toml
|
|
94
|
+
name = "<projeto>"
|
|
95
|
+
compatibility_date = "2026-05-01"
|
|
96
|
+
|
|
97
|
+
[[d1_databases]]
|
|
98
|
+
binding = "DB"
|
|
99
|
+
database_name = "<nome>"
|
|
100
|
+
database_id = "<uuid>"
|
|
101
|
+
|
|
102
|
+
[[kv_namespaces]]
|
|
103
|
+
binding = "KV"
|
|
104
|
+
id = "<uuid>"
|
|
105
|
+
|
|
106
|
+
[[r2_buckets]]
|
|
107
|
+
binding = "R2"
|
|
108
|
+
bucket_name = "<nome>"
|
|
109
|
+
|
|
110
|
+
[[durable_objects.bindings]]
|
|
111
|
+
name = "ROOM"
|
|
112
|
+
class_name = "ChatRoom"
|
|
113
|
+
|
|
114
|
+
[[migrations]]
|
|
115
|
+
tag = "v1"
|
|
116
|
+
new_classes = ["ChatRoom"]
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Patterns recomendados
|
|
120
|
+
|
|
121
|
+
### Pattern A — SPA descartavel (perfil A do ADR)
|
|
122
|
+
- Pages serve `index.html` + assets
|
|
123
|
+
- Sem Workers, sem DB
|
|
124
|
+
- Estado em localStorage
|
|
125
|
+
- 0 setup, deploy via `git push`
|
|
126
|
+
|
|
127
|
+
### Pattern B — App CRUD continuo (perfil B)
|
|
128
|
+
- Pages serve front (Vite build)
|
|
129
|
+
- Workers em `/api/*` rota
|
|
130
|
+
- D1 binding para CRUD
|
|
131
|
+
- Auth: Supabase Auth (front-only) OU Cloudflare Access (zero-config)
|
|
132
|
+
|
|
133
|
+
### Pattern C — Realtime (perfil C)
|
|
134
|
+
- Pages serve front
|
|
135
|
+
- Workers para REST CRUD
|
|
136
|
+
- DO para WebSocket
|
|
137
|
+
- D1 para persistencia OU Supabase Postgres
|
|
138
|
+
- Cloudflare Tunnel se backend precisa rodar localmente em dev
|
|
139
|
+
|
|
140
|
+
## Limites para alarmar (gates do ADR)
|
|
141
|
+
|
|
142
|
+
| Recurso | Limite free | Quando ja preocupar |
|
|
143
|
+
|---------|-------------|---------------------|
|
|
144
|
+
| Workers reqs | 100k/dia | >50k/dia projetado |
|
|
145
|
+
| D1 writes | 100k/dia | CRUD com escrita > 1/s sustentado |
|
|
146
|
+
| KV writes | 1k/dia | Qualquer caso de escrita por user-action |
|
|
147
|
+
| DO requests | 1M/mes | >100 conexoes WS sustentadas |
|
|
148
|
+
| Pages builds | 500/mes | CI commit > 16/dia |
|
|
149
|
+
|
|
150
|
+
## Ferramentas
|
|
151
|
+
|
|
152
|
+
- **Wrangler CLI**: `npm i -g wrangler` — deploy, dev local, tail logs
|
|
153
|
+
- **Local dev**: `wrangler dev` simula Workers localmente, mas D1 local e separado de remote (`--remote` para usar prod)
|
|
154
|
+
- **Logs**: `wrangler tail` (real-time) — gratis ate 5/dia ativos
|
|
155
|
+
|
|
156
|
+
## Anti-patterns para flagar
|
|
157
|
+
|
|
158
|
+
- KV como banco principal: 1k writes/dia mata isso rapido.
|
|
159
|
+
- D1 com >10 tabelas joinadas em 1 query: D1 nao otimiza JOIN como Postgres.
|
|
160
|
+
- DO sem hibernation: deixa 1 conexao WS aberta = cobra GB-s o tempo todo.
|
|
161
|
+
- Pages Functions para logica pesada: limite 100k execucoes/dia, mais baixo que Workers (1M paid).
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Default Stack KB — G-OS canonical (2026-05)
|
|
2
|
+
|
|
3
|
+
> Stack default proposto pelo `gos-master` quando o usuario nao especifica. Sempre confirmado via `adr-tech-decisions` antes de chumbar.
|
|
4
|
+
|
|
5
|
+
## Principios
|
|
6
|
+
|
|
7
|
+
1. **TypeScript everywhere** — front, back, scripts. Nunca JS puro em codigo de app.
|
|
8
|
+
2. **Free tier first** — MVP descartavel cabe 100% no free de Cloudflare + Supabase.
|
|
9
|
+
3. **Zero servidor proprio** — Workers Pages + Supabase substituem Express+VPS.
|
|
10
|
+
4. **Anti-vendor-lock** — Postgres standard (Supabase) e Workers (Hono) sao portaveis.
|
|
11
|
+
|
|
12
|
+
## Stack canonico
|
|
13
|
+
|
|
14
|
+
### Frontend
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
- Vite + React 18 + TypeScript (strict)
|
|
18
|
+
- TanStack Query (data fetching, cache, mutations, optimistic UI)
|
|
19
|
+
- TanStack Router (type-safe routing, loaders, search params tipados)
|
|
20
|
+
- Tailwind CSS v4 + shadcn/ui (Radix primitives + cn() helper)
|
|
21
|
+
- Lucide React (UNICA lib de icones — zero emojis em codigo)
|
|
22
|
+
- React Hook Form + Zod (validacao schema-first)
|
|
23
|
+
- Sonner (toasts)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Backend
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
- Cloudflare Workers (Hono framework opcional para routing)
|
|
30
|
+
- Cloudflare Pages Functions (alternativa lightweight para API routes simples)
|
|
31
|
+
- Supabase Postgres (DB principal — preferido sobre D1 quando precisa JOIN/RLS)
|
|
32
|
+
- Supabase Auth (OAuth + magic link — substitui Auth.js/Clerk)
|
|
33
|
+
- Supabase Realtime (WebSocket via Postgres logical replication)
|
|
34
|
+
- Supabase Storage (blob storage com transformacoes de imagem)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Hosting
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
- Frontend: Cloudflare Pages (deploy via git push)
|
|
41
|
+
- Backend: Cloudflare Workers (mesmo dominio, prefixo /api/*)
|
|
42
|
+
- DNS: Cloudflare (proxy on, SSL auto)
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Tooling
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
- pnpm (workspace para monorepo, usar npm em projeto unico)
|
|
49
|
+
- Wrangler CLI (deploy + dev local Workers)
|
|
50
|
+
- Supabase CLI (migrations + tipos gerados)
|
|
51
|
+
- Biome OU ESLint+Prettier (preferencia: Biome — mais rapido, zero config)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Quando NAO usar este stack
|
|
55
|
+
|
|
56
|
+
| Caso | Stack alternativo | Motivo |
|
|
57
|
+
|------|-------------------|--------|
|
|
58
|
+
| SSR pesado / SEO crítico | Next.js + Vercel | Workers Pages serve SPA — para SSR usar Next |
|
|
59
|
+
| Backoffice + ETL pesado | Node em VPS + Postgres dedicado | Workers tem limite 30s |
|
|
60
|
+
| App mobile nativo | Expo + React Native | Mas API pode continuar Workers+Supabase |
|
|
61
|
+
| Realtime massivo (>1k conn) | Supabase Realtime > Cloudflare DO | Postgres-based escala melhor pra MVP |
|
|
62
|
+
|
|
63
|
+
## Setup rapido (script mental)
|
|
64
|
+
|
|
65
|
+
1. `npm create vite@latest <projeto> -- --template react-ts`
|
|
66
|
+
2. `cd <projeto> && npm i`
|
|
67
|
+
3. `npx shadcn@latest init` (escolher Tailwind v4, slate base)
|
|
68
|
+
4. `npm i @tanstack/react-query @tanstack/react-router lucide-react react-hook-form @hookform/resolvers zod sonner`
|
|
69
|
+
5. `npm i @supabase/supabase-js`
|
|
70
|
+
6. `npm i -D wrangler`
|
|
71
|
+
7. Configurar `wrangler.toml` apontando para Pages
|
|
72
|
+
8. `wrangler pages deploy dist` (apos primeiro build)
|
|
73
|
+
|
|
74
|
+
## Decisoes embutidas (nao precisa perguntar)
|
|
75
|
+
|
|
76
|
+
- React vs Vue/Svelte -> React (ecossistema + hiring + LLM training data).
|
|
77
|
+
- TanStack Query vs SWR -> TanStack (cache mais granular, devtools).
|
|
78
|
+
- TanStack Router vs React Router -> TanStack (type-safe, search params tipados).
|
|
79
|
+
- Tailwind v3 vs v4 -> v4 (CSS-first, lightning CSS).
|
|
80
|
+
- Lucide vs Heroicons vs FontAwesome -> Lucide (mais variantes, tree-shake melhor).
|
|
81
|
+
- Supabase Auth vs Clerk vs Auth.js -> Supabase (mesmo provider do DB = RLS integrado).
|
|
82
|
+
- Magic link vs password -> magic link first (UX superior, sem reset password fluxo).
|
|
83
|
+
|
|
84
|
+
## Decisoes que DEVEM perguntar (regra do dono)
|
|
85
|
+
|
|
86
|
+
- D1 vs Supabase Postgres (depende de complexidade do schema)
|
|
87
|
+
- Workers DO vs Supabase Realtime (chat ad-hoc vs notif baseada em DB)
|
|
88
|
+
- Monorepo (turborepo) vs single repo (depende de N apps)
|
|
89
|
+
- Analytics (PostHog vs Plausible vs nada)
|
|
90
|
+
- Error tracking (Sentry vs nada vs Cloudflare Logs)
|
|
91
|
+
|
|
92
|
+
## Output policy do master
|
|
93
|
+
|
|
94
|
+
`gos-master`, ao iniciar conversa de novo projeto, SEMPRE oferece este stack como ponto de partida. Frase tipica:
|
|
95
|
+
|
|
96
|
+
> "Para o MVP descartavel/continuo, o default que recomendo e Vite+React+TS, TanStack Query/Router, Tailwind v4 + shadcn/ui, Lucide React (icones), hospedado em Cloudflare Pages com Workers no /api e Supabase como DB+Auth+Realtime+Storage. Prefere alguma alternativa ou seguimos com isso e vamos refinando?"
|
|
97
|
+
|
|
98
|
+
Decisoes sao validadas em `adr-tech-decisions` (skill SEMPRE pergunta antes de chumbar).
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# Engineering Best Practices — G-OS
|
|
2
|
+
|
|
3
|
+
> Padroes de codigo, arquitetura e workflow. Aplicado em todo `plan-blueprint`, codegen e revisao.
|
|
4
|
+
|
|
5
|
+
## TypeScript — strict mode obrigatorio
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
// tsconfig.json
|
|
9
|
+
{
|
|
10
|
+
"compilerOptions": {
|
|
11
|
+
"strict": true,
|
|
12
|
+
"noImplicitAny": true,
|
|
13
|
+
"strictNullChecks": true,
|
|
14
|
+
"noUncheckedIndexedAccess": true,
|
|
15
|
+
"noFallthroughCasesInSwitch": true
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Regras
|
|
21
|
+
|
|
22
|
+
- **Nunca** `as any`, `@ts-ignore` sem comentario justificando.
|
|
23
|
+
- **Permitido** `@ts-expect-error` com comentario obrigatorio.
|
|
24
|
+
- `interface` para objetos de dominio e contratos.
|
|
25
|
+
- `type` para unions, intersections, utilitarios.
|
|
26
|
+
- **Nunca enum** — use `const X = { ... } as const` + `type Status = typeof X[keyof typeof X]`.
|
|
27
|
+
- Generics tipados — sem `T = any`.
|
|
28
|
+
|
|
29
|
+
## React 18 — patterns
|
|
30
|
+
|
|
31
|
+
### Componentes
|
|
32
|
+
- Funcionais sempre. Class components proibidos.
|
|
33
|
+
- `function declaration` para componentes principais (export default).
|
|
34
|
+
- `arrow function` para callbacks/handlers.
|
|
35
|
+
- Props tipadas via `interface`.
|
|
36
|
+
- Children: `React.ReactNode` (nao `JSX.Element[]`).
|
|
37
|
+
|
|
38
|
+
### Hooks
|
|
39
|
+
- `useState` para estado local primitivo.
|
|
40
|
+
- `useReducer` para state machine (>3 transicoes).
|
|
41
|
+
- `useEffect` apenas para sincronizacao com sistema externo (DOM, network, subscriptions).
|
|
42
|
+
- **NUNCA** `useEffect` para derivar state — calcular inline ou `useMemo`.
|
|
43
|
+
- Custom hooks com prefix `use` + camelCase (`useAuth`, `useProjects`).
|
|
44
|
+
|
|
45
|
+
### Estado global
|
|
46
|
+
- Servidor: TanStack Query (cache + invalidation).
|
|
47
|
+
- Cliente: Zustand para complexo, `useState` lift-up para simples.
|
|
48
|
+
- **Nunca** Redux em projeto novo.
|
|
49
|
+
|
|
50
|
+
## TanStack Query — patterns
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
// Query key como tupla [domain, params]
|
|
54
|
+
const projects = useQuery({
|
|
55
|
+
queryKey: ['projects', { status: 'active' }],
|
|
56
|
+
queryFn: () => api.projects.list({ status: 'active' }),
|
|
57
|
+
staleTime: 60_000, // 1min
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Mutation com invalidacao
|
|
61
|
+
const createProject = useMutation({
|
|
62
|
+
mutationFn: api.projects.create,
|
|
63
|
+
onSuccess: () => qc.invalidateQueries({ queryKey: ['projects'] }),
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Anti-patterns
|
|
68
|
+
- Refetch on window focus em lista grande (custo de rede).
|
|
69
|
+
- queryKey como string (`'projects'`) — sempre array.
|
|
70
|
+
- Mutation sem `onError` quando UX precisa rollback.
|
|
71
|
+
|
|
72
|
+
## TanStack Router — patterns
|
|
73
|
+
|
|
74
|
+
- Routes em `src/routes/<path>.tsx` com file-based routing OU codegen.
|
|
75
|
+
- Loader para dados criticos (bloqueia render ate ter).
|
|
76
|
+
- Search params via `validateSearch` Zod.
|
|
77
|
+
- Type-safe params: `Route.useParams()`.
|
|
78
|
+
|
|
79
|
+
## File structure (single-app)
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
src/
|
|
83
|
+
routes/ # rotas TanStack
|
|
84
|
+
components/
|
|
85
|
+
ui/ # shadcn primitives
|
|
86
|
+
<feature>/ # componentes especificos do dominio
|
|
87
|
+
hooks/ # custom hooks reutilizaveis
|
|
88
|
+
lib/
|
|
89
|
+
supabase.ts # client
|
|
90
|
+
utils.ts # cn(), formatters
|
|
91
|
+
schemas/ # Zod schemas
|
|
92
|
+
types/ # tipos compartilhados
|
|
93
|
+
api/ # client API (workers fetch wrappers)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## File structure (monorepo)
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
apps/
|
|
100
|
+
web/ # frontend
|
|
101
|
+
worker/ # backend Workers
|
|
102
|
+
packages/
|
|
103
|
+
ui/ # design system compartilhado
|
|
104
|
+
schemas/ # Zod schemas usados front+back
|
|
105
|
+
types/ # tipos compartilhados
|
|
106
|
+
config/ # tsconfig base, eslint base
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Naming
|
|
110
|
+
|
|
111
|
+
- Componentes: `PascalCase` (`ProjectCard.tsx`).
|
|
112
|
+
- Hooks: `camelCase` com `use` prefix (`useProjects.ts`).
|
|
113
|
+
- Utils: `camelCase` (`formatCurrency.ts`).
|
|
114
|
+
- Types: `PascalCase` (`Project`, `User`).
|
|
115
|
+
- Constants: `SCREAMING_SNAKE_CASE` (`MAX_FILE_SIZE`).
|
|
116
|
+
- Booleans: `is/has/should` prefix (`isLoading`, `hasError`).
|
|
117
|
+
|
|
118
|
+
## Commits — Conventional Commits
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
<type>(<scope>): <subject>
|
|
122
|
+
|
|
123
|
+
[body]
|
|
124
|
+
|
|
125
|
+
[footer]
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Types: `feat`, `fix`, `refactor`, `chore`, `docs`, `test`, `style`, `perf`, `ci`.
|
|
129
|
+
|
|
130
|
+
Exemplos:
|
|
131
|
+
- `feat(auth): add magic link login`
|
|
132
|
+
- `fix(projects): correct active count`
|
|
133
|
+
- `refactor(api): extract supabase client`
|
|
134
|
+
|
|
135
|
+
## Branches
|
|
136
|
+
|
|
137
|
+
- `main` — producao.
|
|
138
|
+
- `dev` — integracao.
|
|
139
|
+
- `feat/<slug>` — feature em desenvolvimento.
|
|
140
|
+
- `fix/<slug>` — bug fix.
|
|
141
|
+
- `chore/<slug>` — limpeza.
|
|
142
|
+
|
|
143
|
+
## Workflow
|
|
144
|
+
|
|
145
|
+
1. `feat/<slug>` -> commits pequenos e atomicos.
|
|
146
|
+
2. PR para `dev`.
|
|
147
|
+
3. Code review obrigatorio (auto-review aceito em MVP descartavel).
|
|
148
|
+
4. CI passa (build + tsc + tests).
|
|
149
|
+
5. Merge squash.
|
|
150
|
+
6. `dev` -> `main` periodicamente.
|
|
151
|
+
|
|
152
|
+
## Testing
|
|
153
|
+
|
|
154
|
+
### MVP descartavel
|
|
155
|
+
- Smoke test manual antes de deploy.
|
|
156
|
+
- Sem unit tests obrigatorios.
|
|
157
|
+
|
|
158
|
+
### Continuo
|
|
159
|
+
- Vitest para units (so logica pura, formatadores, hooks).
|
|
160
|
+
- Playwright para E2E em fluxos criticos (login, checkout, dashboard).
|
|
161
|
+
- Coverage minima: 60% em logica de negocio.
|
|
162
|
+
- **NAO** testar componentes UI puros (chumba implementacao).
|
|
163
|
+
|
|
164
|
+
## Performance
|
|
165
|
+
|
|
166
|
+
- Lazy load rotas: `React.lazy` + `Suspense`.
|
|
167
|
+
- Code split por feature (TanStack Router cuida).
|
|
168
|
+
- Imagens: WebP via Cloudflare Image Transformations.
|
|
169
|
+
- Bundle target: <200KB inicial gzip.
|
|
170
|
+
- Lighthouse score 90+ em mobile.
|
|
171
|
+
|
|
172
|
+
## Acessibilidade
|
|
173
|
+
|
|
174
|
+
- Labels em todos inputs (`htmlFor` + `id` ou `aria-label`).
|
|
175
|
+
- Roles ARIA em componentes custom.
|
|
176
|
+
- Focus management em modal/drawer.
|
|
177
|
+
- Contraste AA (4.5:1 texto, 3:1 UI).
|
|
178
|
+
- Keyboard navigation em todos os flows interativos.
|
|
179
|
+
|
|
180
|
+
Detalhe completo: `libraries/ui-guardrails-checklist.md`.
|
|
181
|
+
|
|
182
|
+
## Architecture — Hexagonal-ish (continuo)
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
src/
|
|
186
|
+
domain/ # entidades, value objects, regras puras
|
|
187
|
+
application/ # use cases, services
|
|
188
|
+
infrastructure/ # adapters (supabase, workers, http)
|
|
189
|
+
ui/ # React components
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Em MVP descartavel, achatar para `lib/` + `components/` direto.
|
|
193
|
+
|
|
194
|
+
## Anti-patterns
|
|
195
|
+
|
|
196
|
+
- Componente >500 linhas — quebrar em sub-components.
|
|
197
|
+
- Hook com >5 useState — provavelmente precisa useReducer.
|
|
198
|
+
- Funcao com >50 linhas — extrair sub-funcoes.
|
|
199
|
+
- `any` em props — sempre tipar.
|
|
200
|
+
- `console.log` em codigo que vai pra prod — usar logger ou remover.
|
|
201
|
+
- TODO sem prazo/owner — vira divida tecnica permanente.
|
|
202
|
+
- Comentario explicando WHAT do codigo — refatorar nome em vez de comentar.
|
|
203
|
+
|
|
204
|
+
## Referencias completas
|
|
205
|
+
|
|
206
|
+
- `docs-tools/docs/engineering/dev/02-padroes-codigo.md` — base completa.
|
|
207
|
+
- `docs-tools/docs/engineering/arquitetura/hexagonal.md` — para apps continuos.
|
|
208
|
+
- `docs-tools/docs/engineering/dev/01-workflow-desenvolvimento.md` — fluxo de trabalho.
|