ganbatte-os 0.2.33 → 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 +69 -4
- package/.gos/integrations/registry.json +1 -1
- package/.gos/libraries/frontend/state-persistence-patterns.md +300 -0
- package/.gos/playbooks/plan-creation-playbook.md +60 -20
- 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 +155 -39
- package/.gos/skills/execute-plan/SKILL.md +169 -0
- package/.gos/skills/plan-blueprint/SKILL.md +121 -12
- package/.gos/skills/plan-to-tasks/SKILL.md +13 -29
- package/.gos/skills/progress-tracker/SKILL.md +23 -3
- package/.gos/skills/registry.json +3 -1
- package/.gos/skills/validate-plan/SKILL.md +125 -0
- package/.gos/templates/planTemplate.md +68 -3
- package/.gos/templates/taskTemplate.md +6 -0
- package/CLAUDE.md +15 -8
- package/package.json +1 -1
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: execute-plan
|
|
3
|
+
description: Executa um plano (PLAN-NNN-<slug>) task-a-task aplicando state machine + visual gate contra Storybook canonico antes de marcar validacao. Non-blocking em backend gaps (abre tasks ClickUp + segue). Comando primario do ambiente Codex IDE.
|
|
4
|
+
argument-hint: "<PLAN-NNN-slug> [--task T-NNN-NN] [--skip-visual-gate] [--skip-clickup]"
|
|
5
|
+
allowedTools: [Read, Glob, Grep, Bash, Write, Edit, Agent, AskUserQuestion]
|
|
6
|
+
sourceDocs:
|
|
7
|
+
- templates/taskTemplate.md
|
|
8
|
+
- playbooks/plan-creation-playbook.md
|
|
9
|
+
- skills/figma-implement-design/SKILL.md
|
|
10
|
+
- skills/plan-blueprint/SKILL.md
|
|
11
|
+
use-when:
|
|
12
|
+
- executar plano ja criado por *plan
|
|
13
|
+
- rodar tasks de um PLAN-NNN com state machine e visual gate
|
|
14
|
+
- ambiente Codex IDE Extension (comando primario)
|
|
15
|
+
do-not-use-for:
|
|
16
|
+
- criar plano novo (use plan-blueprint)
|
|
17
|
+
- decompor plano em tasks (use plan-to-tasks)
|
|
18
|
+
- gerenciar progress.txt isoladamente (use progress-tracker)
|
|
19
|
+
metadata:
|
|
20
|
+
category: execution
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
Voce esta executando como **Executor de Planos** via skill `execute-plan`. No ambiente Codex IDE Extension este e o comando primario do ciclo `Opus(plan) -> Codex(execute)`.
|
|
24
|
+
|
|
25
|
+
## Input
|
|
26
|
+
|
|
27
|
+
$ARGUMENTS
|
|
28
|
+
|
|
29
|
+
Formato esperado:
|
|
30
|
+
- `<PLAN-NNN-slug>` — id do plano (ex.: `PLAN-001-pagina-projetos-inicial`)
|
|
31
|
+
- `--task T-NNN-NN` — opcional, executa apenas a task especifica
|
|
32
|
+
- `--skip-visual-gate` — opcional, pula visual gate (raro, registra warning)
|
|
33
|
+
|
|
34
|
+
## Pre-requisitos (gate)
|
|
35
|
+
|
|
36
|
+
1. Resolver paths via `.gos-local/plan-paths.json`. Se ausente, abortar e instruir o usuario a rodar `*plan` primeiro.
|
|
37
|
+
2. Localizar `<dirs.planos>/<PLAN-NNN-slug>/plan.md`. Se ausente, abortar.
|
|
38
|
+
3. Ler `plan.md` por completo: frontmatter + Componentes mapeados + Componentes ausentes + Aderencia a stack + Plano de execucao + Checklist de aceite + **Backend pendings**.
|
|
39
|
+
4. Validar `stack_ref` do frontmatter contra `<dirs.stack>` (`docs/stack.md`):
|
|
40
|
+
- Calcular sha-curto atual e comparar.
|
|
41
|
+
- Drift detectado: ABORTAR e instruir `*stack drift` + replanejar com `*stack refresh`.
|
|
42
|
+
5. Ler `<dirs.progress>` (progress.txt). Se aponta para outro plano ativo, perguntar se troca o foco antes de prosseguir.
|
|
43
|
+
6. **Backend pendings (non-blocking)**: ler tabela `## Backend pendings` do `plan.md`. Para cada linha:
|
|
44
|
+
- Sem `ClickUp ID` -> criar task via `mcp__clickup__clickup_create_task` (assignee `112010775` salvo override `ASSIGNEE` no plano, list de `clickup.backend_list_id` em `plan-paths.json`, titulo `[Backend] PLAN-NNN: <gap>`). Gravar ID retornado de volta na coluna `ClickUp ID` do `plan.md`.
|
|
45
|
+
- Com `ClickUp ID` -> consultar `mcp__clickup__clickup_get_task <ID>`. Atualizar coluna `Status`. Se ainda aberta, registrar em `progress.txt` como `blockers=<T-IDs>:<ClickUp-ID>:<gap-curto>` (uma linha por bloqueio ativo).
|
|
46
|
+
- `--skip-clickup` desliga MCP; nesse caso so registra warning visivel mantendo o que ja esta no plano.
|
|
47
|
+
- **Importante**: backend gap aberto NAO aborta o execute-plan. Tasks frontend que dependem do gap serao classificadas como `bloqueada-backend` no loop abaixo; tasks sem dependencia seguem normal.
|
|
48
|
+
|
|
49
|
+
## Pre-flight visual
|
|
50
|
+
|
|
51
|
+
(Pulado quando `--skip-visual-gate` presente — registrar warning em `tasks/T-NNN-NN.notes.md` da primeira task.)
|
|
52
|
+
|
|
53
|
+
1. Resolver `<dirs.storybook>` via `plan-paths.json`. Path absoluto fora do repo do projeto e valido (ex.: `E:\Github\Ganbatte\tmp\fractus-storybook`).
|
|
54
|
+
2. Indexar todos `.stories.tsx` disponiveis em `<dirs.stories>` ou `<dirs.components>`.
|
|
55
|
+
3. Para cada linha da tabela "Componentes mapeados" do plano:
|
|
56
|
+
- Confirmar que a coluna `Story (path)` aponta para arquivo existente.
|
|
57
|
+
- Se ausente: gerar task de criacao do componente ANTES das tasks de implementacao. Renumerar `seq` das tasks restantes.
|
|
58
|
+
4. Output do pre-flight: bloco em `progress.txt` campo `notes=` com numero de stories indexadas e tasks de criacao geradas.
|
|
59
|
+
|
|
60
|
+
## Pre-flight visual smoke (NOVO)
|
|
61
|
+
|
|
62
|
+
Antes da T-01 (depois do pre-flight de stories acima), gera comparacao visual entre pagina renderizada e frame Figma para capturar gaps grandes ANTES da execucao — evita o padrao PLAN-005 onde feedback iterativo gerou 26 rodadas no fim.
|
|
63
|
+
|
|
64
|
+
Ativacao:
|
|
65
|
+
- Storybook disponivel: usa `.stories.tsx` da pagina-completa quando existe (ex.: `ProjetosPage.stories.tsx`) e renderiza via `npm run storybook -- --static-build` ou screenshot ja gerado em CI.
|
|
66
|
+
- Playwright MCP disponivel (`mcp__plugin_playwright_playwright__*`): navega para localhost (rota da pagina + seed declarado em `## Mock strategy` ou seed nativo do projeto) e captura screenshot.
|
|
67
|
+
- Nenhum disponivel: pula com warning em `progress.txt` (`smoke=skipped: no storybook story for full page nor playwright MCP`). NAO bloqueia.
|
|
68
|
+
|
|
69
|
+
Comparacao:
|
|
70
|
+
1. Carrega frame Figma principal (`figma_url` do plano) via Figma MCP — extrai layout/secoes esperadas.
|
|
71
|
+
2. Confronta screenshot vs frame em 3 dimensoes basicas (sem refazer 4-dim por componente — isso fica no gate por task):
|
|
72
|
+
- **Secoes presentes**: KPI row, toolbar, table, drawer trigger, etc. — cada secao esperada esta no screenshot?
|
|
73
|
+
- **Layout grosseiro**: ordem vertical das secoes; colunas da table batem com Figma?
|
|
74
|
+
- **Cores/tokens primarios**: bg da pagina, accent color, contrast — sem inversao obvia.
|
|
75
|
+
3. Output: `<dirs.planos>/<PLAN-NNN-slug>/preflight-smoke.md` com lista de gaps detectados (secao faltando, layout invertido, cor errada).
|
|
76
|
+
4. Se gaps detectados: gerar tasks `T-000-XX` (prefixo `000` = pre-flight) com `priority: P0` e prepend no inicio da fila. Renumerar `seq` das tasks subsequentes.
|
|
77
|
+
|
|
78
|
+
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.
|
|
79
|
+
|
|
80
|
+
## Loop por task
|
|
81
|
+
|
|
82
|
+
Iterar tasks em ordem de `seq`. Antes de executar cada task, **classificar**:
|
|
83
|
+
|
|
84
|
+
- Ler frontmatter `depends_on_backend:` da task (campo opcional, default `[]`). Cada item referencia uma `gap-key` da tabela `## Backend pendings` do plano (ex.: `migration-20260501150000`, `endpoint-projetos-fields`).
|
|
85
|
+
- Se a task referencia gap em aberto (status no ClickUp != `concluido`/`closed`):
|
|
86
|
+
- `*progress status T-NNN-NN bloqueada-backend` (transicao livre desde `pendente` ou `em-andamento`).
|
|
87
|
+
- Anotar em `tasks/T-NNN-NN.notes.md` linha `## Bloqueada backend <iso>` com ClickUp IDs.
|
|
88
|
+
- **PULAR** task — NAO falha o loop, segue pra proxima.
|
|
89
|
+
- Se a task tem `depends_on_backend: []` ou todas as dependencias estao `concluido` no ClickUp -> seguir fluxo normal abaixo.
|
|
90
|
+
|
|
91
|
+
Para cada task **executavel**:
|
|
92
|
+
|
|
93
|
+
0. **Pre-flight da task — gate de formato**: ler `tasks/T-NNN-NN*.md`. Confirmar que tem frontmatter YAML (`head -1 == "---"`) e contém `^status:` no frontmatter. Se ausente: ABORTAR a task com erro `task-malformada: T-NNN-NN sem frontmatter status — rodar plan-to-tasks regenerador OU migrate-task-status.js`. NUNCA tentar executar codigo sem frontmatter valido — sintoma do bug onde tasks ficam travadas em `pendente`.
|
|
94
|
+
1. **Mover para em-andamento**: invocar `*progress status T-NNN-NN em-andamento` (skill `progress-tracker`). **Pos-condicao obrigatoria**: ler T-NNN-NN.md de novo e confirmar `^status: em-andamento$` no frontmatter. Se nao mudou: ABORTAR e instruir humano. NAO seguir para implementacao com status pendente — esse e o bug central reportado.
|
|
95
|
+
2. **Despachar agent**: ler `labels: [agent:<slug>]` da task. Default: `dev`. Invocar via Agent tool com prompt completo (objetivo, plano de execucao, DoD, paths relevantes).
|
|
96
|
+
3. **Implementacao**: agent edita arquivos seguindo o plano de execucao da task. Stack como contrato — nada fora de `docs/stack.md` salvo se `arch_change=true` no frontmatter do plano pai.
|
|
97
|
+
4. **Visual gate** (antes de propor `validacao`):
|
|
98
|
+
|
|
99
|
+
Para cada componente alterado/criado pela task:
|
|
100
|
+
|
|
101
|
+
a) Localizar `<Componente>.stories.tsx` em `<dirs.storybook>`.
|
|
102
|
+
b) Comparar implementacao vs story canonica em 5 dimensoes textuais:
|
|
103
|
+
- **Anatomia**: ordem de slots/elementos (header -> corpo -> footer; icones esquerda/direita; campos do form na ordem do design).
|
|
104
|
+
- **Tokens**: classes Tailwind/variaveis CSS batem com DS (cor, raio, espacamento, tipografia). Quando o componente aparece em `## Page-level overrides` do plano: a divergencia cosmetica registrada NAO falha o gate — o gate confirma que o override foi APLICADO conforme decisao (a/b/c).
|
|
105
|
+
- **Variants**: props expostos cobrem variants da story. Decisao (b) em `## Page-level overrides`: confirmar que a nova variant existe na story canonica.
|
|
106
|
+
- **Densidade**: padding/gap dentro de +-1 step da escala do DS (ou conforme override registrado).
|
|
107
|
+
- **Comportamentos** (NOVO, heuristico via JSX + grep, sem E2E):
|
|
108
|
+
- Para cada `interaction_target:` declarado no frontmatter da task: existe handler implementado no diff? (ex.: `row.onClick` chamando `openDrawer`; `button.onClick` chamando mutation; `form.onSubmit` chamando server action).
|
|
109
|
+
- Estados visuais (skeleton/empty/error/loading) declarados em `## Interações & Estados` renderizam? grep por `isLoading|isPending|isError|empty|skeleton` nos arquivos tocados.
|
|
110
|
+
- Refetch apos mutation: `invalidateQueries` / `router.refresh` / `setState` observavel no diff?
|
|
111
|
+
- Para cada `override_target:` declarado: classes/props da decisao (a/b/c) presentes no diff? grep das classes declaradas em `## Page-level overrides`.
|
|
112
|
+
c) Para a tela como um todo: invocar Figma MCP no `figma_url` do plano e cruzar com o JSX renderizado em arvore (mesmo numero de secoes, mesma hierarquia, mesmas labels).
|
|
113
|
+
d) Output: relatorio curto em `tasks/T-NNN-NN.notes.md` (5 secoes: anatomia, tokens, variants, densidade, comportamentos + secao "Arvore vs Figma").
|
|
114
|
+
e) Divergencia >= 1 item critico (anatomia, tokens nao-overrideados, ou comportamento mapeado sem implementacao) -> falha o gate.
|
|
115
|
+
|
|
116
|
+
5. **Resultado do gate**:
|
|
117
|
+
- Sucesso -> invocar `*progress status T-NNN-NN validacao`. **Pos-condicao obrigatoria**: ler T-NNN-NN.md, confirmar `^status: validacao$` no frontmatter. Se nao mudou: ABORTAR a task com erro `progress-tracker-falhou: T-NNN-NN`. Preparar arquivos staged (sem commit) somente apos confirmacao.
|
|
118
|
+
- Falha -> manter em `em-andamento`, gravar diff em `T-NNN-NN.notes.md`, retornar pra etapa 3.
|
|
119
|
+
|
|
120
|
+
**Invariante por task**: ao terminar a iteracao, T-NNN-NN.md DEVE ter status diferente de `pendente`. Se ainda for `pendente` apos a iteracao, registrar como bug do executor em `progress.txt` (`notes=executor-skipped-progress: T-NNN-NN`) e abortar o loop — sintoma do bug original.
|
|
121
|
+
|
|
122
|
+
## Fechamento
|
|
123
|
+
|
|
124
|
+
Quando o loop terminar (todas as tasks executaveis em `validacao` ou puladas em `bloqueada-backend`):
|
|
125
|
+
|
|
126
|
+
1. Listar arquivos modificados via `git diff --name-only`.
|
|
127
|
+
2. Preparar commit (NAO push). Mensagem segue Conventional Commits + referencia ao `PLAN-NNN-slug`. Se houve tasks bloqueadas, citar na mensagem (ex.: `feat(checkout): PLAN-042 T-01..T-05 (T-06,T-07 bloqueadas backend CU-XXX)`).
|
|
128
|
+
3. Resumo final ao usuario em 4 blocos:
|
|
129
|
+
```
|
|
130
|
+
[execute-plan] PLAN-NNN-<slug>
|
|
131
|
+
|
|
132
|
+
tasks validacao: <N> (T-..., T-...)
|
|
133
|
+
bloqueada-backend: <K> (T-...:CU-..., ...)
|
|
134
|
+
backend pendings: <X> abertas no ClickUp / <Y> concluidas
|
|
135
|
+
visual gate: passou / falhou em (T-...)
|
|
136
|
+
|
|
137
|
+
proximo passo: *validate-plan PLAN-NNN-<slug>
|
|
138
|
+
```
|
|
139
|
+
4. Indicar que o turn seguinte e `*validate-plan PLAN-NNN-<slug>` (skill `validate-plan`, ambiente Opus 4.7). NAO marcar `concluido` automaticamente — `validate-plan` cuida disso.
|
|
140
|
+
|
|
141
|
+
## Ambiente Codex IDE — observacoes
|
|
142
|
+
|
|
143
|
+
- O usuario invoca `*execute-plan` direto no Codex. A skill carrega via wrapper em `.codex/skills/gos-execute-plan/SKILL.md`.
|
|
144
|
+
- Toda chamada a outros agents/skills do G-OS dentro do execute-plan deve usar o adapter Codex correspondente (`.codex/agents/`, `.codex/commands/`).
|
|
145
|
+
- Se a chamada cair pra outro adapter (Claude/Qwen/etc) a sessao quebra — abortar com mensagem clara.
|
|
146
|
+
|
|
147
|
+
## Regras criticas
|
|
148
|
+
|
|
149
|
+
- **Visual gate nao e opcional** salvo `--skip-visual-gate` explicito. Skill nao silencia o gate.
|
|
150
|
+
- **Sem push automatico**: commit fica preparado. Push e responsabilidade do humano.
|
|
151
|
+
- **State machine inviolavel**: transicao `concluido` ocorre via `*validate-plan` (auto-marca quando passa). Rollback humano: `*progress status T-NNN-NN pendente --rollback`.
|
|
152
|
+
- **Non-blocking em backend gaps**: gap aberto no ClickUp NAO aborta. Tasks dependentes viram `bloqueada-backend`, demais seguem.
|
|
153
|
+
- **Storybook como contrato base; Figma da pagina vence em conflito cosmetico**: componente sem `.stories.tsx` em `<dirs.storybook>` bloqueia a task ate ser criado. Divergencia cosmetica entre story e Figma da pagina que ESTA registrada em `## Page-level overrides` do plano: gate confirma aplicacao do override (decisao a/b/c). Divergencia NAO registrada no plano: gate falha — voltar pra `*plan` (ou registrar override no plan.md antes de prosseguir).
|
|
154
|
+
- **Comportamento mapeado e vinculante**: `interaction_target:` declarado na task DEVE ter handler/estado implementado e observavel no diff. Caso contrario, gate falha mesmo se anatomia + tokens passarem.
|
|
155
|
+
|
|
156
|
+
## Model guidance
|
|
157
|
+
|
|
158
|
+
| Escopo | Modelo |
|
|
159
|
+
|--------|--------|
|
|
160
|
+
| Task simples (1 componente, sem novo padrao) | `sonnet` |
|
|
161
|
+
| Task que toca multiplos componentes ou logica de fetching | `opus` |
|
|
162
|
+
| Visual gate / comparacao com Figma | inherit (modelo do agent) |
|
|
163
|
+
|
|
164
|
+
## Instructions
|
|
165
|
+
|
|
166
|
+
1. NUNCA pular o pre-flight visual sem flag explicita.
|
|
167
|
+
2. Resolver TODOS os paths via `plan-paths.json`.
|
|
168
|
+
3. Visual gate produz relatorio em `T-NNN-NN.notes.md` mesmo em caso de sucesso.
|
|
169
|
+
4. Status final esperado: todas as tasks em `validacao`, commit preparado, humano notificado.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: plan-blueprint
|
|
3
3
|
description: Cria um plano padronizado para uma tela (1 plano = 1 tela) seguindo a stack-of-record do projeto. Produz {plano, tasks, contexto, entrada-progress.txt} em três fases (Mapeamento → Aderência à stack → Execução). Pré-requisito duro: docs/stack.md existir. Subdivide automaticamente telas com seções autônomas múltiplas.
|
|
4
|
-
argument-hint: "<tela|
|
|
4
|
+
argument-hint: "<tela> OBJETIVO=<implantacao|correcao|refactor> FIGMA=<url> [FIGMA+=...] [--from-figma-mcp] [--allow-arch-change] [--skip-clickup]"
|
|
5
5
|
allowedTools: [Read, Glob, Grep, Bash, Write, Edit, Agent, AskUserQuestion]
|
|
6
6
|
sourceDocs:
|
|
7
7
|
- templates/planTemplate.md
|
|
@@ -21,18 +21,52 @@ 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
|
|
27
39
|
|
|
28
|
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
40
|
+
Campos obrigatórios no prompt:
|
|
41
|
+
- `OBJETIVO` — `implantacao` | `correcao` | `refactor`
|
|
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.
|
|
44
|
+
|
|
45
|
+
Opcionais:
|
|
46
|
+
- `FIGMA+` — lista de URLs de componentes
|
|
47
|
+
- `NOTAS` — prosa livre (invioláveis, edge cases, contexto adicional)
|
|
48
|
+
- `ASSIGNEE` — override do user_id ClickUp para tasks de backend (default: 112010775)
|
|
49
|
+
|
|
50
|
+
Auto-resolvido pelo `gos-master` (comprehension gate, NÃO pedir ao usuário):
|
|
51
|
+
- `PROJETO` — `cwd`; ambíguo → `~/.claude/.gos-state/last-project.json`
|
|
52
|
+
- `WORK_BRANCH` — tela em Storybook → `feat/storybook`; senão → `dev`
|
|
53
|
+
- `STORYBOOK_DIR/BRANCH` — `plan-paths.json`
|
|
54
|
+
- `BUSINESS_RULES` — `<PROJETO>/docs/regras-de-negocio/` (indexar e registrar em progress.txt)
|
|
55
|
+
- `POSTMAN` — `<PROJETO>/docs/postman/` (idem)
|
|
56
|
+
- `BACKEND/RLS/SEED/SMOKE_E2E` — derivado de `stack.md` + regras + Postman
|
|
57
|
+
|
|
58
|
+
OBJETIVO muda postura:
|
|
59
|
+
|
|
60
|
+
| Valor | Comportamento |
|
|
61
|
+
|-------|---------------|
|
|
62
|
+
| `implantacao` | Cria do zero — Fase 1 → 2 → 3 padrão |
|
|
63
|
+
| `correcao` | Modo cirúrgico — diff vs Storybook canônico, 1 task por componente, sem reescrever |
|
|
64
|
+
| `refactor` | Implica `--allow-arch-change` + ADR obrigatória |
|
|
32
65
|
|
|
33
66
|
Flags:
|
|
34
|
-
- `--from-figma-mcp` — força leitura via Figma MCP
|
|
35
|
-
- `--allow-arch-change` — libera Fase 2 propositiva (gera ADR)
|
|
67
|
+
- `--from-figma-mcp` — força leitura via Figma MCP (default quando `FIGMA=` é Figma URL)
|
|
68
|
+
- `--allow-arch-change` — libera Fase 2 propositiva (gera ADR); implícito em `OBJETIVO=refactor`
|
|
69
|
+
- `--skip-clickup` — não cria tasks de backend automaticamente
|
|
36
70
|
|
|
37
71
|
## Pré-requisitos (gate)
|
|
38
72
|
|
|
@@ -41,6 +75,9 @@ Flags:
|
|
|
41
75
|
- Se ausente: ABORTAR. Despachar `stack-profiler refresh` e instruir o usuário a re-executar.
|
|
42
76
|
- Se presente: ler integralmente. Verificar drift via `*stack drift` antes de prosseguir.
|
|
43
77
|
3. Ler `progress.txt` se existir (memória L1).
|
|
78
|
+
4. **Verificar `dirs.storybook`** (caminho do `plan-paths.json`):
|
|
79
|
+
- Se ausente OU diretório não existe: ABORTAR. Pedir caminho ao usuário (path absoluto fora do repo é válido, ex.: `E:\Github\Ganbatte\tmp\fractus-storybook`) e gravar em `plan-paths.json`.
|
|
80
|
+
- Se presente: indexar `.stories.tsx` disponíveis (lista usada na Fase 1.3).
|
|
44
81
|
|
|
45
82
|
## Fase 1 — Mapeamento Visual & Componentização
|
|
46
83
|
|
|
@@ -60,11 +97,37 @@ Caso contrário: trabalhar pela descrição/screenshot fornecido.
|
|
|
60
97
|
|
|
61
98
|
Produzir tabela:
|
|
62
99
|
|
|
63
|
-
| Elemento (Figma/descrição) | Componente do DS | Variant | Props relevantes |
|
|
64
|
-
|
|
100
|
+
| Elemento (Figma/descrição) | Componente do DS | Story (path) | Variant | Props relevantes | Comportamento |
|
|
101
|
+
|----------------------------|------------------|--------------|---------|-------------------|---------------|
|
|
102
|
+
|
|
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.
|
|
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).
|
|
65
106
|
|
|
66
107
|
Listar **componentes ausentes** separadamente — sinalizar como bloqueio ou candidato a criação (vai virar task própria).
|
|
67
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
|
+
|
|
68
131
|
## Fase 2 — Aderência à Stack
|
|
69
132
|
|
|
70
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:
|
|
@@ -77,6 +140,22 @@ Saída desta fase é uma seção **"Aderência à Stack"** no plano — não red
|
|
|
77
140
|
|
|
78
141
|
**Modo `--allow-arch-change`**: pode propor alteração. Gerar ADR em `dirs.adr` (template `templates/adr-tmpl.yaml`) ANTES de prosseguir. Plano referencia o ADR e marca `arch_change: true` no frontmatter.
|
|
79
142
|
|
|
143
|
+
### 2.5 Backend gaps → ClickUp automático
|
|
144
|
+
|
|
145
|
+
Postman é o **contrato backend**. Para cada dado/ação da tela:
|
|
146
|
+
|
|
147
|
+
1. Confrontar com `<PROJETO>/docs/postman/` (já indexado no comprehension gate).
|
|
148
|
+
2. Se o endpoint não existir, ou existir com shape divergente, ou faltar RLS/migration para suportar a tela → registrar como **backend pending**.
|
|
149
|
+
3. Para cada pending, criar task ClickUp via `mcp__clickup__clickup_create_task`:
|
|
150
|
+
- **Assignee**: `ASSIGNEE` do prompt OU default `112010775` (Douglas Oliveira).
|
|
151
|
+
- **List**: `clickup.backend_list_id` de `plan-paths.json`. Ausente → registrar pending no plano com `clickup: pending` e seguir.
|
|
152
|
+
- **Título**: `[Backend] PLAN-NNN: <gap em uma linha>`
|
|
153
|
+
- **Descrição**: o que a tela precisa, qual coleção/endpoint do Postman cobre (ou não), referência ao plano (`docs/plans/PLAN-NNN/plan.md`), shape esperado.
|
|
154
|
+
4. Registrar IDs criados em:
|
|
155
|
+
- `plan.md` → seção `## Backend pendings` (lista com `clickup_id`, status, link).
|
|
156
|
+
- `progress.txt` → bloco `## Backend pendings — PLAN-NNN`.
|
|
157
|
+
5. Flag `--skip-clickup` desliga a criação (pending fica registrado apenas no plano).
|
|
158
|
+
|
|
80
159
|
## Fase 3 — Plano de Execução
|
|
81
160
|
|
|
82
161
|
Para cada elemento mapeado:
|
|
@@ -86,6 +165,12 @@ Para cada elemento mapeado:
|
|
|
86
165
|
3. Montagem da view (composição dos componentes do DS)
|
|
87
166
|
4. Estado e interatividade (client components estritamente onde necessário)
|
|
88
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
|
+
|
|
89
174
|
## Subdivisão automática
|
|
90
175
|
|
|
91
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:
|
|
@@ -97,13 +182,34 @@ Frontmatter linka via `parent_plan` / `children_plans`.
|
|
|
97
182
|
|
|
98
183
|
## Saída
|
|
99
184
|
|
|
100
|
-
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).
|
|
101
186
|
|
|
102
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.
|
|
103
188
|
2. `<dirs.planos>/PLAN-NNN-<slug>/context.md` — gerado a partir de `templates/contextTemplate.md`. Denso, indexado.
|
|
104
|
-
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).
|
|
105
190
|
4. Disparar `progress-tracker set-current` apontando o plano novo → atualiza `progress.txt`.
|
|
106
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
|
+
|
|
107
213
|
Resumo final:
|
|
108
214
|
|
|
109
215
|
```
|
|
@@ -127,6 +233,8 @@ Próximos passos:
|
|
|
127
233
|
- **Backend read-only respeitado**: se `stack.md` declara backend read-only, plano NUNCA propõe schema novo.
|
|
128
234
|
- **Next.js App Router**: decisão server vs client é explícita por elemento.
|
|
129
235
|
- **Sem prosa decorativa**: plano deve ser executável, denso, com critérios mensuráveis.
|
|
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.
|
|
130
238
|
|
|
131
239
|
## Model guidance
|
|
132
240
|
|
|
@@ -139,6 +247,7 @@ Próximos passos:
|
|
|
139
247
|
## Instructions
|
|
140
248
|
|
|
141
249
|
1. NUNCA prosseguir sem `stack.md` válido.
|
|
142
|
-
2. Resolver TODOS os paths via `plan-paths.json`.
|
|
250
|
+
2. Resolver TODOS os paths via `plan-paths.json`. PROJETO/WORK_BRANCH são auto-resolvidos pelo `gos-master` — não perguntar ao usuário.
|
|
143
251
|
3. Status inicial do plano e tasks: `pendente`.
|
|
144
252
|
4. Não pushar nada — apenas escrever arquivos locais.
|
|
253
|
+
5. Backend pendings só criam tasks ClickUp se o `mcp__clickup__*` estiver disponível na sessão E `--skip-clickup` não for passado. Caso contrário, registrar apenas no plano.
|
|
@@ -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
|
|
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
{ "slug": "slack-review", "path": "skills/slack-review/SKILL.md" },
|
|
23
23
|
{ "slug": "stack-profiler", "path": "skills/stack-profiler/SKILL.md" },
|
|
24
24
|
{ "slug": "plan-blueprint", "path": "skills/plan-blueprint/SKILL.md" },
|
|
25
|
-
{ "slug": "progress-tracker", "path": "skills/progress-tracker/SKILL.md" }
|
|
25
|
+
{ "slug": "progress-tracker", "path": "skills/progress-tracker/SKILL.md" },
|
|
26
|
+
{ "slug": "execute-plan", "path": "skills/execute-plan/SKILL.md" },
|
|
27
|
+
{ "slug": "validate-plan", "path": "skills/validate-plan/SKILL.md" }
|
|
26
28
|
]
|
|
27
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).
|