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
|
@@ -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.
|
|
@@ -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,75 @@
|
|
|
1
|
+
# Component Reuse Gate
|
|
2
|
+
|
|
3
|
+
> Disciplina design-to-code aplicada a CADA divergência detectada por `audit-screenshots` (e por
|
|
4
|
+
> `plan-blueprint` Fase 1.3). Antes de virar task de correção, toda divergência que toca uma estrutura
|
|
5
|
+
> reusável passa por: **mapear → checar biblioteca → decidir reuse | create | merge**. O objetivo é
|
|
6
|
+
> nunca corrigir com patch one-off quando a correção certa é uma primitiva compartilhada.
|
|
7
|
+
|
|
8
|
+
## Por que
|
|
9
|
+
|
|
10
|
+
Corrigir uma tela "na mão" (className solta, JSX duplicado) resolve a tela e multiplica dívida: a próxima
|
|
11
|
+
tela com a mesma table/card/form repete o bug. A correção correta promove (ou reusa) uma primitiva — o
|
|
12
|
+
delta entre telas vira só **dados**, não estrutura.
|
|
13
|
+
|
|
14
|
+
## Heurística de decisão (score vs biblioteca)
|
|
15
|
+
|
|
16
|
+
Para cada divergência cujo alvo é uma estrutura reusável (table, card, form, list, modal, toolbar):
|
|
17
|
+
|
|
18
|
+
1. **Mapear** o elemento → nome de componente candidato (estilo `plan-blueprint` Fase 1.3: indexar
|
|
19
|
+
`dirs.components/` + `.stories.tsx`).
|
|
20
|
+
2. **Rodar `component-dedup`** (ou o equivalente inline: grep nome + comparar props/estrutura/variantes).
|
|
21
|
+
3. **Decidir** pelo score:
|
|
22
|
+
|
|
23
|
+
| Score vs existente | Decisão | `component_decision` | Ação na task |
|
|
24
|
+
|--------------------|---------|----------------------|--------------|
|
|
25
|
+
| 71–100% (essencialmente o mesmo) | **REUSE** | `reuse` | `component_target` = primitiva existente; muda só dados/props |
|
|
26
|
+
| 31–70% (overlap parcial) | **MERGE** | `merge` | combinar features → estender a primitiva (nova variant/prop) |
|
|
27
|
+
| 0–30% (não existe equivalente) | **CREATE** | `create` | criar primitiva nova no DS; task de criação antes do uso |
|
|
28
|
+
|
|
29
|
+
A decisão grava no frontmatter da task (`component_decision`, `component_target`). REUSE/MERGE referenciam
|
|
30
|
+
o path da primitiva; CREATE gera task de criação que precede a task de uso (`depends_on`).
|
|
31
|
+
|
|
32
|
+
## Padrão de referência: DataTable + TanStack (Fractus)
|
|
33
|
+
|
|
34
|
+
Caso canônico de **REUSE**. No Fractus, `src/components/ui/data-table.tsx` é a primitiva única:
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
interface DataTableProps<TData, TValue> {
|
|
38
|
+
columns: ColumnDef<TData, TValue>[]
|
|
39
|
+
data: TData[]
|
|
40
|
+
loading?: boolean
|
|
41
|
+
emptyMessage?: string
|
|
42
|
+
tableRef?: React.MutableRefObject<Table<TData> | null>
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Cada tela define só `columns` + `data` e compõe a primitiva:
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
// negocios-table.tsx — NÃO reimplementa <table>, reusa DataTable
|
|
50
|
+
const columns = getNegociosColumns(projectId, canDelete, onDelete, deletingId)
|
|
51
|
+
return <DataTable columns={columns} data={negocios} loading={loading} emptyMessage="Nenhum negócio encontrado" />
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
`negocios-table`, `funders-table`, `impacto-tab-content` — **uma primitiva, N usos**. O que muda entre
|
|
55
|
+
telas: **as colunas (header + cell render) e os dados das rows**. Nada de estrutura de tabela duplicada.
|
|
56
|
+
|
|
57
|
+
**Regra prática para o audit:** divergência em qualquer tabela →
|
|
58
|
+
- existe `DataTable` (ou equivalente) no DS? → **REUSE**: a correção é nas `columns` daquela tela OU na
|
|
59
|
+
primitiva (se o defeito é compartilhado). Nunca um `<table>` novo na página.
|
|
60
|
+
- o defeito é da primitiva (afeta todas as telas)? → corrigir na primitiva (1 task, `component_target` = `data-table.tsx`).
|
|
61
|
+
- precisa de comportamento que a primitiva não suporta? → **MERGE** (nova prop/variant na primitiva).
|
|
62
|
+
|
|
63
|
+
O mesmo raciocínio vale para Card, Form, Toolbar, EmptyState etc.: se a estrutura se repete ou pode se
|
|
64
|
+
repetir, ela é primitiva; a tela só injeta dados.
|
|
65
|
+
|
|
66
|
+
## Saída na task
|
|
67
|
+
|
|
68
|
+
```yaml
|
|
69
|
+
component_decision: reuse # reuse | create | merge
|
|
70
|
+
component_target: src/components/ui/data-table.tsx
|
|
71
|
+
override_target: NegociosTable:area-column # quando a correção é cosmética de uso
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
A task descreve a correção em termos de **dados/props da primitiva** (REUSE), **extensão da primitiva**
|
|
75
|
+
(MERGE) ou **nova primitiva + adoção** (CREATE) — seguindo o modelo O QUE / ONDE / COMO / POR QUE.
|
|
@@ -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).
|