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