ganbatte-os 0.2.36 → 0.2.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/.gos/agents/profiles/ganbatte-os-master.md +113 -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 +219 -0
  17. package/.gos/skills/cloudflare-pages-setup/SKILL.md +180 -0
  18. package/.gos/skills/execute-plan/SKILL.md +5 -0
  19. package/.gos/skills/figma-print-diff/SKILL.md +165 -0
  20. package/.gos/skills/gos-caveman/SKILL.md +110 -0
  21. package/.gos/skills/gos-compress/SKILL.md +134 -0
  22. package/.gos/skills/gos-compress/scripts/compress.py +346 -0
  23. package/.gos/skills/gos-compress/scripts/setup.py +91 -0
  24. package/.gos/skills/idea-intake/SKILL.md +147 -0
  25. package/.gos/skills/plan-blueprint/SKILL.md +48 -3
  26. package/.gos/skills/plan-to-tasks/SKILL.md +28 -0
  27. package/.gos/skills/prd-from-intake/SKILL.md +94 -0
  28. package/.gos/skills/prototype-orchestrator/SKILL.md +120 -0
  29. package/.gos/skills/registry.json +13 -1
  30. package/.gos/skills/timer-component-pattern/SKILL.md +245 -0
  31. package/.gos/skills/typeform-form-pattern/SKILL.md +210 -0
  32. package/.gos/skills/ui-guardrails/SKILL.md +111 -0
  33. package/.gos/skills/validate-plan/SKILL.md +2 -0
  34. package/.gos/templates/intakeTemplate.md +41 -0
  35. package/.gos/templates/planTemplate.md +21 -0
  36. package/.gos/templates/prdLeanTemplate.md +40 -0
  37. package/.gos/templates/taskTemplate.md +2 -0
  38. package/CLAUDE.md +9 -1
  39. 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
