ganbatte-os 0.2.36 → 0.2.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gos/agents/profiles/ganbatte-os-master.md +113 -0
- package/.gos/libraries/caveman-rules.md +58 -0
- package/.gos/libraries/cloudflare-stack-kb.md +161 -0
- package/.gos/libraries/default-stack-kb.md +98 -0
- package/.gos/libraries/engineering-best-practices.md +208 -0
- package/.gos/libraries/gos-compress-setup.md +62 -0
- package/.gos/libraries/intake-questions-mom-test.md +91 -0
- package/.gos/libraries/lucide-icons-policy.md +174 -0
- package/.gos/libraries/security-best-practices.md +138 -0
- package/.gos/libraries/supabase-stack-kb.md +124 -0
- package/.gos/libraries/timer-pattern-spec.md +252 -0
- package/.gos/libraries/typeform-pattern-spec.md +204 -0
- package/.gos/libraries/ui-guardrails-checklist.md +144 -0
- package/.gos/libraries/visual-diff-lenses.md +114 -0
- package/.gos/skills/adr-tech-decisions/SKILL.md +166 -0
- package/.gos/skills/audit-screenshots/SKILL.md +219 -0
- package/.gos/skills/cloudflare-pages-setup/SKILL.md +180 -0
- package/.gos/skills/execute-plan/SKILL.md +5 -0
- package/.gos/skills/figma-print-diff/SKILL.md +165 -0
- package/.gos/skills/gos-caveman/SKILL.md +110 -0
- package/.gos/skills/gos-compress/SKILL.md +134 -0
- package/.gos/skills/gos-compress/scripts/compress.py +346 -0
- package/.gos/skills/gos-compress/scripts/setup.py +91 -0
- package/.gos/skills/idea-intake/SKILL.md +147 -0
- package/.gos/skills/plan-blueprint/SKILL.md +48 -3
- package/.gos/skills/plan-to-tasks/SKILL.md +28 -0
- package/.gos/skills/prd-from-intake/SKILL.md +94 -0
- package/.gos/skills/prototype-orchestrator/SKILL.md +120 -0
- package/.gos/skills/registry.json +13 -1
- package/.gos/skills/timer-component-pattern/SKILL.md +245 -0
- package/.gos/skills/typeform-form-pattern/SKILL.md +210 -0
- package/.gos/skills/ui-guardrails/SKILL.md +111 -0
- package/.gos/skills/validate-plan/SKILL.md +2 -0
- package/.gos/templates/intakeTemplate.md +41 -0
- package/.gos/templates/planTemplate.md +21 -0
- package/.gos/templates/prdLeanTemplate.md +40 -0
- package/.gos/templates/taskTemplate.md +2 -0
- package/CLAUDE.md +9 -1
- package/package.json +1 -1
|
@@ -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**:
|