ganbatte-os 0.2.37 → 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 +100 -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 +21 -3
- package/.gos/skills/cloudflare-pages-setup/SKILL.md +180 -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 +10 -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 +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/prdLeanTemplate.md +40 -0
- package/package.json +1 -1
|
@@ -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
|
|
@@ -23,6 +23,19 @@ metadata:
|
|
|
23
23
|
|
|
24
24
|
Voce esta executando como **Auditor Visual** via skill audit-screenshots. Acumula divergencias visuais detectadas pelo usuario em prints, mapeia cada uma pro Figma canonico, e ao fechar emite UM plano de correcao (OBJETIVO=correcao) com tasks pendentes — sem executar codigo.
|
|
25
25
|
|
|
26
|
+
## Contrato de single-pass (CRITICO — fix do gargalo de contexto)
|
|
27
|
+
|
|
28
|
+
Comparacao print vs Figma deve ser SEMPRE single-pass dentro da acao `add`:
|
|
29
|
+
|
|
30
|
+
1. Ao receber print -> imagem fica em contexto.
|
|
31
|
+
2. Pull do frame Figma via MCP -> 2 imagens em contexto.
|
|
32
|
+
3. Lenses 1-6 (ver `libraries/visual-diff-lenses.md`) executadas IMEDIATAMENTE, com ambas imagens visiveis.
|
|
33
|
+
4. Divergencias materializadas em texto descritivo COMPLETO no JSON da sessao (`expected`, `actual`, `where`) — NUNCA "ver imagem", "comparar depois".
|
|
34
|
+
5. Imagens do print/figma ficam em disco para audit-evidence; texto da divergencia ja e self-contained.
|
|
35
|
+
6. Acao `close` NUNCA re-compara. Apenas le `audit-session.json` (puro texto) + agrupa + escreve plan/tasks.
|
|
36
|
+
|
|
37
|
+
Violacao -> bug. Se acao `close` perceber que alguma divergencia esta vazia/incompleta, abortar com instrucao para o usuario re-rodar `add` daquele print.
|
|
38
|
+
|
|
26
39
|
## Input
|
|
27
40
|
|
|
28
41
|
$ARGUMENTS
|
|
@@ -77,12 +90,14 @@ Persistido em <dirs.audit_state> (default .gos-local/audit-session.json):
|
|
|
77
90
|
c) Ambiguo ou sem sinal: AskUserQuestion listando 5 candidatos top do mapa + opcao "outro" (usuario digita rota).
|
|
78
91
|
3. **Resolver figma_node_id + URL** via lookup no mapa.
|
|
79
92
|
4. **Pull do frame Figma** via Figma MCP get_image pelo node-id. Salvar em .gos-local/audit-images/NN.figma.png. Se Figma MCP indisponivel: registrar figma_image_path: null e seguir (comparacao fica baseada apenas no print + node-id).
|
|
80
|
-
5. **Comparacao
|
|
81
|
-
-
|
|
93
|
+
5. **Comparacao single-pass** (lenses 1-6 com ambas imagens em contexto AGORA):
|
|
94
|
+
- Aplicar lenses na ordem (layout -> tokens -> estados -> conteudo -> interacao -> a11y) — ver `libraries/visual-diff-lenses.md`.
|
|
82
95
|
- Listar divergencias em divergences[] (kind: anatomy | token | behavior | data-missing | state-missing | cleanup-legacy).
|
|
96
|
+
- **CADA divergencia DEVE ter** `where` (localizacao precisa), `expected` (do Figma), `actual` (do print). Sem qualquer um, NAO persistir — re-aplicar lens.
|
|
83
97
|
- **Anotacoes em vermelho do usuario** = high-signal: cada item anotado vira divergencia com peso 2x (quase certamente vira task no close).
|
|
84
98
|
- Comentarios livres do usuario (user_context) = high-signal igual.
|
|
85
|
-
|
|
99
|
+
- Validar self-contained: usuario que ler so o JSON (sem ver imagem) entende cada item? Se nao -> reescrever.
|
|
100
|
+
6. **Persistir** entrada nova no audit-session.json (somente apos validar self-contained).
|
|
86
101
|
7. **Output ao usuario** (curto):
|
|
87
102
|
|
|
88
103
|
[audit] +1 print (total: N) — tela: <rota> (node-id: NNNN-NNNNN)
|
|
@@ -107,7 +122,10 @@ Nao emite plano. Nao modifica estado.
|
|
|
107
122
|
|
|
108
123
|
## Acao close [SLUG]
|
|
109
124
|
|
|
125
|
+
**REGRA CRITICA**: `close` opera SOMENTE sobre o JSON da sessao (texto). NUNCA re-le imagens. NUNCA re-aplica lenses. Se uma divergencia esta vazia/incompleta no JSON, abortar com mensagem ao usuario para re-rodar `add` daquele print especifico — close nao tenta consertar.
|
|
126
|
+
|
|
110
127
|
1. **Resolver SLUG**: argumento explicito > <projeto-name>-<iso-date>. Sanitizar (lowercase, hifens).
|
|
128
|
+
1.5. **Validar self-contained**: ler audit-session.json e verificar que cada divergencia tem `where`, `expected`, `actual`, `kind`, `fix`. Faltando -> abortar com lista de prints incompletos.
|
|
111
129
|
2. **Calcular PLAN-NNN**: ler <dirs.planos>/ e pegar maior NNN existente + 1.
|
|
112
130
|
3. **Agrupar divergencias por tela** (resolved_screen).
|
|
113
131
|
4. **Emitir <dirs.planos>/PLAN-NNN-fix-audit-<SLUG>/plan.md** baseado em templates/planTemplate.md:
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cloudflare-pages-setup
|
|
3
|
+
description: >
|
|
4
|
+
Guia interativo para configurar projeto novo em Cloudflare Pages + Workers. Cobre
|
|
5
|
+
wrangler.toml, bindings (D1/KV/R2/DO), Pages Functions vs Workers separados,
|
|
6
|
+
preview vs production, custom domain. Pergunta antes de chumbar.
|
|
7
|
+
argument-hint: "<acao: init|add-binding|deploy|env> [args]"
|
|
8
|
+
allowedTools: [Read, Glob, Grep, Bash, Write, Edit, AskUserQuestion]
|
|
9
|
+
sourceDocs:
|
|
10
|
+
- libraries/cloudflare-stack-kb.md
|
|
11
|
+
- libraries/security-best-practices.md
|
|
12
|
+
- libraries/default-stack-kb.md
|
|
13
|
+
use-when:
|
|
14
|
+
- novo projeto precisa configurar Cloudflare Pages
|
|
15
|
+
- usuario quer adicionar binding (D1, KV, R2, DO) a Workers existente
|
|
16
|
+
- configurar custom domain ou env vars no Pages
|
|
17
|
+
- deploy primeiro (push) ou troubleshoot CI Pages
|
|
18
|
+
do-not-use-for:
|
|
19
|
+
- Vercel/Netlify/AWS (stack alternativo, usar deploy-to-vercel ou similar)
|
|
20
|
+
- apenas Workers sem Pages (ja existe wrangler init)
|
|
21
|
+
metadata:
|
|
22
|
+
category: infrastructure
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
Voce esta executando como **Cloudflare Setup Helper** via skill `cloudflare-pages-setup`. Conduz setup interativo, sempre perguntando antes de gravar arquivo.
|
|
26
|
+
|
|
27
|
+
## Acoes
|
|
28
|
+
|
|
29
|
+
### `init` — projeto novo (Pages + Workers)
|
|
30
|
+
|
|
31
|
+
1. Ler `package.json` se existir. Se nao, propor `npm create vite@latest` primeiro.
|
|
32
|
+
2. AskUserQuestion sequencial:
|
|
33
|
+
- "Project name (slug Cloudflare):"
|
|
34
|
+
- "Custom domain (deixe vazio para usar `<slug>.pages.dev`):"
|
|
35
|
+
- "Backend: Pages Functions (mesmo repo, /functions/) ou Worker separado (/api/*)?"
|
|
36
|
+
- "DB: Supabase Postgres / D1 / nenhum?"
|
|
37
|
+
- "Auth: Supabase Auth / Cloudflare Access / nenhum?"
|
|
38
|
+
- "Storage: R2 / Supabase Storage / nenhum?"
|
|
39
|
+
3. Gerar `wrangler.toml` apropriado (ver templates abaixo).
|
|
40
|
+
4. Gerar `.env.example` + `.gitignore` (entradas para `.env`, `.dev.vars`, `node_modules`).
|
|
41
|
+
5. Gerar `package.json` scripts: `dev`, `build`, `preview`, `deploy:preview`, `deploy:prod`.
|
|
42
|
+
6. Mostrar `wrangler login` + `wrangler secret put <NAME>` para credentials.
|
|
43
|
+
|
|
44
|
+
### `add-binding` — adicionar D1/KV/R2/DO
|
|
45
|
+
|
|
46
|
+
1. Ler `wrangler.toml` existente.
|
|
47
|
+
2. Pergunta: "Tipo de binding?" (D1, KV, R2, DO).
|
|
48
|
+
3. Pergunta: "Nome do binding (variavel JS):" — ex `DB`, `KV`, `IMAGES`, `ROOM`.
|
|
49
|
+
4. Para D1: `wrangler d1 create <name>` + adicionar bloco `[[d1_databases]]`.
|
|
50
|
+
5. Para KV: `wrangler kv:namespace create <name>` + adicionar bloco `[[kv_namespaces]]`.
|
|
51
|
+
6. Para R2: `wrangler r2 bucket create <name>` + bloco `[[r2_buckets]]`.
|
|
52
|
+
7. Para DO: gera class skeleton em `src/durable-objects/<Name>.ts` + bloco `[[durable_objects.bindings]]` + migration.
|
|
53
|
+
8. Gerar tipos TypeScript (`worker-configuration.d.ts`).
|
|
54
|
+
|
|
55
|
+
### `deploy` — deploy preview ou production
|
|
56
|
+
|
|
57
|
+
1. Pergunta: "Preview ou production?"
|
|
58
|
+
2. Validar `wrangler.toml` parseavel.
|
|
59
|
+
3. Validar build local: `npm run build`.
|
|
60
|
+
4. Preview: `wrangler pages deploy dist --branch=<slug>` -> retorna URL temporaria.
|
|
61
|
+
5. Prod: `wrangler pages deploy dist --branch=main` (somente se branch atual e main).
|
|
62
|
+
6. Mostrar URL final + dashboard link.
|
|
63
|
+
|
|
64
|
+
### `env` — gerenciar env vars / secrets
|
|
65
|
+
|
|
66
|
+
1. Pergunta: "List, add, remove, ou pull?"
|
|
67
|
+
2. List: `wrangler secret list` + `wrangler pages project list`.
|
|
68
|
+
3. Add: `wrangler secret put <NAME>` (interativo, esconde valor digitado).
|
|
69
|
+
4. Remove: `wrangler secret delete <NAME>` (confirma antes).
|
|
70
|
+
5. Pull: copia env do dashboard pra `.dev.vars` local.
|
|
71
|
+
|
|
72
|
+
## Templates
|
|
73
|
+
|
|
74
|
+
### wrangler.toml — Pages Functions (recomendado MVP)
|
|
75
|
+
|
|
76
|
+
```toml
|
|
77
|
+
name = "<slug>"
|
|
78
|
+
compatibility_date = "2026-05-01"
|
|
79
|
+
compatibility_flags = ["nodejs_compat"]
|
|
80
|
+
|
|
81
|
+
# Pages config
|
|
82
|
+
pages_build_output_dir = "dist"
|
|
83
|
+
|
|
84
|
+
# Bindings (descomente os que usar)
|
|
85
|
+
# [[d1_databases]]
|
|
86
|
+
# binding = "DB"
|
|
87
|
+
# database_name = "<name>"
|
|
88
|
+
# database_id = "<uuid>"
|
|
89
|
+
|
|
90
|
+
# [[kv_namespaces]]
|
|
91
|
+
# binding = "KV"
|
|
92
|
+
# id = "<uuid>"
|
|
93
|
+
|
|
94
|
+
# [[r2_buckets]]
|
|
95
|
+
# binding = "R2"
|
|
96
|
+
# bucket_name = "<name>"
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### wrangler.toml — Workers separado
|
|
100
|
+
|
|
101
|
+
```toml
|
|
102
|
+
name = "<slug>-api"
|
|
103
|
+
main = "src/worker/index.ts"
|
|
104
|
+
compatibility_date = "2026-05-01"
|
|
105
|
+
compatibility_flags = ["nodejs_compat"]
|
|
106
|
+
|
|
107
|
+
[vars]
|
|
108
|
+
PUBLIC_VAR = "value"
|
|
109
|
+
|
|
110
|
+
# Secrets sao via `wrangler secret put`, nao em vars.
|
|
111
|
+
|
|
112
|
+
[[d1_databases]]
|
|
113
|
+
binding = "DB"
|
|
114
|
+
database_name = "<name>"
|
|
115
|
+
database_id = "<uuid>"
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Pages Functions structure
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
project/
|
|
122
|
+
functions/
|
|
123
|
+
api/
|
|
124
|
+
[[path]].ts # catch-all com Hono opcional
|
|
125
|
+
src/
|
|
126
|
+
main.tsx # Vite entry
|
|
127
|
+
dist/ # build output
|
|
128
|
+
wrangler.toml
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
```ts
|
|
132
|
+
// functions/api/[[path]].ts
|
|
133
|
+
import { Hono } from 'hono';
|
|
134
|
+
|
|
135
|
+
type Bindings = {
|
|
136
|
+
DB: D1Database;
|
|
137
|
+
// SUPABASE_URL: string;
|
|
138
|
+
// SUPABASE_SERVICE_KEY: string;
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
const app = new Hono<{ Bindings: Bindings }>();
|
|
142
|
+
|
|
143
|
+
app.get('/projects', async (c) => {
|
|
144
|
+
const result = await c.env.DB.prepare('select * from projects').all();
|
|
145
|
+
return c.json(result.results);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
export const onRequest = (ctx: any) => app.fetch(ctx.request, ctx.env, ctx);
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Custom domain
|
|
152
|
+
|
|
153
|
+
1. `wrangler pages project list` -> confirma projeto.
|
|
154
|
+
2. Dashboard -> Pages -> projeto -> Custom domains -> Add.
|
|
155
|
+
3. Adicionar CNAME no DNS apontando para `<slug>.pages.dev`.
|
|
156
|
+
4. Aguardar SSL (1-15min).
|
|
157
|
+
|
|
158
|
+
## Checklist de seguranca pos-setup
|
|
159
|
+
|
|
160
|
+
(Aplica `libraries/security-best-practices.md`)
|
|
161
|
+
|
|
162
|
+
- [ ] `.env`, `.dev.vars` no `.gitignore`.
|
|
163
|
+
- [ ] `service_role_key` Supabase NUNCA em `vars` do wrangler.toml — sempre `wrangler secret put`.
|
|
164
|
+
- [ ] CORS configurado para origem conhecida (`Access-Control-Allow-Origin: https://<slug>.pages.dev`).
|
|
165
|
+
- [ ] HTTPS forced (Cloudflare default).
|
|
166
|
+
- [ ] `compatibility_date` recente (max 6 meses).
|
|
167
|
+
|
|
168
|
+
## Troubleshooting comum
|
|
169
|
+
|
|
170
|
+
| Erro | Causa | Fix |
|
|
171
|
+
|------|-------|-----|
|
|
172
|
+
| "wrangler: command not found" | nao instalado | `npm i -D wrangler` + `npx wrangler ...` |
|
|
173
|
+
| "Authentication required" | nao logou | `wrangler login` (abre browser) |
|
|
174
|
+
| Build falha em CI Pages | env var faltando | adicionar no dashboard Pages > Settings > Env |
|
|
175
|
+
| `Workers limit exceeded` | excedeu free tier | `wrangler tail` + verificar trafego |
|
|
176
|
+
| D1 query lenta | sem indice | `wrangler d1 execute <db> --command="explain query plan ..."` |
|
|
177
|
+
|
|
178
|
+
## Input
|
|
179
|
+
|
|
180
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: figma-print-diff
|
|
3
|
+
description: >
|
|
4
|
+
Single-pass diff entre 1 print do app e 1 frame Figma. NAO usa fila/sessao. Imagem
|
|
5
|
+
fica em contexto durante toda a comparacao. Output: JSON estruturado + lista de fix-tasks.
|
|
6
|
+
Pensado para uso pos-codegen (validacao imediata) ou correcao pontual. Diferente de
|
|
7
|
+
audit-screenshots, que acumula multiplos prints.
|
|
8
|
+
argument-hint: "<print-path> <figma-url-ou-node-id> [contexto opcional do usuario]"
|
|
9
|
+
allowedTools: [Read, Glob, Grep, Bash, Write]
|
|
10
|
+
sourceDocs:
|
|
11
|
+
- libraries/visual-diff-lenses.md
|
|
12
|
+
use-when:
|
|
13
|
+
- acabou de gerar uma tela e quer validar contra o Figma agora
|
|
14
|
+
- usuario cola 1 print + 1 link Figma e pergunta "o que esta errado?"
|
|
15
|
+
- hook pos-codegen no design-to-code
|
|
16
|
+
do-not-use-for:
|
|
17
|
+
- multiplos prints em sessao (use audit-screenshots)
|
|
18
|
+
- quando nao ha referencia Figma (use react-doctor para validacao tecnica)
|
|
19
|
+
- quando nao ha print do app rodando (use plan-blueprint para planejar)
|
|
20
|
+
metadata:
|
|
21
|
+
category: visual-qa
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
Voce esta executando como **Visual Diff Auditor** via skill `figma-print-diff`. Faz UMA comparacao em UM unico passo, sem persistir sessao. Imagem do print + frame Figma DEVEM permanecer no contexto da inferencia ate o output final.
|
|
25
|
+
|
|
26
|
+
## Contrato critico
|
|
27
|
+
|
|
28
|
+
1. **Single-pass**: ler print + Figma + comparar + emitir output em UMA chamada do agente. NAO enfileirar.
|
|
29
|
+
2. **Imagem residente**: NAO descartar a imagem do contexto antes de emitir output. Se o agente perceber que perdeu a imagem (output mencionando "ver imagem" sem detalhes), REFAZER comparacao re-lendo.
|
|
30
|
+
3. **Output autossuficiente**: cada divergencia tem evidencia textual ("border-radius do botao Salvar = 8px no print, 12px no Figma") — nunca dependencia futura ("ver imagem").
|
|
31
|
+
4. **Sem fila**: nao gravar `.gos-local/audit-session.json`. Nao chamar `*close`. Nao gerar PLAN. Output direto.
|
|
32
|
+
|
|
33
|
+
## Pre-flight (gate)
|
|
34
|
+
|
|
35
|
+
1. Resolver `print-path`: arquivo deve existir. Senao -> abortar.
|
|
36
|
+
2. Resolver `figma-url-ou-node-id`:
|
|
37
|
+
- URL: extrair node-id da query string `?node-id=XXXX-YYYYY`.
|
|
38
|
+
- Node-id direto: aceitar `XXXX-YYYYY` ou `XXXX:YYYYY`.
|
|
39
|
+
3. Pull do frame Figma via Figma MCP `get_image` pelo node-id. Salvar em `.gos-local/figma-print-diff/<timestamp>.figma.png`.
|
|
40
|
+
4. Se Figma MCP indisponivel -> abortar com instrucao para iniciar Figma MCP.
|
|
41
|
+
|
|
42
|
+
## Lenses de comparacao (ordem)
|
|
43
|
+
|
|
44
|
+
Cada lens e uma passada mental do agente sobre as duas imagens, com saida estruturada antes de passar para a proxima.
|
|
45
|
+
|
|
46
|
+
### Lens 1 — Layout e hierarquia
|
|
47
|
+
- Estrutura geral coincide? (sidebar, header, footer, main, drawer)
|
|
48
|
+
- Ordem de elementos dentro de cada container coincide?
|
|
49
|
+
- Spacing e proporcoes batem (sem medir pixel-perfect, mas ratio coerente)?
|
|
50
|
+
|
|
51
|
+
### Lens 2 — Tokens visuais
|
|
52
|
+
- Cores: bg, text, border, ring, hover, active. Listar cada divergencia com locais.
|
|
53
|
+
- Tipografia: tamanho, peso, line-height, family. Reportar quando off.
|
|
54
|
+
- Spacing: padding/margin/gap notavelmente diferentes.
|
|
55
|
+
- Border-radius, shadows, blur.
|
|
56
|
+
|
|
57
|
+
### Lens 3 — Estados
|
|
58
|
+
- Loading state visivel no Figma? Existe no print?
|
|
59
|
+
- Empty state idem.
|
|
60
|
+
- Error state idem.
|
|
61
|
+
- Hover/active/focus visiveis?
|
|
62
|
+
- Disabled state.
|
|
63
|
+
|
|
64
|
+
### Lens 4 — Conteudo
|
|
65
|
+
- Textos coincidem (literais, sem tradutor automatico)?
|
|
66
|
+
- Icones coincidem (lib + variante)?
|
|
67
|
+
- Imagens placeholder vs reais?
|
|
68
|
+
- Dados mockados vs proximos a producao?
|
|
69
|
+
|
|
70
|
+
### Lens 5 — Interacao (inferida)
|
|
71
|
+
- Affordances: o que parece clicavel no Figma esta clicavel no print?
|
|
72
|
+
- Cursor states (pointer, default, not-allowed) coerentes?
|
|
73
|
+
- Posicao de tooltips/popovers se visivel.
|
|
74
|
+
|
|
75
|
+
### Lens 6 — Acessibilidade
|
|
76
|
+
- Contraste AA visivelmente quebrado em algum bloco?
|
|
77
|
+
- Tamanho de toque minimo (44px) respeitado?
|
|
78
|
+
- Indicadores de focus diferentes do hover (nao mesma cor)?
|
|
79
|
+
|
|
80
|
+
## Output (JSON estruturado)
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"print": "<path>",
|
|
85
|
+
"figma_node": "<node-id>",
|
|
86
|
+
"figma_url": "<url>",
|
|
87
|
+
"matches": [
|
|
88
|
+
"Layout sidebar + main bate",
|
|
89
|
+
"Header altura coincide"
|
|
90
|
+
],
|
|
91
|
+
"mismatches": [
|
|
92
|
+
{
|
|
93
|
+
"id": "M1",
|
|
94
|
+
"lens": "tokens",
|
|
95
|
+
"severity": "high|medium|low",
|
|
96
|
+
"where": "Botao Salvar (canto inf direito)",
|
|
97
|
+
"expected": "bg=blue-600, text-white, radius=8px",
|
|
98
|
+
"actual": "bg=gray-300, text-gray-700, radius=4px",
|
|
99
|
+
"fix": "Aplicar variant primary do Button do DS",
|
|
100
|
+
"task_template": "Corrigir botao Salvar: usar Button variant=primary"
|
|
101
|
+
}
|
|
102
|
+
],
|
|
103
|
+
"missing_in_app": [
|
|
104
|
+
"Estado loading do form nao implementado"
|
|
105
|
+
],
|
|
106
|
+
"missing_in_figma": [
|
|
107
|
+
"Aviso de erro inline no campo email — pedir ao designer"
|
|
108
|
+
],
|
|
109
|
+
"summary": {
|
|
110
|
+
"total_mismatches": 8,
|
|
111
|
+
"high": 2,
|
|
112
|
+
"medium": 3,
|
|
113
|
+
"low": 3
|
|
114
|
+
},
|
|
115
|
+
"next_steps": [
|
|
116
|
+
"Aplicar fix M1 e M3 manualmente",
|
|
117
|
+
"Pedir clarificacao no Figma para missing_in_figma[0]"
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Output secundario (markdown human-readable)
|
|
123
|
+
|
|
124
|
+
Apos JSON, imprimir tabela:
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
[figma-print-diff] <node-id>
|
|
128
|
+
|
|
129
|
+
severidade ref onde expected -> actual
|
|
130
|
+
high M1 Botao Salvar primary -> gray
|
|
131
|
+
medium M2 Spacing entre cards gap-6 -> gap-3
|
|
132
|
+
...
|
|
133
|
+
|
|
134
|
+
resumo: 8 divergencias (2 high, 3 medium, 3 low)
|
|
135
|
+
proximo: aplicar M1+M3 ou rodar `*audit-screenshots add` para acumular sessao.
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Regras criticas
|
|
139
|
+
|
|
140
|
+
- **NUNCA enfileirar**: se usuario mandar multiplos prints, recusar e direcionar para `*audit-screenshots`.
|
|
141
|
+
- **NUNCA descartar imagem antes do output**: violacao -> refazer.
|
|
142
|
+
- **Severity calibrada**:
|
|
143
|
+
- high: bloqueia merge (cor errada do botao primario, falta estado de erro).
|
|
144
|
+
- medium: pode entrar em sprint seguinte (spacing fora, icone trocado).
|
|
145
|
+
- low: cosmetico (radius 4px vs 6px).
|
|
146
|
+
- **Output curto se 0 mismatches**: "OK. Bate 100%." e fim — sem JSON inflado.
|
|
147
|
+
|
|
148
|
+
## Hook pos-codegen
|
|
149
|
+
|
|
150
|
+
`design-to-code` ao terminar pode invocar `figma-print-diff` automaticamente se:
|
|
151
|
+
- Existir screenshot do dev local (path em arg).
|
|
152
|
+
- Frame Figma original ainda no contexto.
|
|
153
|
+
|
|
154
|
+
Resultado entra como rodape da resposta do `design-to-code`.
|
|
155
|
+
|
|
156
|
+
## Input
|
|
157
|
+
|
|
158
|
+
$ARGUMENTS
|
|
159
|
+
|
|
160
|
+
Formato: `<print-path> <figma-url-ou-node-id> [contexto livre]`
|
|
161
|
+
|
|
162
|
+
Exemplo:
|
|
163
|
+
```
|
|
164
|
+
*figma-print-diff .screenshots/projetos.png https://figma.com/.../?node-id=9140-25431 a aba negocios esta sem mostrar coluna Area
|
|
165
|
+
```
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gos-caveman
|
|
3
|
+
description: >
|
|
4
|
+
Comprime OUTPUT de planos, tasks e respostas de skills cortando ~75% dos tokens
|
|
5
|
+
preservando precisao tecnica. 3 niveis (lite/full/ultra). Aplicar APENAS em prosa
|
|
6
|
+
e descricao de tasks — NUNCA em codigo, comandos shell, paths, ou trechos de regex.
|
|
7
|
+
Adaptado de github.com/JuliusBrussee/caveman (MIT).
|
|
8
|
+
argument-hint: "<level: lite|full|ultra> <texto ou path>"
|
|
9
|
+
allowedTools: [Read, Write, Edit]
|
|
10
|
+
sourceDocs:
|
|
11
|
+
- libraries/caveman-rules.md
|
|
12
|
+
use-when:
|
|
13
|
+
- finalizar plan-blueprint output (descricao + criterios)
|
|
14
|
+
- resumir resposta de skill com prosa longa
|
|
15
|
+
- usuario pede "fala caveman" ou "menos token"
|
|
16
|
+
do-not-use-for:
|
|
17
|
+
- codigo (variaveis, funcoes, types — preserva tudo)
|
|
18
|
+
- comandos shell (preserva tudo)
|
|
19
|
+
- paths de arquivos (preserva tudo)
|
|
20
|
+
- mensagens para usuario nao-tecnico (use linguagem normal)
|
|
21
|
+
metadata:
|
|
22
|
+
category: optimization
|
|
23
|
+
attribution: github.com/JuliusBrussee/caveman (MIT)
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
Voce esta executando como **Compressor Caveman** via skill `gos-caveman`. Reduz tokens de prosa preservando significado tecnico. Atribuicao obrigatoria a https://github.com/JuliusBrussee/caveman (MIT).
|
|
27
|
+
|
|
28
|
+
## Niveis
|
|
29
|
+
|
|
30
|
+
| Nivel | Reducao alvo | Estilo |
|
|
31
|
+
|-------|---------------|--------|
|
|
32
|
+
| lite | ~30% | Frases curtas, sem articulos redundantes, mantem conectivos |
|
|
33
|
+
| full | ~75% | Telegrafico. "X faz Y. Use Z." |
|
|
34
|
+
| ultra | ~90% | Quase codigo. "X -> Y. Use Z." |
|
|
35
|
+
|
|
36
|
+
## Regras de compressao
|
|
37
|
+
|
|
38
|
+
### Sempre PRESERVAR (NAO comprimir):
|
|
39
|
+
- Codigo (qualquer linguagem)
|
|
40
|
+
- Comandos (`npm run...`, paths)
|
|
41
|
+
- Identificadores (nomes de funcoes, variaveis, types, classes)
|
|
42
|
+
- Numeros, percentuais, IDs (ADR-007, T-12, PLAN-NNN)
|
|
43
|
+
- Nomes proprios (Cloudflare, Supabase, React)
|
|
44
|
+
- Frontmatter YAML/TOML
|
|
45
|
+
- URLs
|
|
46
|
+
|
|
47
|
+
### Sempre REMOVER:
|
|
48
|
+
- Articulos (o, a, os, as, um, uma) quando opcionais
|
|
49
|
+
- Pronomes redundantes (voce sabe, e claro que)
|
|
50
|
+
- Hedging (talvez, possivelmente, geralmente)
|
|
51
|
+
- Repeticao por enfase
|
|
52
|
+
- Adverbios suaves (basicamente, simplesmente, apenas)
|
|
53
|
+
- Parenteses de aclaracao redundante
|
|
54
|
+
|
|
55
|
+
### Sempre TRANSFORMAR:
|
|
56
|
+
- Verbos longos -> curtos: "deve realizar a operacao de" -> "faz"
|
|
57
|
+
- Negacoes duplas -> simples: "nao deixar de" -> "fazer"
|
|
58
|
+
- Listas em prosa -> bullets
|
|
59
|
+
- "X que e responsavel por Y" -> "X: Y"
|
|
60
|
+
|
|
61
|
+
## Exemplos
|
|
62
|
+
|
|
63
|
+
### Input (69 tokens)
|
|
64
|
+
> "A razao do seu componente React estar re-renderizando provavelmente e porque voce esta criando uma nova referencia de objeto a cada ciclo de render. Quando voce passa um objeto inline como prop, a comparacao shallow do React enxerga como objeto diferente toda vez."
|
|
65
|
+
|
|
66
|
+
### Output lite (45 tokens, -35%)
|
|
67
|
+
> "Componente React re-renderiza porque voce cria nova ref de objeto a cada render. Objeto inline como prop falha a comparacao shallow do React."
|
|
68
|
+
|
|
69
|
+
### Output full (19 tokens, -72%)
|
|
70
|
+
> "Nova ref a cada render. Inline obj prop = nova ref = re-render. Wrap em `useMemo`."
|
|
71
|
+
|
|
72
|
+
### Output ultra (10 tokens, -86%)
|
|
73
|
+
> "Inline obj prop -> nova ref -> re-render. `useMemo`."
|
|
74
|
+
|
|
75
|
+
## Aplicacao no G-OS
|
|
76
|
+
|
|
77
|
+
### Em plan-blueprint
|
|
78
|
+
Skills que produzem plano podem chamar `gos-caveman` automaticamente nas secoes:
|
|
79
|
+
- ## Contexto (lite)
|
|
80
|
+
- ## Componentes mapeados — coluna "Comportamento" (full)
|
|
81
|
+
- ## Notas / observacoes (full)
|
|
82
|
+
|
|
83
|
+
NAO comprimir:
|
|
84
|
+
- Frontmatter
|
|
85
|
+
- ## Page-level overrides (codigo)
|
|
86
|
+
- ## Drift map (referencia precisa)
|
|
87
|
+
- Tasks (cada task tem contrato proprio)
|
|
88
|
+
|
|
89
|
+
### Em outputs de skill
|
|
90
|
+
Quando uma skill responder ao usuario tecnico, oferecer:
|
|
91
|
+
- Default: linguagem normal.
|
|
92
|
+
- Se usuario tipou "caveman", "menos token", "ultra" -> aplicar full ou ultra.
|
|
93
|
+
|
|
94
|
+
## Anti-padroes
|
|
95
|
+
|
|
96
|
+
- **Comprimir codigo**: `function calc(x) { return x * 2 }` deve ficar igual. Comprimir comentario do codigo OK.
|
|
97
|
+
- **Comprimir output para nao-tecnico**: regra do dono — "linguagem coloquial" para `idea-intake`. Caveman so apos PRD.
|
|
98
|
+
- **Comprimir frontmatter YAML**: parser quebra. Frontmatter intocavel.
|
|
99
|
+
|
|
100
|
+
## Implementacao (manual, sem ML)
|
|
101
|
+
|
|
102
|
+
Caveman nao usa modelo separado. E uma prompt rule que o agente segue ao gerar output. NAO requer install de Python/venv (diferente de `gos-compress`/sandeco).
|
|
103
|
+
|
|
104
|
+
## Input
|
|
105
|
+
|
|
106
|
+
$ARGUMENTS
|
|
107
|
+
|
|
108
|
+
Formato: `<lite|full|ultra> <texto ou caminho de arquivo>`
|
|
109
|
+
|
|
110
|
+
Se path: ler arquivo, comprimir somente blocos de prosa marcados (entre headers `##`), preservar codigo/yaml/tabelas, salvar em `<arquivo>.cm.md` ao lado.
|