ganbatte-os 0.2.34 → 0.2.35
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 +48 -8
- package/.gos/libraries/frontend/state-persistence-patterns.md +300 -0
- package/.gos/playbooks/plan-creation-playbook.md +34 -17
- package/.gos/scripts/integrations/check-plan.js +120 -0
- package/.gos/scripts/integrations/migrate-task-status.js +122 -0
- package/.gos/scripts/integrations/setup-ide-adapters.js +80 -66
- package/.gos/skills/execute-plan/SKILL.md +72 -20
- package/.gos/skills/plan-blueprint/SKILL.md +71 -6
- package/.gos/skills/plan-to-tasks/SKILL.md +13 -29
- package/.gos/skills/progress-tracker/SKILL.md +23 -3
- package/.gos/skills/registry.json +2 -1
- package/.gos/skills/validate-plan/SKILL.md +125 -0
- package/.gos/templates/planTemplate.md +50 -6
- package/.gos/templates/taskTemplate.md +6 -1
- package/CLAUDE.md +7 -4
- package/package.json +1 -1
|
@@ -21,6 +21,18 @@ metadata:
|
|
|
21
21
|
|
|
22
22
|
Você está executando como **Tech Lead Frontend / Arquiteto Sênior** via skill `plan-blueprint`.
|
|
23
23
|
|
|
24
|
+
## Contrato inviolável
|
|
25
|
+
|
|
26
|
+
`*plan` é uma operação **atômica** que entrega `{plan.md + context.md + TODAS as T-NN*.md no tasks/ + progress.txt atualizado}`. NUNCA termine sem todos os 4 artefatos. A sequência obrigatória ao final é:
|
|
27
|
+
|
|
28
|
+
1. Escrever `plan.md` + `context.md`.
|
|
29
|
+
2. **Invocar `plan-to-tasks`** apontando para o `plan.md` recém-criado — gera os `T-NN*.md` em `tasks/`.
|
|
30
|
+
3. Atualizar `progress.txt` (skill `progress-tracker set`).
|
|
31
|
+
4. **Rodar `node <repo>/.gos/scripts/integrations/check-plan.js <plan-dir>`** — gate determinístico.
|
|
32
|
+
5. Exit 0 → devolver "plano criado" com resumo. Exit != 0 → regerar tasks 1x e re-rodar; se persistir, ABORTAR e devolver a saída do check-plan ao usuário.
|
|
33
|
+
|
|
34
|
+
Plano sem tasks (tasks/ vazio ou ausente) é falha — não é "plano parcial". Skill que devolve "plano criado" sem ter rodado o check-plan está em estado inválido.
|
|
35
|
+
|
|
24
36
|
## Input
|
|
25
37
|
|
|
26
38
|
$ARGUMENTS
|
|
@@ -28,10 +40,11 @@ $ARGUMENTS
|
|
|
28
40
|
Campos obrigatórios no prompt:
|
|
29
41
|
- `OBJETIVO` — `implantacao` | `correcao` | `refactor`
|
|
30
42
|
- `FIGMA` — URL do frame principal (auto-ativa Figma MCP)
|
|
43
|
+
- `INTERACOES` — lista estruturada de interações da tela (`<Elemento> — <trigger> → <ação> → <resultado>`). **Obrigatório quando a tela tem table com row clicável OU drawer/modal/popup OU botão que dispara ação assíncrona**. `gos-master` recusa o `*plan` se vazio nessas condições.
|
|
31
44
|
|
|
32
45
|
Opcionais:
|
|
33
46
|
- `FIGMA+` — lista de URLs de componentes
|
|
34
|
-
- `NOTAS` — prosa livre (
|
|
47
|
+
- `NOTAS` — prosa livre (invioláveis, edge cases, contexto adicional)
|
|
35
48
|
- `ASSIGNEE` — override do user_id ClickUp para tasks de backend (default: 112010775)
|
|
36
49
|
|
|
37
50
|
Auto-resolvido pelo `gos-master` (comprehension gate, NÃO pedir ao usuário):
|
|
@@ -84,13 +97,37 @@ Caso contrário: trabalhar pela descrição/screenshot fornecido.
|
|
|
84
97
|
|
|
85
98
|
Produzir tabela:
|
|
86
99
|
|
|
87
|
-
| Elemento (Figma/descrição) | Componente do DS | Story (path) | Variant | Props relevantes |
|
|
88
|
-
|
|
100
|
+
| Elemento (Figma/descrição) | Componente do DS | Story (path) | Variant | Props relevantes | Comportamento |
|
|
101
|
+
|----------------------------|------------------|--------------|---------|-------------------|---------------|
|
|
89
102
|
|
|
90
103
|
A coluna `Story (path)` aponta para `.stories.tsx` indexado no gate. Componente sem story correspondente NÃO entra na tabela — vai pra "Componentes ausentes" e gera task de criação.
|
|
91
104
|
|
|
105
|
+
Coluna `Comportamento` é obrigatória quando o elemento é interativo. Refinamentos cosméticos (bg, border, padding) NÃO entram aqui — vão para `## Page-level overrides` (Fase 1.4 abaixo).
|
|
106
|
+
|
|
92
107
|
Listar **componentes ausentes** separadamente — sinalizar como bloqueio ou candidato a criação (vai virar task própria).
|
|
93
108
|
|
|
109
|
+
### 1.4 Comportamentos & Overrides
|
|
110
|
+
|
|
111
|
+
Sub-fase nova que materializa intenção de uso e divergência Figma↔Storybook:
|
|
112
|
+
|
|
113
|
+
1. **Interações & Estados** (`## Interações & Estados` no plano):
|
|
114
|
+
- Lê `INTERACOES` do input. Se ausente E a tela tem table/drawer/modal/popup detectado em Figma MCP (layer names contendo `Drawer|Modal|Dialog|Popup|Sheet`) ou em `dirs.app` (página equivalente já existente): **bloqueia** a geração e devolve `AskUserQuestion` estruturado pedindo as interações com 3 exemplos pré-preenchidos (clickable row, submit, filtro).
|
|
115
|
+
- Reconcilia `INTERACOES` com Figma MCP prototype connections quando disponíveis (`figma.connections` revela frame→frame transitions). Conflito → prefere `INTERACOES` do usuário (intenção declarada).
|
|
116
|
+
- Cada bullet vira identificável (slug curto: `row-click-drawer-view`, `submit-create`, `filter-periodo`) — esses slugs são referenciados por `interaction_target:` nas tasks.
|
|
117
|
+
- Mapa de estados visuais (skeleton/empty/error/loading) por componente é obrigatório quando a tabela "Componentes mapeados" inclui Tabela ou Form.
|
|
118
|
+
|
|
119
|
+
2. **Page-level overrides** (`## Page-level overrides` no plano):
|
|
120
|
+
- Para cada componente da tabela "Componentes mapeados": confronta CSS aplicado no Figma da página (padding, border, bg, radius, shadow) contra props/classes da story canônica em `.stories.tsx`.
|
|
121
|
+
- Diff cosmético vira linha em `## Page-level overrides` com decisão sugerida pela heurística:
|
|
122
|
+
- Override aparece em ≥3 telas do projeto (grep em `dirs.app`): **(b) nova variant na story**.
|
|
123
|
+
- Override aparece só nesta tela: **(a) className na página**.
|
|
124
|
+
- Override é workaround conhecido / hack temporário: **(c) exceção documentada**.
|
|
125
|
+
- Slugs curtos (`StatCard:flat-variant`, `Drawer:no-outer-border`) são referenciados por `override_target:` nas tasks.
|
|
126
|
+
|
|
127
|
+
Política Figma vs Storybook (ver Fase 2):
|
|
128
|
+
|
|
129
|
+
> Story define API/anatomia do componente; refinamentos cosméticos da página são aceitos via override registrado em `## Page-level overrides`. **Em conflito visual, Figma da página vence**.
|
|
130
|
+
|
|
94
131
|
## Fase 2 — Aderência à Stack
|
|
95
132
|
|
|
96
133
|
**Modo padrão (sem `--allow-arch-change`)**: SOMENTE referenciar a stack já registrada em `stack.md`. Para cada dado/ação da tela, listar:
|
|
@@ -128,6 +165,12 @@ Para cada elemento mapeado:
|
|
|
128
165
|
3. Montagem da view (composição dos componentes do DS)
|
|
129
166
|
4. Estado e interatividade (client components estritamente onde necessário)
|
|
130
167
|
|
|
168
|
+
Regras de geração de tasks (cobertura de comportamento + overrides):
|
|
169
|
+
|
|
170
|
+
- Toda interação em `## Interações & Estados` deve gerar **ao menos 1 task** com `interaction_target:` apontando pra ela. Se uma task cobre múltiplas interações, listar todos os slugs.
|
|
171
|
+
- Toda linha de `## Page-level overrides` com decisão **(b)** gera task de variant na story (`area: ui-ux`, `agent:ux-design-expert`); decisões **(a)** e **(c)** geram tasks na página (`area: frontend`, `agent:dev`). Em ambos os casos, frontmatter da task declara `override_target:` apontando pro slug.
|
|
172
|
+
- Tasks de seed data (quando aplicável — Tabela ou Form com fields no Figma) declaram fields obrigatórios e referenciam o checklist "Seed popula TODOS os campos exibidos".
|
|
173
|
+
|
|
131
174
|
## Subdivisão automática
|
|
132
175
|
|
|
133
176
|
Se a análise identificar mais de 3 seções autônomas (modais, drawers, sub-rotas com fetching próprio), gerar **planos filhos** numerados:
|
|
@@ -139,13 +182,34 @@ Frontmatter linka via `parent_plan` / `children_plans`.
|
|
|
139
182
|
|
|
140
183
|
## Saída
|
|
141
184
|
|
|
142
|
-
Para cada plano (incluindo filhos)
|
|
185
|
+
Para cada plano (incluindo filhos), os 4 passos abaixo são **obrigatórios e atômicos** — `*plan` NÃO termina sem todos. Falhar qualquer um aborta com erro explícito (não retornar plano-sem-tasks ao usuário; foi exatamente isso que motivou o bug do PLAN-006).
|
|
143
186
|
|
|
144
187
|
1. `<dirs.planos>/PLAN-NNN-<slug>/plan.md` — gerado a partir de `templates/planTemplate.md`. Frontmatter inclui `stack_ref: <dirs.stack>@<sha-curto>` para travar a versão da stack.
|
|
145
188
|
2. `<dirs.planos>/PLAN-NNN-<slug>/context.md` — gerado a partir de `templates/contextTemplate.md`. Denso, indexado.
|
|
146
|
-
3. Disparar `plan-to-tasks
|
|
189
|
+
3. **Disparar `plan-to-tasks`** apontando para o `plan.md` recém-criado → produz tasks em `<dirs.tasks>` (resolvido com `{plan}` substituído). Esta chamada é **vinculante** — `*plan` é uma operação `{plano + tasks + context + progress}`, nunca só plano. Se `plan-to-tasks` falhar (gate de Phase 3.5), abortar `*plan` inteiro (não deixar plano órfão).
|
|
147
190
|
4. Disparar `progress-tracker set-current` apontando o plano novo → atualiza `progress.txt`.
|
|
148
191
|
|
|
192
|
+
**Pós-condições obrigatórias** (verificar antes de devolver controle ao usuário):
|
|
193
|
+
|
|
194
|
+
- `<dirs.planos>/PLAN-NNN-<slug>/tasks/` existe e contém ≥1 `T-NN*.md`.
|
|
195
|
+
- Para CADA `T-NN*.md`: `head -1` = `---` E grep `^status: pendente$` retorna match. Use o gate da Phase 3.5 do `plan-to-tasks`. Falha → regerar tasks; se persistir, abortar com erro explícito ao usuário citando os arquivos malformados.
|
|
196
|
+
- `progress.txt` aponta para o plano novo.
|
|
197
|
+
|
|
198
|
+
### Gate determinístico — ÚLTIMA ação obrigatória do `*plan`
|
|
199
|
+
|
|
200
|
+
Após escrever todos os arquivos e atualizar `progress.txt`, **executar via Bash**:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
node <repo-do-framework>/.gos/scripts/integrations/check-plan.js <dirs.planos>/PLAN-NNN-<slug>
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
(No projeto-cliente o caminho do script é `.gos/scripts/integrations/check-plan.js`. Em workspaces que rodam o G-OS canônico, é `.G-OS/.gos/scripts/integrations/check-plan.js`.)
|
|
207
|
+
|
|
208
|
+
- **Exit code 0** → plano válido, usável por `*execute-plan` / `*validate-plan`. SÓ ENTÃO devolver "plano criado" ao usuário com o resumo final.
|
|
209
|
+
- **Exit code != 0** → NÃO devolver "plano criado". A saída do script aponta exatamente o que está errado (task sem frontmatter, status divergente, secao `## Status` no body, etc.). Tentar regerar via `plan-to-tasks` UMA vez; se persistir, abortar com a saída do `check-plan` literal e instruir o usuário a rodar `migrate-task-status.js`.
|
|
210
|
+
|
|
211
|
+
Esse gate é **determinístico** — não depende do LLM verificar individualmente cada task. É a barreira que evita o bug PLAN-006 voltar.
|
|
212
|
+
|
|
149
213
|
Resumo final:
|
|
150
214
|
|
|
151
215
|
```
|
|
@@ -169,7 +233,8 @@ Próximos passos:
|
|
|
169
233
|
- **Backend read-only respeitado**: se `stack.md` declara backend read-only, plano NUNCA propõe schema novo.
|
|
170
234
|
- **Next.js App Router**: decisão server vs client é explícita por elemento.
|
|
171
235
|
- **Sem prosa decorativa**: plano deve ser executável, denso, com critérios mensuráveis.
|
|
172
|
-
- **Storybook como contrato**: cada componente do DS na tabela DEVE apontar `.stories.tsx` existente em `dirs.storybook`. Sem story → componente vai pra "Componentes ausentes" e gera task de criação.
|
|
236
|
+
- **Storybook como contrato base; Figma da página como contrato final**: cada componente do DS na tabela DEVE apontar `.stories.tsx` existente em `dirs.storybook`. Sem story → componente vai pra "Componentes ausentes" e gera task de criação. **Em conflito visual entre story e Figma da página, Figma vence** — divergência cosmética é registrada em `## Page-level overrides` com decisão a/b/c (não vira retrabalho no fim).
|
|
237
|
+
- **Comportamento mapeado é obrigatório**: tela com table-clicável/drawer/modal/popup sem `INTERACOES` no input bloqueia plan generation (`AskUserQuestion`). Sem essa disciplina, o caso PLAN-005 (54 deltas em 26 rodadas de feedback) repete.
|
|
173
238
|
|
|
174
239
|
## Model guidance
|
|
175
240
|
|
|
@@ -49,40 +49,24 @@ For each task, create a file following o caminho resolvido em `plan-paths.json`:
|
|
|
49
49
|
|
|
50
50
|
Naming: usar `naming.task_prefix` e `naming.seq_padding` do `plan-paths.json` (defaults: `T`, padding 3 → `T-042-001`).
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
**Template — CONTRATO DURO**: a estrutura canônica vive em `templates/taskTemplate.md`. Esta skill **DEVE ler esse arquivo na Phase 1** e usar **exatamente** os campos do frontmatter de lá — sem omitir, renomear ou reordenar. NÃO reproduza template inline aqui (já causou bug onde tasks geradas não tinham `status:` no frontmatter — rastreável a planos com tasks travadas em `pendente` mesmo após execução).
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
area: <security|backend|ui-ux|routers|migrations|tests|general>
|
|
59
|
-
labels: [agent:<slug>, type:<refactor|bug|feature|chore>]
|
|
60
|
-
priority: <P0|P1|P2>
|
|
61
|
-
estimate: "<2h|4h|1d>"
|
|
62
|
-
assignees: []
|
|
63
|
-
due: null
|
|
64
|
-
links: []
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## Contexto
|
|
68
|
-
<why this task exists — link to the source plan/ADR/PRD>
|
|
54
|
+
Campos obrigatórios do frontmatter (do `taskTemplate.md`, presentes em CADA T-NN.md gerado):
|
|
55
|
+
- `id`, `plan_id`, `seq`, `title`, `area`, `labels`, `priority`, `estimate`
|
|
56
|
+
- **`status: pendente`** — invariante. Sem isso o `progress-tracker` não consegue transicionar e o `*execute-plan`/`*validate-plan` quebram.
|
|
57
|
+
- `valida_em`, `depends_on_backend: []`, `interaction_target: []`, `override_target: []`, `assignees: []`, `links: []`
|
|
69
58
|
|
|
70
|
-
|
|
71
|
-
<expected result in 1-2 sentences>
|
|
59
|
+
Body: copiar as seções do `taskTemplate.md` (`## Contexto`, `## Objetivo`, `## Plano de execução`, `## Critérios de aceitação (DoD)`, `## Riscos & Rollback`) — **NÃO** adicionar seção `## Status` no body. Status vive APENAS no frontmatter.
|
|
72
60
|
|
|
73
|
-
|
|
74
|
-
- [ ] Step 1
|
|
75
|
-
- [ ] Step 2
|
|
76
|
-
- [ ] Step 3
|
|
61
|
+
### Phase 3.5 — Verificação pós-geração (gate)
|
|
77
62
|
|
|
78
|
-
|
|
79
|
-
- [ ] Tests/CI green
|
|
80
|
-
- [ ] No regressions
|
|
81
|
-
- [ ] <measurable metric: e.g., coverage ≥70% | endpoint returns <200ms | UI renders correctly on mobile>
|
|
63
|
+
Para cada `T-NN*.md` gerado: confirmar que `head -1` retorna `---` E o frontmatter contém literalmente `status: pendente`. Se qualquer task falhar, regerar (não prosseguir com tasks malformadas — silenciar aqui é o bug original).
|
|
82
64
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
-
|
|
65
|
+
```bash
|
|
66
|
+
for f in <dirs.tasks>/T-*.md; do
|
|
67
|
+
head -1 "$f" | grep -q '^---$' || { echo "FALHA frontmatter: $f"; exit 1; }
|
|
68
|
+
grep -q '^status: pendente$' "$f" || { echo "FALHA status: $f"; exit 1; }
|
|
69
|
+
done
|
|
86
70
|
```
|
|
87
71
|
|
|
88
72
|
### Phase 4 — Output a summary
|
|
@@ -37,15 +37,23 @@ Formato denso, sem prosa, otimizado para tokens. Inspirado em `caveman-main` e `
|
|
|
37
37
|
|
|
38
38
|
```
|
|
39
39
|
pendente → em-andamento → validacao → concluido
|
|
40
|
+
↓ ↑
|
|
41
|
+
bloqueada-backend ────┘
|
|
42
|
+
(ClickUp aberto)
|
|
40
43
|
```
|
|
41
44
|
|
|
45
|
+
Estado lateral `bloqueada-backend` é introduzido pelo `*execute-plan` quando a task tem `depends_on_backend:` que aponta para `## Backend pendings` ainda em aberto no ClickUp. Mantém memória do bloqueio sem regredir para `pendente`.
|
|
46
|
+
|
|
42
47
|
Transições válidas:
|
|
43
48
|
- `pendente → em-andamento`: livre
|
|
49
|
+
- `pendente → bloqueada-backend`: livre (gate detectou no pré-flight do execute-plan)
|
|
50
|
+
- `em-andamento → bloqueada-backend`: livre (executor detectou gap em runtime)
|
|
51
|
+
- `bloqueada-backend → em-andamento`: requer ClickUp `concluido`/`closed` (skill checa via `mcp__clickup__clickup_get_task`)
|
|
44
52
|
- `em-andamento → validacao`: requer commit preparado (não pushado)
|
|
45
|
-
- `validacao → concluido`:
|
|
53
|
+
- `validacao → concluido`: marcado automaticamente por `*validate-plan` quando passa em checklist + visual gate curto + diff. Manual via `*progress status T-NNN-NN concluido` aceito também.
|
|
46
54
|
- `* → pendente`: rollback (libera a transição via flag `--rollback`)
|
|
47
55
|
|
|
48
|
-
Transições inválidas falham com mensagem
|
|
56
|
+
Transições inválidas falham com mensagem da skill (state machine textual; sem helper externo).
|
|
49
57
|
|
|
50
58
|
## Subcomandos
|
|
51
59
|
|
|
@@ -67,7 +75,19 @@ Fixa o plano ativo. Ex.: `*progress set PLAN-042-checkout`. Atualiza:
|
|
|
67
75
|
|
|
68
76
|
### `status <task-id> <novo-status>`
|
|
69
77
|
|
|
70
|
-
Muda status de uma task. Valida via state machine. Atualiza
|
|
78
|
+
Muda status de uma task. Valida via state machine. Atualiza:
|
|
79
|
+
|
|
80
|
+
1. **Frontmatter do task file** (campo `status:` no YAML do topo). Esta e a fonte de verdade — `execute-plan`/`validate-plan` leem dali. **NAO** atualizar/criar secao `## Status` no body.
|
|
81
|
+
2. `progress.txt` (`last_done`, `next`).
|
|
82
|
+
|
|
83
|
+
Pre-condicao: o task file DEVE ter frontmatter YAML valido com campo `status:`. Se ausente:
|
|
84
|
+
- Detectar via `head -1` != `---` OU grep `^status:` vazio.
|
|
85
|
+
- Se task tem secao `## Status` no body (formato legado bugado): abortar com mensagem `task-malformada: T-NNN-NN usa formato body-status — rodar scripts/integrations/migrate-task-status.js antes de continuar`.
|
|
86
|
+
- Se nao tem nem frontmatter nem `## Status`: abortar com `task-sem-status: regenerar via plan-to-tasks`.
|
|
87
|
+
|
|
88
|
+
Falha de pre-condicao NAO e silenciada — se silenciar, executor segue achando que transicionou e tasks travam em `pendente` (bug original que motivou esse contrato).
|
|
89
|
+
|
|
90
|
+
Se a task fechar o checklist do plano, sugere `*progress status <plan-id> validacao`.
|
|
71
91
|
|
|
72
92
|
### `compact`
|
|
73
93
|
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
{ "slug": "stack-profiler", "path": "skills/stack-profiler/SKILL.md" },
|
|
24
24
|
{ "slug": "plan-blueprint", "path": "skills/plan-blueprint/SKILL.md" },
|
|
25
25
|
{ "slug": "progress-tracker", "path": "skills/progress-tracker/SKILL.md" },
|
|
26
|
-
{ "slug": "execute-plan", "path": "skills/execute-plan/SKILL.md" }
|
|
26
|
+
{ "slug": "execute-plan", "path": "skills/execute-plan/SKILL.md" },
|
|
27
|
+
{ "slug": "validate-plan", "path": "skills/validate-plan/SKILL.md" }
|
|
27
28
|
]
|
|
28
29
|
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: validate-plan
|
|
3
|
+
description: Valida implementacao pos-execute. Para cada task em validacao, re-roda visual gate curto (anatomia + tokens), confronta diff staged contra Componentes mapeados, confere checklist do plano. Auto-marca concluido o que passa. Fecha plano quando todas as tasks fecham E backend pendings ClickUp estao concluidas.
|
|
4
|
+
argument-hint: "<PLAN-NNN-slug> [NOTAS=...]"
|
|
5
|
+
allowedTools: [Read, Glob, Grep, Bash, Edit, Agent, AskUserQuestion]
|
|
6
|
+
sourceDocs:
|
|
7
|
+
- templates/planTemplate.md
|
|
8
|
+
- templates/taskTemplate.md
|
|
9
|
+
- playbooks/plan-creation-playbook.md
|
|
10
|
+
- skills/execute-plan/SKILL.md
|
|
11
|
+
- skills/progress-tracker/SKILL.md
|
|
12
|
+
use-when:
|
|
13
|
+
- validar plano apos *execute-plan ter rodado
|
|
14
|
+
- fechar tasks em validacao -> concluido apos checklist + visual gate curto
|
|
15
|
+
- confirmar que diff staged bate com Componentes mapeados do plano
|
|
16
|
+
do-not-use-for:
|
|
17
|
+
- executar tasks (use execute-plan)
|
|
18
|
+
- criar plano novo (use plan-blueprint)
|
|
19
|
+
- decompor plano em tasks (use plan-to-tasks)
|
|
20
|
+
metadata:
|
|
21
|
+
category: validation
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
Voce esta executando como **Revisor de Planos** via skill `validate-plan`. Fecha o ciclo `*plan -> *execute-plan -> *validate-plan`. Ambiente recomendado: Opus 4.7 (revisor); funciona em qualquer IDE.
|
|
25
|
+
|
|
26
|
+
## Input
|
|
27
|
+
|
|
28
|
+
$ARGUMENTS
|
|
29
|
+
|
|
30
|
+
Formato esperado:
|
|
31
|
+
- `<PLAN-NNN-slug>` — id do plano (ex.: `PLAN-001-pagina-projetos-inicial`)
|
|
32
|
+
- `NOTAS="..."` — opcional, contexto de QA / desvios conhecidos
|
|
33
|
+
|
|
34
|
+
## Pre-requisitos (gate)
|
|
35
|
+
|
|
36
|
+
1. Resolver paths via `.gos-local/plan-paths.json`. Ausente -> abortar.
|
|
37
|
+
2. Localizar `<dirs.planos>/<PLAN-NNN-slug>/plan.md`. Ausente -> abortar.
|
|
38
|
+
3. Ler `plan.md` por completo: frontmatter + Componentes mapeados + Plano de execucao + Checklist de aceite + Backend pendings.
|
|
39
|
+
4. Listar arquivos staged: `git diff --staged --name-only`. Vazio -> warning visivel ("nenhuma alteracao staged; *execute-plan rodou?") mas NAO aborta — pode validar plano que ja foi commitado, comparando com `git log` desde `validated_at` ou `created_at`.
|
|
40
|
+
5. Ler `<dirs.progress>` (progress.txt). Confirmar que `plan_active` casa com o argumento; se outro plano estiver ativo, perguntar antes de prosseguir.
|
|
41
|
+
|
|
42
|
+
## Loop por task
|
|
43
|
+
|
|
44
|
+
**Gate de formato (pre-loop)**: para cada `T-NN*.md` em `<dirs.planos>/<PLAN-NNN-slug>/tasks/`, confirmar `head -1 == "---"` E `grep -q '^status:'` no frontmatter. Tasks malformadas (sem frontmatter ou usando `## Status` no body) sao registradas como erro de plano: validate-plan ABORTA com mensagem `tasks-malformadas: <lista> — rodar scripts/integrations/migrate-task-status.js OU regerar via plan-to-tasks`. Isso evita o falso negativo onde tasks com codigo pronto aparecem `pendente` por bug de gerador (caso PLAN-006).
|
|
45
|
+
|
|
46
|
+
Iterar tasks cujo frontmatter `status:` seja `validacao`. Tasks em outros estados (pendente, em-andamento, bloqueada-backend, concluido) sao puladas com log curto.
|
|
47
|
+
|
|
48
|
+
**Diagnostico do bug PLAN-006**: se TODAS as tasks estao em `pendente` E `git diff --staged` ou `git log --since=<plan.created_at>` mostra alteracoes nos arquivos esperados, e provavel que `*execute-plan` rodou sem transicionar (bug do executor). Reportar como `executor-skipped-progress` e instruir humano: rodar `migrate-task-status.js --infer-from-diff` OU re-rodar `*execute-plan PLAN-NNN-<slug>` (que agora tem pos-condicao obrigatoria).
|
|
49
|
+
|
|
50
|
+
Para cada `T-NNN-NN-*.md` em `validacao`:
|
|
51
|
+
|
|
52
|
+
1. **Visual gate curto**: para cada componente do plano que a task tocou:
|
|
53
|
+
a) Localizar `<Componente>.stories.tsx` em `<dirs.storybook>`.
|
|
54
|
+
b) Comparar implementacao vs story canonica em 3 dimensoes (curto, sem refazer Figma MCP completo):
|
|
55
|
+
- **Anatomia**: ordem de slots/elementos.
|
|
56
|
+
- **Tokens**: classes Tailwind/variaveis CSS batem com DS — divergencia registrada em `## Page-level overrides` do plano NAO falha (gate confirma aplicacao do override).
|
|
57
|
+
- **Comportamentos**: para cada `interaction_target:` da task, grep do handler/estado no diff. Para cada `override_target:` da task, grep das classes/props da decisao.
|
|
58
|
+
c) Output: append em `tasks/T-NNN-NN.notes.md` na secao `## Validate run <iso>`.
|
|
59
|
+
2. **Confronto diff x mapeamento**: arquivos alterados pela task estao listados em "Componentes mapeados" do plano? Arquivos fora do mapeamento -> warning (nao falha por padrao).
|
|
60
|
+
3. **Checklist da task (DoD)**: ler `## Criterios de aceitacao` da task. Itens nao marcados (`[ ]`) = falha automatica.
|
|
61
|
+
4. **Resultado**:
|
|
62
|
+
- **Tudo bate** -> `*progress status T-NNN-NN concluido` (auto-marca; rollback humano via `*progress status T-NNN-NN pendente --rollback` se necessario).
|
|
63
|
+
- **Falha** -> mantem `validacao`, registra divergencia em `T-NNN-NN.notes.md` secao `## Validate run <iso>`, devolve `current=` no progress apontando pra essa task.
|
|
64
|
+
|
|
65
|
+
## Fechamento do plano
|
|
66
|
+
|
|
67
|
+
Apos o loop:
|
|
68
|
+
|
|
69
|
+
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).
|
|
70
|
+
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`.
|
|
71
|
+
3. **Checklist do plano**: ler `## Checklist de aceite` em `plan.md`. Itens nao marcados -> plano permanece em `validacao` mesmo se todas as tasks fecharam.
|
|
72
|
+
4. **Backend pendings**: ler `## Backend pendings`. Para cada linha com `ClickUp ID`:
|
|
73
|
+
- Consultar `mcp__clickup__clickup_get_task <ID>`.
|
|
74
|
+
- Se status != `concluido`/`closed` -> bloqueio ainda ativo.
|
|
75
|
+
- Atualizar coluna `Status` da tabela com o estado atual do ClickUp.
|
|
76
|
+
5. **Decisao**:
|
|
77
|
+
- Todas tasks `concluido` + cobertura de comportamento + cobertura de overrides + checklist do plano marcado + backend pendings todos `concluido` no ClickUp -> marcar `plan.md` frontmatter `validated_at: <iso>` + `*progress status PLAN-NNN-<slug> concluido`.
|
|
78
|
+
- Caso contrario -> manter `validacao`, listar bloqueios.
|
|
79
|
+
6. **Push**: NAO. Commit ja foi preparado por `*execute-plan`. Push e ato consciente humano (`git push`).
|
|
80
|
+
|
|
81
|
+
## Saida final ao usuario
|
|
82
|
+
|
|
83
|
+
Resumo em 4 blocos:
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
[validate-plan] PLAN-NNN-<slug>
|
|
87
|
+
|
|
88
|
+
tasks concluidas: <N> (T-..., T-...)
|
|
89
|
+
tasks pendentes: <M> (T-..., T-...)
|
|
90
|
+
bloqueada-backend: <K> (T-...:CU-..., ...)
|
|
91
|
+
backend pendings: <X> abertas no ClickUp / <Y> concluidas
|
|
92
|
+
|
|
93
|
+
plano: <concluido | validacao>
|
|
94
|
+
proximo passo: <git push | resolver bloqueios | re-rodar visual gate em T-...>
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Diferenca x execute-plan (anti-overlap)
|
|
98
|
+
|
|
99
|
+
- `execute-plan`: visual gate completo (5 dimensoes + Figma MCP arvore), pre-flight smoke (screenshot vs frame), executa codigo via Agent tool, opera estado `em-andamento`.
|
|
100
|
+
- `validate-plan`: visual gate curto (3 dimensoes — anatomia, tokens, comportamentos — sem Figma MCP completo), nao executa codigo, opera estado `validacao -> concluido`, valida cobertura de `interaction_target` e `override_target` no plano. Reaproveita `notes.md` em secao separada `## Validate run <iso>`.
|
|
101
|
+
|
|
102
|
+
Se `validate-plan` detectar que uma task em `validacao` claramente NAO foi implementada (diff staged nao toca os arquivos esperados), nao reabre execucao — devolve falha clara e instrui usuario a rodar `*execute-plan PLAN-NNN-<slug> --task T-NNN-NN`.
|
|
103
|
+
|
|
104
|
+
## Regras criticas
|
|
105
|
+
|
|
106
|
+
- **Auto-conclusao e default**: tudo que passa em checklist + visual gate curto + diff vira `concluido` automaticamente. Rollback humano sempre disponivel.
|
|
107
|
+
- **Sem push automatico**: commit ja preparado pelo `*execute-plan`, push e manual.
|
|
108
|
+
- **State machine respeitada**: tasks `bloqueada-backend` ficam intocadas — backend tem que fechar primeiro.
|
|
109
|
+
- **Backend pendings via ClickUp MCP**: se MCP indisponivel, registra warning e mantem plano em `validacao` ate humano confirmar manualmente.
|
|
110
|
+
|
|
111
|
+
## Model guidance
|
|
112
|
+
|
|
113
|
+
| Escopo | Modelo |
|
|
114
|
+
|--------|--------|
|
|
115
|
+
| Validacao curta de plano com poucas tasks | `sonnet` |
|
|
116
|
+
| Plano grande (10+ tasks, varios componentes) | `opus` |
|
|
117
|
+
| Visual gate curto (2 dimensoes, sem Figma MCP) | inherit |
|
|
118
|
+
|
|
119
|
+
## Instructions
|
|
120
|
+
|
|
121
|
+
1. NUNCA pular checklist do plano — itens nao marcados bloqueiam fechamento.
|
|
122
|
+
2. NUNCA marcar `concluido` sem visual gate curto rodado e gravado em `T-NNN-NN.notes.md`.
|
|
123
|
+
3. Backend pendings via ClickUp MCP sao vinculantes — plano so fecha quando todos `concluido`.
|
|
124
|
+
4. Resolver TODOS os paths via `plan-paths.json`.
|
|
125
|
+
5. Output final: 4-block summary + comando exato de proximo passo (push manual, ou comandos para resolver bloqueios).
|
|
@@ -21,9 +21,41 @@ validated_at: null
|
|
|
21
21
|
|
|
22
22
|
## Componentes mapeados
|
|
23
23
|
|
|
24
|
-
| Elemento | Componente do DS | Story (path) | Variant | Props |
|
|
25
|
-
|
|
26
|
-
| | | | | |
|
|
24
|
+
| Elemento | Componente do DS | Story (path) | Variant | Props | Comportamento |
|
|
25
|
+
|----------|------------------|--------------|---------|-------|---------------|
|
|
26
|
+
| | | | | | |
|
|
27
|
+
|
|
28
|
+
> Coluna `Comportamento` é **obrigatória** quando o elemento é interativo (row clicável, botão, input, drawer/modal/popup trigger). Refinamentos cosméticos da página (bg, border, padding) NÃO entram aqui — vão para `## Page-level overrides`.
|
|
29
|
+
|
|
30
|
+
## Interações & Estados
|
|
31
|
+
|
|
32
|
+
> Cobre o `INTERACOES` do prompt. Cada bullet = um caminho do usuário (trigger → ação → resultado/estado). `validate-plan` cruza essa lista contra tasks com `interaction_target:` no frontmatter.
|
|
33
|
+
|
|
34
|
+
Fluxos por trigger:
|
|
35
|
+
|
|
36
|
+
1. <ex: Lista → Row click → Drawer abre `mode=view` com record.id → fechar (X ou backdrop) → volta lista>
|
|
37
|
+
2. <ex: Lista → "Novo X" → Drawer abre `mode=create` vazio → Salvar → POST /x → fecha + refetch + toast>
|
|
38
|
+
3. <ex: Toolbar → mudar filtro Período → debounce 300ms → refetch query>
|
|
39
|
+
|
|
40
|
+
Estados visuais por componente (skeleton / empty / error / loading):
|
|
41
|
+
|
|
42
|
+
- <ex: Tabela: skeleton 5 rows enquanto fetch; empty state com ilustração + CTA "Criar primeiro X">
|
|
43
|
+
- <ex: Drawer Salvar: estado loading com spinner + disabled durante POST>
|
|
44
|
+
- <ex: Toolbar refresh: ícone gira durante refetch>
|
|
45
|
+
|
|
46
|
+
## Page-level overrides
|
|
47
|
+
|
|
48
|
+
> Refinamentos do Figma da página que divergem da story canônica. **Política**: Figma da página vence a story em conflitos cosméticos (bg, border, padding, radius). Cada override é uma decisão (a/b/c).
|
|
49
|
+
|
|
50
|
+
| Componente | Override observado | Decisão | Ação |
|
|
51
|
+
|------------|--------------------|---------|------|
|
|
52
|
+
| | | | |
|
|
53
|
+
|
|
54
|
+
Decisões possíveis:
|
|
55
|
+
|
|
56
|
+
- **(a) className na página** — override cosmético e isolado; mantém story padrão e aplica via classe na composição da página.
|
|
57
|
+
- **(b) Nova variant na story** — override aparece em ≥3 telas do projeto; vira variant reusável (ex.: `flat`, `seamless`).
|
|
58
|
+
- **(c) Exceção documentada** — override específico desta tela e não merece variant; documentado aqui sem propagar pra story.
|
|
27
59
|
|
|
28
60
|
## Componentes ausentes
|
|
29
61
|
|
|
@@ -73,6 +105,12 @@ validated_at: null
|
|
|
73
105
|
- [ ] **Visual gate**: cada componente mapeado tem story em `dirs.stories/`
|
|
74
106
|
- [ ] **Visual gate**: anatomia, tokens e densidade batem com a story canônica (≤ 1 desvio menor documentado em `T-NNN-NN.notes.md`)
|
|
75
107
|
- [ ] **Visual gate**: árvore JSX da tela espelha hierarquia do Figma (mesmas seções, mesma ordem)
|
|
108
|
+
- [ ] **Comportamentos**: cada linha de "Interações & Estados" tem implementação testável (handler conectado, refetch disparando, estado visual renderizado)
|
|
109
|
+
- [ ] **Overrides**: cada linha de "Page-level overrides" foi resolvida pela decisão registrada (a/b/c)
|
|
110
|
+
- [ ] **Variants**: story canônica reflete novas variants criadas (decisões `b`)
|
|
111
|
+
- [ ] **States**: skeleton/empty/error/loading implementados conforme matriz acima
|
|
112
|
+
- [ ] **Refetch**: dispara após mutações (POST/PATCH/DELETE)
|
|
113
|
+
- [ ] **Seed**: popula TODOS os campos exibidos no Figma (sem `-` em colunas mapeadas)
|
|
76
114
|
- [ ] <critério específico da tela 1>
|
|
77
115
|
- [ ] <critério específico da tela 2>
|
|
78
116
|
|
|
@@ -80,9 +118,15 @@ validated_at: null
|
|
|
80
118
|
|
|
81
119
|
> Gaps detectados confrontando Postman/regras-de-negocio com a necessidade da tela. Cada item vira task ClickUp atribuída ao Douglas (default) ou ao `ASSIGNEE` informado. Vazio = backend completo para esta tela.
|
|
82
120
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
|
121
|
+
> Coluna `Bloqueia tasks` lista os T-IDs frontend cujo frontmatter declara `depends_on_backend:` apontando para a `gap-key` desta linha (ex.: `migration-20260501150000`).
|
|
122
|
+
|
|
123
|
+
| gap-key | Gap | Endpoint/Coleção esperada | ClickUp ID | Status | Bloqueia tasks |
|
|
124
|
+
|---------|-----|---------------------------|------------|--------|----------------|
|
|
125
|
+
| | | | | | |
|
|
126
|
+
|
|
127
|
+
## Mock strategy
|
|
128
|
+
|
|
129
|
+
> Opcional. Quando o frontend opta por mock enquanto o backend não atende, descreva aqui (ex.: fixture em `src/__mocks__/projetos.json`, MSW handler, etc.). Tasks que usam mock NÃO declaram `depends_on_backend:` — apenas referenciam esta seção.
|
|
86
130
|
|
|
87
131
|
## Knowledge mapped
|
|
88
132
|
|
|
@@ -9,6 +9,9 @@ priority: <P0|P1|P2>
|
|
|
9
9
|
estimate: "<2h|4h|1d>"
|
|
10
10
|
status: pendente
|
|
11
11
|
valida_em: <referência ao critério no checklist do plano>
|
|
12
|
+
depends_on_backend: [] # opcional — gap-keys da tabela ## Backend pendings do plano pai
|
|
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
|
+
override_target: [] # opcional — linhas de "## Page-level overrides" do plano pai que esta task resolve (ex.: ["StatCard:flat-variant"])
|
|
12
15
|
assignees: []
|
|
13
16
|
links: []
|
|
14
17
|
---
|
|
@@ -30,7 +33,9 @@ links: []
|
|
|
30
33
|
## Critérios de aceitação (DoD)
|
|
31
34
|
|
|
32
35
|
- [ ] Implementação atende `valida_em` do plano
|
|
33
|
-
- [ ] **Visual gate aprovado** (relatório em `T-NNN-NN.notes.md` com
|
|
36
|
+
- [ ] **Visual gate aprovado** (relatório em `T-NNN-NN.notes.md` com 5 seções: anatomia, tokens, variants, densidade, comportamentos)
|
|
37
|
+
- [ ] **Comportamentos**: cada `interaction_target` declarado tem handler/estado implementado e observável no diff
|
|
38
|
+
- [ ] **Overrides**: cada `override_target` declarado foi aplicado conforme decisão (a/b/c) registrada em `## Page-level overrides`
|
|
34
39
|
- [ ] Tests/CI verdes
|
|
35
40
|
- [ ] Sem regressões
|
|
36
41
|
- [ ] <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
|
|
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
|
|
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`)
|
|
@@ -60,11 +60,14 @@ Pipeline padronizado para criacao de planos por tela. Toda tela = 1 plano. Stack
|
|
|
60
60
|
| Comando | Skill | IDE / Modelo | Funcao |
|
|
61
61
|
|---------|-------|--------------|--------|
|
|
62
62
|
| `*stack [refresh|show|drift]` | `stack-profiler` | qualquer | Mantem `docs/stack.md` (canonico do projeto) |
|
|
63
|
-
| `*plan <tela>` | `plan-blueprint` | Opus 4.7 (planejador) | Cria plano + tasks + context + atualiza `progress.txt` |
|
|
64
|
-
| `*execute-plan <PLAN-NNN>` | `execute-plan` | **Codex IDE Extension** (executor) | Executa task-a-task com visual gate vs Storybook canonico |
|
|
63
|
+
| `*plan <tela>` | `plan-blueprint` | Opus 4.7 (planejador) | Cria plano + tasks + context + atualiza `progress.txt`. Captura comportamentos (`## Interacoes & Estados`) e page-level overrides (`## Page-level overrides`). INTERACOES obrigatorio quando tela tem table-clicavel/drawer/modal/popup. |
|
|
64
|
+
| `*execute-plan <PLAN-NNN>` | `execute-plan` | **Codex IDE Extension** (executor) | Executa task-a-task com visual gate (5 dim: anatomia, tokens, variants, densidade, comportamentos) vs Storybook canonico. Pre-flight smoke compara screenshot da pagina vs Figma frame antes da T-01. Non-blocking em backend gaps. |
|
|
65
|
+
| `*validate-plan <PLAN-NNN>` | `validate-plan` | Opus 4.7 (revisor) | Valida pos-execute; auto-marca concluido tasks que passam em checklist + visual gate curto + diff |
|
|
65
66
|
| `*progress [show|set|status]` | `progress-tracker` | qualquer | Memoria L1 + state machine de status |
|
|
66
67
|
|
|
67
|
-
State machine: `pendente -> em-andamento -> validacao -> concluido` (
|
|
68
|
+
State machine: `pendente -> em-andamento -> validacao -> concluido`. Estado lateral `bloqueada-backend` (introduzido pelo `*execute-plan` quando task tem `depends_on_backend:` em aberto no ClickUp; libera quando ClickUp fecha). `concluido` marcado automaticamente pelo `*validate-plan` quando passa em checklist + visual gate curto + diff + cobertura de `interaction_target`/`override_target`.
|
|
69
|
+
|
|
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).
|
|
68
71
|
|
|
69
72
|
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.
|
|
70
73
|
|