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,210 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: typeform-form-pattern
|
|
3
|
+
description: >
|
|
4
|
+
Gera estrutura de form passo-a-passo estilo Typeform (uma pergunta por vez), com
|
|
5
|
+
questions[] tipadas, hooks de navegacao, validacao Zod, animacao, progress bar e
|
|
6
|
+
estados visuais. Lucide React (zero emoji). React + TS + Tailwind + shadcn.
|
|
7
|
+
argument-hint: "<descricao do form ou 'spec' para ver a anatomia>"
|
|
8
|
+
allowedTools: [Read, Glob, Grep, Bash, Write, Edit, AskUserQuestion]
|
|
9
|
+
sourceDocs:
|
|
10
|
+
- libraries/typeform-pattern-spec.md
|
|
11
|
+
- libraries/lucide-icons-policy.md
|
|
12
|
+
- libraries/ui-guardrails-checklist.md
|
|
13
|
+
use-when:
|
|
14
|
+
- usuario pede form de cadastro/onboarding/quiz/lead/survey
|
|
15
|
+
- precisa coletar dados em multiplas etapas com baixo cognitive load
|
|
16
|
+
- mobile-first form
|
|
17
|
+
do-not-use-for:
|
|
18
|
+
- settings page com varios campos editaveis simultaneamente (use form tradicional)
|
|
19
|
+
- input simples 1-2 campos (overhead nao compensa)
|
|
20
|
+
metadata:
|
|
21
|
+
category: ui-pattern
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
Voce esta executando como **Typeform Pattern Generator** via skill `typeform-form-pattern`. Gera estrutura completa baseada em `libraries/typeform-pattern-spec.md`.
|
|
25
|
+
|
|
26
|
+
## Pre-flight
|
|
27
|
+
|
|
28
|
+
1. Pergunta ao usuario:
|
|
29
|
+
- "Quantas perguntas previstas?" (estimar — pode evoluir)
|
|
30
|
+
- "Salvar progresso entre sessoes? (sessionStorage / Supabase / nao)"
|
|
31
|
+
- "Tem tela de Welcome inicial? E de Review final?"
|
|
32
|
+
- "Submit final manda pra Supabase, Workers, ou apenas mostra resultado?"
|
|
33
|
+
2. Validar stack: deve existir `tailwind.config`, `lucide-react` no package.json, shadcn `Button`, `Input`, `Card`, `Label`. Senao -> propor instalar.
|
|
34
|
+
3. Aplicar `libraries/lucide-icons-policy.md` — zero emoji, todos icones via Lucide.
|
|
35
|
+
|
|
36
|
+
## Geracao
|
|
37
|
+
|
|
38
|
+
### Arquivos criados
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
src/components/<feature>/
|
|
42
|
+
questions.ts # tipos + array de questions
|
|
43
|
+
TypeformContainer.tsx # estado + navegacao
|
|
44
|
+
questions/
|
|
45
|
+
WelcomeQuestion.tsx
|
|
46
|
+
TextQuestion.tsx
|
|
47
|
+
NumberQuestion.tsx
|
|
48
|
+
ChoiceQuestion.tsx
|
|
49
|
+
MultiChoiceQuestion.tsx
|
|
50
|
+
ReviewQuestion.tsx
|
|
51
|
+
hooks/
|
|
52
|
+
useTypeformFlow.ts
|
|
53
|
+
schemas/
|
|
54
|
+
formSchema.ts # Zod
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Estrutura base de `questions.ts`
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
import type { ComponentType } from 'lucide-react';
|
|
61
|
+
import * as Icons from 'lucide-react';
|
|
62
|
+
|
|
63
|
+
export type QuestionType =
|
|
64
|
+
| 'welcome' | 'text' | 'number' | 'choice' | 'multiChoice' | 'date' | 'review';
|
|
65
|
+
|
|
66
|
+
export interface QuestionOption {
|
|
67
|
+
value: string;
|
|
68
|
+
label: string;
|
|
69
|
+
description?: string;
|
|
70
|
+
iconName?: keyof typeof Icons;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface Question<F = Record<string, unknown>> {
|
|
74
|
+
id: string;
|
|
75
|
+
type: QuestionType;
|
|
76
|
+
field: keyof F | null;
|
|
77
|
+
question: string | ((data: F) => string);
|
|
78
|
+
description?: string;
|
|
79
|
+
placeholder?: string;
|
|
80
|
+
suffix?: string;
|
|
81
|
+
decimal?: boolean;
|
|
82
|
+
buttonText?: string;
|
|
83
|
+
options?: QuestionOption[];
|
|
84
|
+
validate?: (value: unknown, data: F) => string | null;
|
|
85
|
+
showWhen?: (data: F) => boolean;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Exemplo:
|
|
89
|
+
export const questions: Question<FormData>[] = [
|
|
90
|
+
{
|
|
91
|
+
id: 'welcome',
|
|
92
|
+
type: 'welcome',
|
|
93
|
+
field: null,
|
|
94
|
+
question: 'Vamos comecar',
|
|
95
|
+
description: 'Sera rapido — leva 2 minutos.',
|
|
96
|
+
buttonText: 'Comecar',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
id: 'name',
|
|
100
|
+
type: 'text',
|
|
101
|
+
field: 'name',
|
|
102
|
+
question: 'Como podemos te chamar?',
|
|
103
|
+
placeholder: 'Seu nome',
|
|
104
|
+
validate: (v) => (!v ? 'Campo obrigatorio' : null),
|
|
105
|
+
},
|
|
106
|
+
// ...
|
|
107
|
+
];
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Hook `useTypeformFlow`
|
|
111
|
+
|
|
112
|
+
Encapsula:
|
|
113
|
+
- `currentIndex`, `setCurrentIndex`
|
|
114
|
+
- `data`, `updateField`
|
|
115
|
+
- `activeQuestions` (filtrado por `showWhen`)
|
|
116
|
+
- `currentQ`
|
|
117
|
+
- `handleNext` (com validacao)
|
|
118
|
+
- `handlePrevious`
|
|
119
|
+
- `handleKeyPress` (Enter, Esc)
|
|
120
|
+
- `progress` (% concluido)
|
|
121
|
+
- Persistencia opcional (sessionStorage ou Supabase)
|
|
122
|
+
|
|
123
|
+
### Container
|
|
124
|
+
|
|
125
|
+
```tsx
|
|
126
|
+
export function TypeformContainer({ onComplete }: Props) {
|
|
127
|
+
const flow = useTypeformFlow(questions);
|
|
128
|
+
|
|
129
|
+
return (
|
|
130
|
+
<div className="min-h-screen flex flex-col">
|
|
131
|
+
<ProgressBar value={flow.progress} />
|
|
132
|
+
|
|
133
|
+
<main className="flex-1 flex items-center justify-center px-4">
|
|
134
|
+
<div className={`max-w-2xl w-full transition-all duration-300 ${
|
|
135
|
+
flow.isAnimating ? 'opacity-0 translate-y-4' : 'opacity-100 translate-y-0'
|
|
136
|
+
}`}>
|
|
137
|
+
<QuestionRenderer question={flow.currentQ} flow={flow} />
|
|
138
|
+
</div>
|
|
139
|
+
</main>
|
|
140
|
+
|
|
141
|
+
<NavButtons flow={flow} />
|
|
142
|
+
</div>
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Estados visuais (UI guardrails)
|
|
148
|
+
|
|
149
|
+
Aplicar `libraries/ui-guardrails-checklist.md`:
|
|
150
|
+
|
|
151
|
+
- **Loading** (submitting): botao final disabled + `<Loader2 className="h-4 w-4 animate-spin mr-2" />`.
|
|
152
|
+
- **Empty** (questions = []): tela "Nenhuma pergunta configurada" com `<AlertCircle />`.
|
|
153
|
+
- **Error**: inline acima do CTA primario.
|
|
154
|
+
- **Success**: tela final com `<CheckCircle2 className="h-16 w-16 text-success" />` + redirect/proximos passos.
|
|
155
|
+
- **Skeleton**: nao aplicavel (form nao tem fetch inicial geralmente).
|
|
156
|
+
|
|
157
|
+
### Validacao com Zod
|
|
158
|
+
|
|
159
|
+
```ts
|
|
160
|
+
// schemas/formSchema.ts
|
|
161
|
+
import { z } from 'zod';
|
|
162
|
+
|
|
163
|
+
export const formSchema = z.object({
|
|
164
|
+
name: z.string().min(2, 'Minimo 2 caracteres'),
|
|
165
|
+
email: z.string().email('Email invalido'),
|
|
166
|
+
age: z.coerce.number().int().min(13, 'Minimo 13 anos').max(120),
|
|
167
|
+
// ...
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
export type FormData = z.infer<typeof formSchema>;
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Chamar no submit final:
|
|
174
|
+
```ts
|
|
175
|
+
const result = formSchema.safeParse(data);
|
|
176
|
+
if (!result.success) {
|
|
177
|
+
// mostrar primeiro erro inline
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Acessibilidade obrigatoria
|
|
182
|
+
|
|
183
|
+
- `aria-live="polite"` no container que troca de question.
|
|
184
|
+
- `aria-label` em botoes voltar / Lucide-icon-only.
|
|
185
|
+
- `useEffect` foca o input ao mudar de question.
|
|
186
|
+
- Roles ARIA em listas de opcoes (`role="radiogroup"` para choice).
|
|
187
|
+
|
|
188
|
+
### Atalhos teclado
|
|
189
|
+
|
|
190
|
+
- `Enter` -> next.
|
|
191
|
+
- `Esc` ou `Backspace` (em campo vazio) -> previous.
|
|
192
|
+
- Em multiChoice: setas para navegar opcoes, espaco para toggle.
|
|
193
|
+
|
|
194
|
+
## Customizacao por usuario
|
|
195
|
+
|
|
196
|
+
Apos gerar estrutura base, AskUserQuestion:
|
|
197
|
+
1. "Cor primaria? (default: shadcn primary)"
|
|
198
|
+
2. "Animacao de transicao? (fade / slide / nenhuma)"
|
|
199
|
+
3. "Progress bar: top, bottom, ou nao?"
|
|
200
|
+
4. "Permite voltar e editar respostas? (sim/nao)"
|
|
201
|
+
|
|
202
|
+
## Anti-patterns embutidos (gera com warning se usuario insistir)
|
|
203
|
+
|
|
204
|
+
- "Quero todas as perguntas em uma tela" -> form tradicional, nao typeform-pattern.
|
|
205
|
+
- "Sem progress bar" -> warning, mas gera (UX ruim em mobile).
|
|
206
|
+
- "Emoji nas opcoes" -> recusar, usar Lucide.
|
|
207
|
+
|
|
208
|
+
## Input
|
|
209
|
+
|
|
210
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ui-guardrails
|
|
3
|
+
description: >
|
|
4
|
+
Pre-flight obrigatorio antes de codar uma tela. Verifica que cada task de tela tem
|
|
5
|
+
estados (loading/empty/error/success), responsividade, a11y e tokens declarados.
|
|
6
|
+
Bloqueia codegen se faltar — evita que erros de UI sejam descobertos tarde.
|
|
7
|
+
Pensado para reduzir o "trabalho extra de corrigir o que nao foi previsto".
|
|
8
|
+
argument-hint: "<plan-id-ou-task-path>"
|
|
9
|
+
allowedTools: [Read, Glob, Grep, Edit, AskUserQuestion]
|
|
10
|
+
sourceDocs:
|
|
11
|
+
- libraries/ui-guardrails-checklist.md
|
|
12
|
+
use-when:
|
|
13
|
+
- antes de design-to-code/figma-implement-design rodar
|
|
14
|
+
- validar plano de UI antes de execute-plan
|
|
15
|
+
- usuario reclama "esqueceram do estado vazio de novo"
|
|
16
|
+
do-not-use-for:
|
|
17
|
+
- tasks de backend (sem UI)
|
|
18
|
+
- bug fixes pontuais (use react-doctor)
|
|
19
|
+
metadata:
|
|
20
|
+
category: validation
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
Voce esta executando como **UI Guardrails Validator** via skill `ui-guardrails`. Verifica que cada task de UI tem cobertura completa antes de codegen — bloqueia execucao se faltar.
|
|
24
|
+
|
|
25
|
+
## Contrato
|
|
26
|
+
|
|
27
|
+
1. Le um plano (`docs/plans/PLAN-NNN/`) ou task individual (`tasks/T-NN-...md`).
|
|
28
|
+
2. Para cada task com `area: ui-ux` ou `area: frontend`, aplica checklist (ver `libraries/ui-guardrails-checklist.md`).
|
|
29
|
+
3. Se faltar item -> output structured com gaps + sugestao de adicao + opcao de `AskUserQuestion` para corrigir inline OU abortar.
|
|
30
|
+
4. Se passar -> output curto "OK, N tasks validadas, codegen liberado".
|
|
31
|
+
|
|
32
|
+
## Checklist (resumo — detalhe na library)
|
|
33
|
+
|
|
34
|
+
Para CADA task de UI:
|
|
35
|
+
|
|
36
|
+
### A. Estados visuais (5 obrigatorios)
|
|
37
|
+
- [ ] Loading: **skeleton OBRIGATORIO** (shadcn `Skeleton`) para listas/cards/tabelas; spinner Lucide `Loader2` so para botoes ou acoes pontuais.
|
|
38
|
+
- [ ] Empty: copy + Lucide icon (h-12 w-12 text-muted-foreground) + CTA primario.
|
|
39
|
+
- [ ] Error: mensagem + Lucide `AlertTriangle` + recovery action (botao retry).
|
|
40
|
+
- [ ] Success (quando aplicavel): Lucide `CheckCircle2` em toast/inline.
|
|
41
|
+
- [ ] Default (renderizado normal).
|
|
42
|
+
|
|
43
|
+
**Regra critica**: **SEMPRE skeleton ao carregar dados**, **SEMPRE empty state quando lista vazia**. Sem excecoes mesmo em descartavel.
|
|
44
|
+
|
|
45
|
+
### B. Responsividade (3 breakpoints minimos)
|
|
46
|
+
- [ ] Mobile (<768px): layout declarado
|
|
47
|
+
- [ ] Tablet (768-1024px): comportamento declarado
|
|
48
|
+
- [ ] Desktop (>1024px): default
|
|
49
|
+
|
|
50
|
+
### C. A11y (4 minimos)
|
|
51
|
+
- [ ] Roles ARIA quando aplicavel (button, dialog, listbox)
|
|
52
|
+
- [ ] Labels em inputs (htmlFor + id ou aria-label)
|
|
53
|
+
- [ ] Focus order definido se mais de 3 elementos interativos
|
|
54
|
+
- [ ] Contraste AA verificado (lens 6 do figma-print-diff)
|
|
55
|
+
|
|
56
|
+
### D. Tokens do DS (todos via referencia)
|
|
57
|
+
- [ ] Cores via tokens (`bg-primary`, NUNCA hex direto)
|
|
58
|
+
- [ ] Spacing via scale (`gap-4`, NUNCA `gap-[17px]`)
|
|
59
|
+
- [ ] Typography via classes (`text-base`, NUNCA `text-[15px]`)
|
|
60
|
+
- [ ] Border-radius via scale (`rounded-md`, NUNCA `rounded-[7px]`)
|
|
61
|
+
|
|
62
|
+
### F. Lucide React (zero-emoji policy)
|
|
63
|
+
- [ ] Import de icones SO de `lucide-react` (nunca FontAwesome/Heroicons/outra lib).
|
|
64
|
+
- [ ] **Zero emoji unicode em strings de UI** (regex `/[\u{1F300}-\u{1FAFF}\u{2600}-\u{27BF}]/u`).
|
|
65
|
+
- [ ] Icon-only button com `aria-label` obrigatorio.
|
|
66
|
+
- [ ] Tamanhos canonicos: `h-3.5 w-3.5` inline, `h-4 w-4` button, `h-5 w-5` heading, `h-12 w-12` empty state, `h-16 w-16` hero.
|
|
67
|
+
|
|
68
|
+
Detalhe: `libraries/lucide-icons-policy.md`.
|
|
69
|
+
|
|
70
|
+
### E. Interacao (quando aplicavel)
|
|
71
|
+
- [ ] Trigger -> acao -> resultado declarado em `## Interacoes & Estados`
|
|
72
|
+
- [ ] Edge case: o que acontece se trigger duplicar (debounce)?
|
|
73
|
+
- [ ] Edge case: o que acontece se backend demorar >3s?
|
|
74
|
+
|
|
75
|
+
## Niveis de violacao
|
|
76
|
+
|
|
77
|
+
| Tipo | Severidade | Acao |
|
|
78
|
+
|------|-----------|------|
|
|
79
|
+
| A faltando (estado) | high | Bloqueia codegen. Pede correcao via AskUserQuestion. |
|
|
80
|
+
| B faltando (responsivo) | high | Bloqueia se task e tela full. Warning se componente isolado. |
|
|
81
|
+
| C faltando (a11y) | medium | Warning. Codegen continua mas adiciona TODO no codigo. |
|
|
82
|
+
| D faltando (tokens) | medium | Warning. Codegen pode prosseguir mas relatorio ao final. |
|
|
83
|
+
| E faltando (interacao) | high (se ha trigger) | Bloqueia. plan-blueprint ja exige isso — caso aqui e detectar regressao. |
|
|
84
|
+
| F faltando (Lucide/emoji) | high | Bloqueia. Recusar codigo com emoji em UI ou icone nao-Lucide. |
|
|
85
|
+
|
|
86
|
+
## Output
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
[ui-guardrails] PLAN-NNN — N tasks de UI validadas
|
|
90
|
+
|
|
91
|
+
[OK] T-01: cards-projeto-list A B C D E
|
|
92
|
+
[FAIL] T-02: drawer-edit-projeto A . C D E (faltando: empty state, hover focus)
|
|
93
|
+
[WARN] T-03: tooltip-status A B . D E (a11y: sem aria-label)
|
|
94
|
+
|
|
95
|
+
bloqueado: 1 task (T-02). Corrija antes de design-to-code.
|
|
96
|
+
warnings: 1 (T-03 — a11y).
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Hook em pipeline
|
|
100
|
+
|
|
101
|
+
`prototype-orchestrator` (fase 5 -> 6) e `plan-blueprint` (apos plan-to-tasks) DEVEM chamar `ui-guardrails` automaticamente em produtos NAO-descartaveis. Para descartaveis, oferecer skip via flag `--no-guardrails`.
|
|
102
|
+
|
|
103
|
+
## Regras criticas
|
|
104
|
+
|
|
105
|
+
- **Descartavel relax**: se plan tem `descartavel: true` no frontmatter, A/B viram warning (nao block).
|
|
106
|
+
- **Codegen sem guardrails**: violacao da regra do dono ("muito trabalho corrigindo erros nao previstos"). Bloqueia.
|
|
107
|
+
- **Self-update**: se task tem `interaction_target` mas falta `## Interacoes & Estados` no plano, sugerir patch automatico.
|
|
108
|
+
|
|
109
|
+
## Input
|
|
110
|
+
|
|
111
|
+
$ARGUMENTS
|
|
@@ -75,6 +75,8 @@ Apos o loop:
|
|
|
75
75
|
|
|
76
76
|
1. **Cobertura de comportamento**: ler `## Interações & Estados` em `plan.md`. Para cada bullet (slug): existe AO MENOS 1 task com `interaction_target:` apontando pra ele E status `concluido`? Bullet sem cobertura -> plano permanece em `validacao` (registrar em `T-NNN-NN.notes.md` da task mais proxima do dominio).
|
|
77
77
|
2. **Cobertura de overrides**: ler `## Page-level overrides`. Cada linha com decisao (a/b/c) tem task `concluido` cobrindo? grep do `override_target:` correspondente nos frontmatter de tasks. Override sem cobertura -> plano permanece em `validacao`.
|
|
78
|
+
2.1. **Cobertura de drift map**: ler `## Drift map` (e `<plano>/drift-map.md` se existir). Cada linha tem override implementado OU task `concluido` cobrindo? Linha sem encaminhamento -> plano permanece em `validacao` (registrar em `T-NNN-NN.notes.md` da task mais proxima).
|
|
79
|
+
2.2. **Cleanup legado**: para cada task com frontmatter `cleanup_target: <path>`, confirmar que o arquivo foi removido. Comando: `git log --diff-filter=D --name-only --since=<plan.created_at> -- <path>` deve retornar match OU `git diff --staged --name-only --diff-filter=D` contem `<path>`. Falha -> task volta a `validacao` (nao auto-conclui).
|
|
78
80
|
3. **Checklist do plano**: ler `## Checklist de aceite` em `plan.md`. Itens nao marcados -> plano permanece em `validacao` mesmo se todas as tasks fecharam.
|
|
79
81
|
4. **Backend pendings**: ler `## Backend pendings`. Para cada linha com `ClickUp ID`:
|
|
80
82
|
- Consultar `mcp__clickup__clickup_get_task <ID>`.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
intake_id: INTAKE-<NNN>-<slug>
|
|
3
|
+
status: pronto-para-prd
|
|
4
|
+
descartavel: <true|false>
|
|
5
|
+
created_at: <iso>
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# <Titulo curto da ideia>
|
|
9
|
+
|
|
10
|
+
## Problema (em uma frase)
|
|
11
|
+
<sintese feita pelo agente>
|
|
12
|
+
|
|
13
|
+
## Historias reais coletadas
|
|
14
|
+
- <bullet 1>
|
|
15
|
+
- <bullet 2>
|
|
16
|
+
|
|
17
|
+
## Persona
|
|
18
|
+
<descricao em prosa, contexto incluido>
|
|
19
|
+
|
|
20
|
+
## Jobs-to-be-done
|
|
21
|
+
- Quando <situacao>, eu quero <acao>, para que <resultado>.
|
|
22
|
+
|
|
23
|
+
## Limites (o que NAO fazer)
|
|
24
|
+
- <bullet>
|
|
25
|
+
|
|
26
|
+
## Telas-chave (visao bruta)
|
|
27
|
+
1. <tela 1 — descricao em palavras leigas>
|
|
28
|
+
2. <tela 2>
|
|
29
|
+
|
|
30
|
+
## Inspiracoes
|
|
31
|
+
- <link ou nome>
|
|
32
|
+
|
|
33
|
+
## Escopo
|
|
34
|
+
- Descartavel: <sim|nao>
|
|
35
|
+
- Vida util esperada: <uma vez|semanas|meses|continuo>
|
|
36
|
+
|
|
37
|
+
## Metrica de sucesso (linguagem humana)
|
|
38
|
+
<frase do usuario>
|
|
39
|
+
|
|
40
|
+
## Proximo passo
|
|
41
|
+
- Rodar `*prd-from-intake INTAKE-<NNN>-<slug>` para gerar PRD lean.
|
|
@@ -57,6 +57,24 @@ Decisões possíveis:
|
|
|
57
57
|
- **(b) Nova variant na story** — override aparece em ≥3 telas do projeto; vira variant reusável (ex.: `flat`, `seamless`).
|
|
58
58
|
- **(c) Exceção documentada** — override específico desta tela e não merece variant; documentado aqui sem propagar pra story.
|
|
59
59
|
|
|
60
|
+
## Drift map
|
|
61
|
+
|
|
62
|
+
> Gerado em Fase 1.5 do `plan-blueprint`. Side-by-side Figma vs Storybook por componente. Cada linha JÁ reconciliada para override (a/b/c) OU task explícita. Vazio = drift detection rodou sem divergências OU foi pulado por falta de tooling (Figma MCP + Storybook).
|
|
63
|
+
|
|
64
|
+
| Componente | Divergência | Resolução | Referência |
|
|
65
|
+
|------------|-------------|-----------|------------|
|
|
66
|
+
| | | | |
|
|
67
|
+
|
|
68
|
+
> Path dos artefatos: `drift/<Componente>.figma.png`, `drift/<Componente>.story.png`, `drift/<Componente>.diff.md`. Cumulativo em `drift-map.md`.
|
|
69
|
+
|
|
70
|
+
## Cleanup de starter legado
|
|
71
|
+
|
|
72
|
+
> Gerado em Fase 1.6. Listado quando `.gos-local/plan-paths.json` declara `legacy_starter_dirs`. Cada linha vira task `T-NN-cleanup-legacy-<slug>` com `cleanup_target: <path>` no frontmatter. Vazio = projeto sem starter legado declarado OU nenhum match encontrado.
|
|
73
|
+
|
|
74
|
+
| Path legado | Substituto DS | Task |
|
|
75
|
+
|-------------|---------------|------|
|
|
76
|
+
| | | |
|
|
77
|
+
|
|
60
78
|
## Componentes ausentes
|
|
61
79
|
|
|
62
80
|
> Listar componentes não cobertos pelo DS. Cada um vira task de criação separada (priorizar reuso/extensão antes de propor novo).
|
|
@@ -111,6 +129,9 @@ Decisões possíveis:
|
|
|
111
129
|
- [ ] **States**: skeleton/empty/error/loading implementados conforme matriz acima
|
|
112
130
|
- [ ] **Refetch**: dispara após mutações (POST/PATCH/DELETE)
|
|
113
131
|
- [ ] **Seed**: popula TODOS os campos exibidos no Figma (sem `-` em colunas mapeadas)
|
|
132
|
+
- [ ] **Drift map**: cada linha de `## Drift map` (Fase 1.5) tem override implementado OU task `concluido` cobrindo
|
|
133
|
+
- [ ] **Cleanup legado**: tasks com `cleanup_target:` removeram os arquivos declarados (nenhum import de `legacy_starter_dirs` sobrevive na tela)
|
|
134
|
+
- [ ] **Schema/contrato gate**: nenhum campo da tela referencia coluna/endpoint inexistente sem entrada correspondente em `## Backend pendings`
|
|
114
135
|
- [ ] <critério específico da tela 1>
|
|
115
136
|
- [ ] <critério específico da tela 2>
|
|
116
137
|
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
prd_id: PRD-<NNN>-<slug>
|
|
3
|
+
intake_ref: INTAKE-<NNN>-<slug>
|
|
4
|
+
descartavel: <bool>
|
|
5
|
+
status: pronto-para-adr
|
|
6
|
+
created_at: <iso>
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# <Titulo>
|
|
10
|
+
|
|
11
|
+
## TL;DR (1 paragrafo, max 4 linhas)
|
|
12
|
+
<problema + persona + solucao + metrica>
|
|
13
|
+
|
|
14
|
+
## Quem usa
|
|
15
|
+
<persona em 2 linhas>
|
|
16
|
+
|
|
17
|
+
## Por que existe
|
|
18
|
+
<problema em 2 linhas, citando 1 historia real>
|
|
19
|
+
|
|
20
|
+
## O que faz (3-7 bullets)
|
|
21
|
+
- <feature 1>
|
|
22
|
+
- <feature 2>
|
|
23
|
+
|
|
24
|
+
## Telas-chave
|
|
25
|
+
| # | Tela | Proposito | Inputs | Outputs |
|
|
26
|
+
|---|------|-----------|--------|---------|
|
|
27
|
+
| 1 | <nome> | <verbo + objeto> | <dado entrada> | <dado saida> |
|
|
28
|
+
|
|
29
|
+
## Criterios de aceite (do nao-tecnico)
|
|
30
|
+
- [ ] Usuario consegue <acao primaria> em menos de <X> passos
|
|
31
|
+
- [ ] <criterio mensurivel>
|
|
32
|
+
|
|
33
|
+
## Metrica de sucesso
|
|
34
|
+
<copia da metrica humana + 1 metrica quantitativa derivada>
|
|
35
|
+
|
|
36
|
+
## NAO faz parte (escopo negativo)
|
|
37
|
+
- <bullet>
|
|
38
|
+
|
|
39
|
+
## Proximo passo
|
|
40
|
+
- Rodar `*adr-tech-decisions PRD-<NNN>-<slug>` para definir arquitetura.
|
|
@@ -12,6 +12,7 @@ valida_em: <referência ao critério no checklist do plano>
|
|
|
12
12
|
depends_on_backend: [] # opcional — gap-keys da tabela ## Backend pendings do plano pai
|
|
13
13
|
interaction_target: [] # opcional — bullets de "## Interações & Estados" do plano pai que esta task implementa/preserva (ex.: ["row-click-drawer-view", "submit-create"])
|
|
14
14
|
override_target: [] # opcional — linhas de "## Page-level overrides" do plano pai que esta task resolve (ex.: ["StatCard:flat-variant"])
|
|
15
|
+
cleanup_target: null # opcional — path absoluto/relativo de arquivo legado que esta task remove (ex.: "src/figma-make/ProjetosPage.tsx"). validate-plan exige deleção observável no diff.
|
|
15
16
|
assignees: []
|
|
16
17
|
links: []
|
|
17
18
|
---
|
|
@@ -36,6 +37,7 @@ links: []
|
|
|
36
37
|
- [ ] **Visual gate aprovado** (relatório em `T-NNN-NN.notes.md` com 5 seções: anatomia, tokens, variants, densidade, comportamentos)
|
|
37
38
|
- [ ] **Comportamentos**: cada `interaction_target` declarado tem handler/estado implementado e observável no diff
|
|
38
39
|
- [ ] **Overrides**: cada `override_target` declarado foi aplicado conforme decisão (a/b/c) registrada em `## Page-level overrides`
|
|
40
|
+
- [ ] **Cleanup**: quando `cleanup_target:` declarado, arquivo foi removido (`git diff --staged` mostra deleção)
|
|
39
41
|
- [ ] Tests/CI verdes
|
|
40
42
|
- [ ] Sem regressões
|
|
41
43
|
- [ ] <métrica específica>
|
package/CLAUDE.md
CHANGED
|
@@ -48,7 +48,7 @@ Todo texto gerado deve passar por correcao ortografica e remocao de padroes de I
|
|
|
48
48
|
gos-master | architect | dev | devops | po | qa | sm | squad-creator | ux-design-expert
|
|
49
49
|
|
|
50
50
|
### Skills (invoke via /gos:skills:{slug})
|
|
51
|
-
design-to-code | figma-implement-design | figma-make-analyzer | make-code-triage | make-version-diff | component-dedup | frontend-dev | interface-design | react-best-practices | react-doctor | sprint-planner | clickup | plan-to-tasks | agent-teams | git-ssh-setup | stack-profiler | plan-blueprint | progress-tracker | execute-plan | validate-plan
|
|
51
|
+
design-to-code | figma-implement-design | figma-make-analyzer | make-code-triage | make-version-diff | component-dedup | frontend-dev | interface-design | react-best-practices | react-doctor | sprint-planner | clickup | plan-to-tasks | agent-teams | git-ssh-setup | humanizer | weekly-update | slack-review | stack-profiler | plan-blueprint | progress-tracker | execute-plan | validate-plan | audit-screenshots
|
|
52
52
|
|
|
53
53
|
### IDEs suportadas (npm run sync:ides gera adapters)
|
|
54
54
|
Claude Code | Cursor | Gemini CLI | Qwen Code | Antigravity | Opencode | Kilo Code | **Codex IDE Extension** (ambiente de execucao, comando primario `*execute-plan`)
|
|
@@ -69,6 +69,14 @@ State machine: `pendente -> em-andamento -> validacao -> concluido`. Estado late
|
|
|
69
69
|
|
|
70
70
|
**Politica Figma vs Storybook**: story define API/anatomia do componente; em conflito visual cosmetico (bg, border, padding, radius), Figma da pagina vence — divergencia e registrada em `## Page-level overrides` do plano com decisao a/b/c (a=className, b=variant nova, c=excecao documentada). Sem essa disciplina, refinamentos da pagina viram retrabalho no fim (caso PLAN-005: 54 deltas em 26 rodadas).
|
|
71
71
|
|
|
72
|
+
**Drift map automatico (Fase 1.5 do `*plan`)**: com Figma MCP + Storybook disponiveis, `*plan` gera `<plano>/drift-map.md` antes de emitir tasks — screenshots side-by-side por componente; cada divergencia vira override ou task explicita. Sem essa etapa, ~70% das divergencias viraram retrabalho durante execucao.
|
|
73
|
+
|
|
74
|
+
**Cleanup de starter legado (Fase 1.6)**: `.gos-local/plan-paths.json` campo `legacy_starter_dirs: ["src/figma-make/", ...]` faz `*plan` emitir tasks `T-NN-cleanup-legacy-<slug>` automaticamente para arquivos do starter. Sem o campo, comportamento atual preservado.
|
|
75
|
+
|
|
76
|
+
**Schema/contrato gate (Fase 2.4)**: `.gos-local/plan-paths.json` campo `backend_schema_files: [...]` (Postman + Prisma) faz `*plan` validar contrato antes de emitir tasks frontend; gaps viram task ClickUp + entrada em `## Backend pendings`.
|
|
77
|
+
|
|
78
|
+
**Skill `*audit-screenshots`**: conversacional. Recebe N prints anotados em uma sessao, resolve cada print -> tela -> Figma frame via `docs/figma-screen-map.md`, compara, e ao fechar emite UM plano de correcao com tasks pendentes (sem executar). Acoplado ao mesmo template — output e input valido para `*execute-plan`/`*validate-plan`.
|
|
79
|
+
|
|
72
80
|
Paths do projeto-cliente sao resolvidos via `.gos-local/plan-paths.json` — nada hardcoded. Nesse arquivo declara-se onde estao `docs/plans/`, `docs/postman/`, `docs/regras-de-negocio/`, design system, etc. Cada projeto/dev pode organizar diferente.
|
|
73
81
|
|
|
74
82
|
Playbook completo: `.gos/playbooks/plan-creation-playbook.md`
|