@@ -0,0 +1,219 @@
1
+ ---
2
+ name: audit-screenshots
3
+ description: Skill conversacional. Recebe N prints (anotados ou nao) da aplicacao em uma sessao. Mapeia print -> tela -> Figma frame via docs/figma-screen-map.md. Acumula divergencias entre inputs. Ao fechar, emite UM plano de correcao com tasks pendentes (sem executar). Mesmo template do *plan — output e input direto pra *execute-plan.
4
+ argument-hint: "<acao> [contexto] # acao: add | list | close [SLUG] | discard"
5
+ allowedTools: [Read, Glob, Grep, Bash, Write, Edit, AskUserQuestion]
6
+ sourceDocs:
7
+ - skills/plan-blueprint/SKILL.md
8
+ - skills/plan-to-tasks/SKILL.md
9
+ - templates/planTemplate.md
10
+ - templates/taskTemplate.md
11
+ use-when:
12
+ - usuario cola print + diz "isso aqui esta errado"
13
+ - usuario pede "compara essa tela com Figma e abre tasks"
14
+ - usuario quer agrupar varias divergencias em UM plano de correcao
15
+ - usuario menciona "auditoria visual" ou "tela X esta divergindo do Figma"
16
+ do-not-use-for:
17
+ - executar correcao (use *execute-plan apos *audit-screenshots close)
18
+ - planejar tela nova (use *plan)
19
+ - validar plano executado (use *validate-plan)
20
+ metadata:
21
+ category: planning
22
+ ---
23
+
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
+
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
+
39
+ ## Input
40
+
41
+ $ARGUMENTS
42
+
43
+ Formato: <acao> [SLUG-opcional]
44
+
45
+ Acoes:
46
+ - add (default quando o usuario cola imagem) — registra 1+ prints na sessao corrente
47
+ - list — imprime resumo da sessao (prints, telas resolvidas, divergencias acumuladas)
48
+ - close [SLUG] — fecha sessao + emite plano PLAN-NNN-fix-audit-<SLUG-ou-iso>
49
+ - discard — zera sessao corrente (apaga audit-session.json + audit-images/)
50
+
51
+ Quando o usuario simplesmente cola imagem sem comando explicito, assumir add automaticamente.
52
+
53
+ ## Pre-requisitos (gate)
54
+
55
+ 1. Resolver paths via .gos-local/plan-paths.json. Ausente -> abortar e instruir rodar *plan ou criar manualmente o arquivo.
56
+ 2. Resolver dirs.figma_screen_map (campo figma_screen_map em plan-paths.json; default: <dirs.docs>/figma-screen-map.md). Arquivo ausente -> abortar com mensagem clara: "rode *audit-screenshots apenas em projetos que mantenham docs/figma-screen-map.md (mapa canonico tela->Figma)".
57
+ 3. Resolver dirs.audit_state (campo audit_session_file; default: <projeto>/.gos-local/audit-session.json).
58
+ 4. Ler dirs.audit_state se existir — sessao em curso. Senao, criar sessao nova ao primeiro add.
59
+
60
+ ## Estado da sessao
61
+
62
+ Persistido em <dirs.audit_state> (default .gos-local/audit-session.json):
63
+
64
+ {
65
+ "session_id": "audit-2026-05-06T14-22-03",
66
+ "created_at": "<iso>",
67
+ "screenshots": [
68
+ {
69
+ "n": 1,
70
+ "image_path": ".gos-local/audit-images/01.png",
71
+ "user_context": "tabela negocios mostrando coluna Area com -",
72
+ "resolved_screen": "/dashboard/projetos/[id]?tab=negocios",
73
+ "figma_node_id": "9140-25431",
74
+ "figma_url": "https://www.figma.com/design/.../?node-id=9140-25431",
75
+ "figma_image_path": ".gos-local/audit-images/01.figma.png",
76
+ "divergences": [
77
+ { "kind": "data-missing", "where": "coluna Area", "fix": "seed/endpoint deve popular project.area" },
78
+ { "kind": "token", "where": "row hover", "fix": "bg-muted/50 (Figma) vs bg-transparent (atual)" }
79
+ ]
80
+ }
81
+ ]
82
+ }
83
+
84
+ ## Acao add
85
+
86
+ 1. **Salvar imagem(s)** colada(s) pelo usuario em .gos-local/audit-images/NN.png (n = ultimo + 1; multiplas imagens na mesma mensagem viram NN, NN+1, ...). Criar diretorio se necessario.
87
+ 2. **Identificar tela** (prioridade):
88
+ a) Mencao explicita do usuario na mesma mensagem ("e a aba negocios", "/dashboard/projetos/123") -> matchar no figma-screen-map.md.
89
+ b) Heuristica visual: ler titulo/breadcrumb/URL visivel no print (use modelo multimodal pra extrair texto). Match por substring contra a coluna "Rota app" do mapa.
90
+ c) Ambiguo ou sem sinal: AskUserQuestion listando 5 candidatos top do mapa + opcao "outro" (usuario digita rota).
91
+ 3. **Resolver figma_node_id + URL** via lookup no mapa.
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).
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`.
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.
97
+ - **Anotacoes em vermelho do usuario** = high-signal: cada item anotado vira divergencia com peso 2x (quase certamente vira task no close).
98
+ - Comentarios livres do usuario (user_context) = high-signal igual.
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).
101
+ 7. **Output ao usuario** (curto):
102
+
103
+ [audit] +1 print (total: N) — tela: <rota> (node-id: NNNN-NNNNN)
104
+ divergencias detectadas: <K> (alta-confianca: <H>)
105
+ proximo: cole outro print, *audit-screenshots list, ou *audit-screenshots close
106
+
107
+ ## Acao list
108
+
109
+ Le audit-session.json e imprime tabela:
110
+
111
+ [audit-session <session_id>] iniciada <created_at>
112
+
113
+ # print tela divergencias
114
+ 1 audit-images/01 /dashboard/projetos/[id]?tab=negocios 3 (1 alta)
115
+ 2 audit-images/02 /dashboard/projetos 5 (3 alta)
116
+ 3 audit-images/03 /dashboard/financiadores 2
117
+
118
+ total: 10 divergencias em 3 telas
119
+ proximo: *audit-screenshots close [SLUG-opcional] -> emite PLAN-NNN-fix-audit-<SLUG>
120
+
121
+ Nao emite plano. Nao modifica estado.
122
+
123
+ ## Acao close [SLUG]
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
+
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.
129
+ 2. **Calcular PLAN-NNN**: ler <dirs.planos>/ e pegar maior NNN existente + 1.
130
+ 3. **Agrupar divergencias por tela** (resolved_screen).
131
+ 4. **Emitir <dirs.planos>/PLAN-NNN-fix-audit-<SLUG>/plan.md** baseado em templates/planTemplate.md:
132
+ - Frontmatter: objetivo: correcao, audit_session: <session_id>, created_at: <iso>, status: pendente, figma_url: <primeiro figma_url da sessao>.
133
+ - Secao ## Contexto: lista os prints com user_context resumido.
134
+ - Secao ## Componentes mapeados: 1 linha por divergencia (Componente = inferir do where).
135
+ - Secao ## Interacoes & Estados: 1 bullet por divergencia tipo behavior ou state-missing.
136
+ - Secao ## Page-level overrides: 1 linha por divergencia tipo token (decisao default (a) className na pagina; usuario pode reclassificar depois).
137
+ - Secao ## Backend pendings: 1 linha por divergencia tipo data-missing.
138
+ - ## Drift map: copia das divergencias detectadas (usado por validate-plan no fechamento).
139
+ - ## Cleanup de starter legado: divergencias tipo cleanup-legacy se houver.
140
+ 5. **Emitir tasks/T-NN-<componente>-<fix-slug>.md** (1 task por divergencia, agrupando triviais por componente):
141
+ - Frontmatter: status: pendente, priority: P1 (high-signal -> P0), area: ui-ux (token/anatomy) ou area: frontend (behavior/data-missing).
142
+ - interaction_target: ou override_target: populado quando aplicavel.
143
+ - Campo novo: audit_evidence: audit-evidence/NN.png apontando pro print original.
144
+ 6. **Copiar evidencias** pra <dirs.planos>/PLAN-NNN-fix-audit-<SLUG>/audit-evidence/:
145
+ - Prints originais (NN.png).
146
+ - Figma frames capturados (NN.figma.png).
147
+ - Cada um nomeado igual ao indice da sessao.
148
+ 7. **Emitir context.md** padrao (template contextTemplate.md).
149
+ 8. **Atualizar progress.txt** via progress-tracker set-current apontando pro plano novo.
150
+ 9. **Rodar gate determistico** node <repo>/.gos/scripts/integrations/check-plan.js <plano>:
151
+ - Exit 0 -> seguir.
152
+ - Exit != 0 -> abortar e devolver saida do check-plan.
153
+ 10. **Arquivar sessao**: mover audit-session.json pra .gos-local/audit-archive/<session_id>.json. NAO apagar imagens (ficam em audit-images/ pra historico).
154
+ 11. **Output final**:
155
+
156
+ [audit-screenshots] PLAN-NNN-fix-audit-<SLUG> criado
157
+
158
+ prints processados: <N>
159
+ telas afetadas: <K>
160
+ tasks criadas: <T> (<P0> P0 / <P1> P1)
161
+
162
+ plano: docs/plans/PLAN-NNN-fix-audit-<SLUG>/plan.md
163
+ tasks: docs/plans/PLAN-NNN-fix-audit-<SLUG>/tasks/ (T tasks)
164
+ progress: atualizado (status=pendente)
165
+
166
+ proximo passo: *execute-plan PLAN-NNN-fix-audit-<SLUG> (Codex IDE)
167
+
168
+ ## Acao discard
169
+
170
+ 1. Confirmacao inline obrigatoria: AskUserQuestion com 2 opcoes (Sim, descartar tudo / Nao, manter sessao).
171
+ 2. Confirmado: apagar .gos-local/audit-session.json + diretorio .gos-local/audit-images/ (todos os prints + frames Figma da sessao corrente).
172
+ 3. Output: [audit] sessao descartada (N prints removidos).
173
+
174
+ ## Resolver de tela (parser do figma-screen-map.md)
175
+
176
+ figma-screen-map.md e markdown com tabelas | Tela | ... | Rota app | node-id | ... |.
177
+
178
+ Algoritmo:
179
+ 1. Ler arquivo.
180
+ 2. Extrair todas tabelas via regex (linhas iniciando com |).
181
+ 3. Pra cada tabela, identificar coluna Rota app e node-id (case-insensitive, varia entre tabelas).
182
+ 4. Construir lookup {rota_normalizada: {node_id, secao, label}} (normalizar = lowercase, remover query strings opcionais).
183
+ 5. Match por:
184
+ - Equality exato: rota visivel no print bate com chave do lookup -> resolvido.
185
+ - Substring: rota do print contem chave do lookup -> resolvido com warning.
186
+ - Multiplos matches: AskUserQuestion listando candidatos.
187
+ 6. Suportar query strings (?tab=negocios) como parte da rota (mapas separam abas).
188
+
189
+ ## Acoplamento com pipeline
190
+
191
+ - Plano gerado e input direto pra *execute-plan e *validate-plan — segue 100% o template padrao + frontmatter compativel.
192
+ - Sub-fases 1.5 (drift map) e 1.6 (cleanup legado) do plan-blueprint NAO rodam aqui (audit JA e o drift map empirico). Mas se legacy_starter_dirs declarado em plan-paths.json, divergencias tipo cleanup-legacy sao detectadas durante add e viram tasks T-NN-cleanup-legacy-<slug>.
193
+ - Schema gate (Fase 2.4) NAO roda aqui — divergencias tipo data-missing viram entrada em ## Backend pendings direto, sem confronto com Postman/Prisma (audit assume usuario sabe o que esta vendo).
194
+ - progress-tracker segue identico — plano de audit aparece no progress.txt como qualquer outro.
195
+
196
+ ## Regras criticas
197
+
198
+ - **Sem execucao**: skill NUNCA modifica codigo da aplicacao. Ela cria plano + tasks (status: pendente). User roda *execute-plan separado se quiser.
199
+ - **Sessao persistente**: state em .gos-local/audit-session.json permite acumular prints entre invocacoes ate close. Sessao orfa (nao fechada por dias) eh ok — discard limpa.
200
+ - **Mapeamento canonico obrigatorio**: sem figma-screen-map.md, skill aborta. Esse arquivo eh o contrato tela<->Figma do projeto.
201
+ - **Anotacoes em vermelho = high-signal**: peso 2x na decisao de virar task. Sem anotacao, ainda detecta automaticamente, mas com peso menor.
202
+ - **Output e input do pipeline existente**: nao reinventa template, usa templates/planTemplate.md + taskTemplate.md.
203
+
204
+ ## Model guidance
205
+
206
+ | Escopo | Modelo |
207
+ |--------|--------|
208
+ | add com 1-2 prints simples | sonnet |
209
+ | add com print complexo (10+ divergencias visiveis) | opus |
210
+ | close com 5+ telas / 20+ tasks geradas | opus |
211
+ | list / discard | haiku |
212
+
213
+ ## Instructions
214
+
215
+ 1. Ao receber imagem sem comando explicito, assumir *audit-screenshots add.
216
+ 2. NUNCA executar codigo da aplicacao — skill so planeja.
217
+ 3. Sessao persiste em .gos-local/ ate close ou discard.
218
+ 4. Plano gerado SEMPRE roda check-plan.js antes de devolver controle ao usuario.
219
+ 5. Ao final do close, instruir o usuario do proximo passo (*execute-plan PLAN-NNN-fix-audit-<SLUG>).
@@ -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
@@ -86,6 +86,11 @@ Comparacao:
86
86
 
87
87
  Pre-flight smoke nao substitui o visual gate por task — ele captura gaps grandes (componente faltando, KPI row ausente) que viraram tasks novas em PLAN-004/PLAN-005.
88
88
 
89
+ **Drift map como input adicional**: se `<dirs.planos>/<PLAN-NNN-slug>/drift-map.md` existir (gerado na Fase 1.5 do `plan-blueprint`), pre-flight smoke consome cada linha:
90
+ - Para cada divergencia listada: validar override aplicado (grep das classes/props declaradas em `## Page-level overrides`) OU task de implementacao agendada (grep `override_target:` ou `interaction_target:` nos frontmatter de `tasks/T-*.md`).
91
+ - Item sem encaminhamento (sem override aplicado E sem task agendada) = task `T-000-XX` pre-flight com `priority: P0`, prepend na fila, renumera tasks subsequentes.
92
+ - Drift map ausente: nao bloqueia (pipeline antigo continua funcionando).
93
+
89
94
  ## Loop por task
90
95
 
91
96
  Iterar tasks em ordem de `seq`. Antes de executar cada task, **classificar**: