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.
Files changed (34) hide show
  1. package/.gos/agents/profiles/ganbatte-os-master.md +100 -0
  2. package/.gos/libraries/caveman-rules.md +58 -0
  3. package/.gos/libraries/cloudflare-stack-kb.md +161 -0
  4. package/.gos/libraries/default-stack-kb.md +98 -0
  5. package/.gos/libraries/engineering-best-practices.md +208 -0
  6. package/.gos/libraries/gos-compress-setup.md +62 -0
  7. package/.gos/libraries/intake-questions-mom-test.md +91 -0
  8. package/.gos/libraries/lucide-icons-policy.md +174 -0
  9. package/.gos/libraries/security-best-practices.md +138 -0
  10. package/.gos/libraries/supabase-stack-kb.md +124 -0
  11. package/.gos/libraries/timer-pattern-spec.md +252 -0
  12. package/.gos/libraries/typeform-pattern-spec.md +204 -0
  13. package/.gos/libraries/ui-guardrails-checklist.md +144 -0
  14. package/.gos/libraries/visual-diff-lenses.md +114 -0
  15. package/.gos/skills/adr-tech-decisions/SKILL.md +166 -0
  16. package/.gos/skills/audit-screenshots/SKILL.md +21 -3
  17. package/.gos/skills/cloudflare-pages-setup/SKILL.md +180 -0
  18. package/.gos/skills/figma-print-diff/SKILL.md +165 -0
  19. package/.gos/skills/gos-caveman/SKILL.md +110 -0
  20. package/.gos/skills/gos-compress/SKILL.md +134 -0
  21. package/.gos/skills/gos-compress/scripts/compress.py +346 -0
  22. package/.gos/skills/gos-compress/scripts/setup.py +91 -0
  23. package/.gos/skills/idea-intake/SKILL.md +147 -0
  24. package/.gos/skills/plan-blueprint/SKILL.md +10 -3
  25. package/.gos/skills/plan-to-tasks/SKILL.md +28 -0
  26. package/.gos/skills/prd-from-intake/SKILL.md +94 -0
  27. package/.gos/skills/prototype-orchestrator/SKILL.md +120 -0
  28. package/.gos/skills/registry.json +12 -1
  29. package/.gos/skills/timer-component-pattern/SKILL.md +245 -0
  30. package/.gos/skills/typeform-form-pattern/SKILL.md +210 -0
  31. package/.gos/skills/ui-guardrails/SKILL.md +111 -0
  32. package/.gos/templates/intakeTemplate.md +41 -0
  33. package/.gos/templates/prdLeanTemplate.md +40 -0
  34. 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 curta** (anatomia visivel + tokens primarios + estados):
81
- - Inspecionar print vs Figma frame.
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
- 6. **Persistir** entrada nova no audit-session.json.
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.