@tavaressan/vetor 0.1.0
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/README.md +42 -0
- package/bin/vetor.js +6 -0
- package/lib/banner.js +35 -0
- package/lib/commands/install.js +71 -0
- package/lib/commands/status.js +59 -0
- package/lib/commands/uninstall.js +119 -0
- package/lib/commands/update.js +63 -0
- package/lib/installer/command-exists.js +30 -0
- package/lib/installer/cursor-hooks.js +181 -0
- package/lib/installer/detector.js +79 -0
- package/lib/installer/manifest.js +76 -0
- package/lib/installer/prompts.js +97 -0
- package/lib/installer/writer.js +382 -0
- package/lib/router.js +50 -0
- package/package.json +39 -0
- package/templates/.gitkeep +0 -0
- package/templates/agents/code-review/agent.json +27 -0
- package/templates/agents/code-review/codex.toml +37 -0
- package/templates/agents/code-review.md +99 -0
- package/templates/agents/issue-worker/agent.json +33 -0
- package/templates/agents/issue-worker/codex.toml +57 -0
- package/templates/agents/issue-worker.md +112 -0
- package/templates/hooks/hooks-codex.json +48 -0
- package/templates/hooks/hooks.json +62 -0
- package/templates/opencode/agent/code-review.md +73 -0
- package/templates/opencode/agent/issue-coordinator.md +521 -0
- package/templates/opencode/agent/issue-worker.md +64 -0
- package/templates/opencode/mcp.jsonc +39 -0
- package/templates/opencode/plugin/vetor.ts +207 -0
- package/templates/opencode/scripts/agent-registration_test.ts +92 -0
- package/templates/opencode/scripts/check-edit.ts +147 -0
- package/templates/opencode/scripts/ensure-external-directory-permission.ts +110 -0
- package/templates/opencode/scripts/ensure-external-directory-permission_test.ts +142 -0
- package/templates/opencode/scripts/lib/guard.ts +45 -0
- package/templates/opencode/scripts/lib/model-health.ts +133 -0
- package/templates/opencode/scripts/lib/model-health_test.ts +181 -0
- package/templates/opencode/scripts/lib/project.ts +240 -0
- package/templates/opencode/scripts/lib/project_test.ts +45 -0
- package/templates/opencode/scripts/lib/status.ts +69 -0
- package/templates/opencode/scripts/lib/worktree.ts +41 -0
- package/templates/opencode/scripts/model-health.ts +50 -0
- package/templates/opencode/scripts/model-health_test.ts +80 -0
- package/templates/opencode/scripts/resolve-model.ts +112 -0
- package/templates/opencode/scripts/resolve-model_test.ts +185 -0
- package/templates/opencode/scripts/safety-check.ts +203 -0
- package/templates/opencode/scripts/vetor-checks.sh +217 -0
- package/templates/opencode/scripts/vetor-status.sh +99 -0
- package/templates/skills/architecture-review/SKILL.md +187 -0
- package/templates/skills/backlog-ideator/SKILL.md +277 -0
- package/templates/skills/design/SKILL.md +468 -0
- package/templates/skills/design/examples/design-contract-example.md +46 -0
- package/templates/skills/design/examples/prototype-handoff-example.md +142 -0
- package/templates/skills/fix-loop-agent/SKILL.md +255 -0
- package/templates/skills/guardian/SKILL.md +343 -0
- package/templates/skills/issue-coordinator/SKILL.md +596 -0
- package/templates/skills/retro/SKILL.md +156 -0
- package/templates/skills/shared/references/agent-status.template.md +68 -0
- package/templates/skills/shared/references/codebase-design-vocabulary.md +54 -0
- package/templates/skills/shared/references/conflict-resolution.md +94 -0
- package/templates/skills/shared/references/delegate-to-runtime.md +239 -0
- package/templates/skills/shared/references/design-vocabulary.md +508 -0
- package/templates/skills/shared/references/evidence-state.md +365 -0
- package/templates/skills/shared/references/frontend-design-enforcement.md +33 -0
- package/templates/skills/shared/references/grilling-conventions.md +64 -0
- package/templates/skills/shared/references/knowledge-provider-contract.md +150 -0
- package/templates/skills/shared/references/mcp-availability.md +104 -0
- package/templates/skills/shared/references/module-test-map.template.md +72 -0
- package/templates/skills/shared/references/planning-conventions.md +97 -0
- package/templates/skills/shared/references/project-conventions.md +63 -0
- package/templates/skills/shared/references/tdd-conventions.md +81 -0
- package/templates/skills/shared/references/touched-files-cache.md +30 -0
- package/templates/skills/spec/SKILL.md +524 -0
- package/templates/skills/spec-validate/SKILL.md +195 -0
- package/templates/skills/spec-validate/references/traceability.md +169 -0
- package/templates/skills/stack-practices/SKILL.md +151 -0
- package/templates/skills/vetor/SKILL.md +174 -0
- package/templates/skills/worktree-create/SKILL.md +142 -0
- package/templates/skills/worktree-ship/SKILL.md +394 -0
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design
|
|
3
|
+
description: Skill de design do Vetor — (1) detecta o modo de operação (Prototype-first/System-first/Vetor-first #213), importa um Design System existente sem duplicá-lo e mantém a Design Direction persistente em .vetor/design/; (2) Handoff de protótipo para Design Contract, com estados de interface além do happy path (#229); (3) Frontend Self-Correction Loop (Design Contract → Build → Run → Inspect → Screenshot → Accessibility Snapshot → Critique → Fix → Verify → Done) com Visual Critique em 10 dimensões e degradação graciosa sem MCP de browser. Consumida por issue-worker/fix-loop-agent ao implementar ou corrigir UI de frontend.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Claude Code
|
|
6
|
+
metadata:
|
|
7
|
+
author: vitortavares
|
|
8
|
+
version: "1.2.0"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Você é a skill de design do Vetor. Cobre três responsabilidades sequenciais do fluxo de frontend
|
|
12
|
+
(#213):
|
|
13
|
+
|
|
14
|
+
1. **Setup** — detectar quais fontes de design já existem no projeto-alvo (protótipo, Design System,
|
|
15
|
+
ou nenhum dos dois) e adaptar o processo: importar/referenciar o Design System existente (nunca
|
|
16
|
+
duplicá-lo) e manter uma Design Direction persistente e específica do produto (#228).
|
|
17
|
+
2. **Handoff** — quando o modo é Prototype-first, extrair do protótipo estrutura de telas,
|
|
18
|
+
hierarquia, componentes, tokens observáveis, conteúdo, interações, estados e responsividade, e
|
|
19
|
+
transformar isso em um Design Contract (#227) que preserva
|
|
20
|
+
`prototype intent + dados reais +
|
|
21
|
+
estados reais + restrições técnicas reais` — nunca uma cópia
|
|
22
|
+
de pixels (#229).
|
|
23
|
+
3. **Loop** — depois que uma implementação de UI compila e roda, levá-la do Design Contract até um
|
|
24
|
+
estado verificado: corrigindo sozinha o que é objetivo e reversível, escalando ao usuário o que é
|
|
25
|
+
decisão de produto/design (#230).
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Sintaxe
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
/vetor:design [<diretório>]
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
- `<diretório>`: opcional — raiz do projeto a varrer para o Setup (modo de operação + import).
|
|
36
|
+
Default: raiz do projeto atual (`.`).
|
|
37
|
+
|
|
38
|
+
O Loop (self-correction) não é tipicamente invocado por um comando de usuário — é consumido por
|
|
39
|
+
`issue-worker`/`fix-loop-agent` (via `frontend-design-enforcement.md`) depois que a implementação de
|
|
40
|
+
uma tela/fluxo de UI compila e roda. Também pode ser invocado manualmente com
|
|
41
|
+
`Skill({skill: "vetor:design"})` para verificar uma tela de frontend já implementada.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Referências
|
|
46
|
+
|
|
47
|
+
> Paths relativos abaixo resolvem a partir do diretório desta própria skill (informado ao carregar,
|
|
48
|
+
> ex. "Base directory for this skill: ..."), não do `cwd` de execução. Em comandos `bash`/`deno run`,
|
|
49
|
+
> prefixe o path absoluto desse diretório ao caminho relativo antes de executar — defina uma vez:
|
|
50
|
+
> ```bash
|
|
51
|
+
> SKILL_DIR="<path absoluto informado como 'Base directory for this skill' no carregamento>"
|
|
52
|
+
> ```
|
|
53
|
+
> e use `"$SKILL_DIR/../../scripts/..."` em todo comando abaixo, nunca o path relativo isolado.
|
|
54
|
+
|
|
55
|
+
- `../shared/references/design-vocabulary.md` — Design System, Design
|
|
56
|
+
Direction, Design Signature e o formato do Design Contract (entrada do Loop, passo 1). Não
|
|
57
|
+
replique as definições aqui — cite os campos. §4.4 aplica os 4 estados de Evidence State às
|
|
58
|
+
Decisões do Design Contract — exemplo completo em
|
|
59
|
+
`skills/design/examples/design-contract-example.md`. §6 documenta a árvore completa de artefatos
|
|
60
|
+
em `.vetor/design/`; §7 o conflito Specification × Design Contract (#231); §8 os pontos de
|
|
61
|
+
extensão futuros — Design Drift, Visual Debt, integração com Guardian (#231, não implementados
|
|
62
|
+
nesta issue).
|
|
63
|
+
- `../shared/references/evidence-state.md` — `OPEN_QUESTION` usado em
|
|
64
|
+
`patterns.md` (Setup, passo 2) quando um padrão de interação não é detectável por varredura de
|
|
65
|
+
filesystem.
|
|
66
|
+
- `../shared/references/frontend-design-enforcement.md` — direção
|
|
67
|
+
estética/tipográfica via skill nativa `frontend-design`, aplicada **antes** de escrever o código.
|
|
68
|
+
O Loop é complementar e roda **depois**: verifica o que foi construído, não decide como desenhar.
|
|
69
|
+
- `../shared/references/mcp-availability.md` — mecanismo de checagem de
|
|
70
|
+
disponibilidade (procurar `mcp__<server>__` na lista de ferramentas). Servidores relevantes aqui:
|
|
71
|
+
browser (`mcp__chrome-devtools__`, `mcp__playwright__`) para os passos 4-6 e 9 do Loop, Context7
|
|
72
|
+
para qualquer comportamento de framework/lib consultado durante o Fix (Loop, passo 8).
|
|
73
|
+
- `scripts/lib/design-mode.ts` — lógica de detecção/renderização do Setup (pura, testada em
|
|
74
|
+
`scripts/tests/design-mode_test.ts`).
|
|
75
|
+
- `scripts/detect-design-mode.ts` — CLI que orquestra a escrita em disco do Setup a partir da lib
|
|
76
|
+
acima.
|
|
77
|
+
- `scripts/lib/design-handoff.ts` — renderiza o Design Contract a partir da extração estruturada do
|
|
78
|
+
protótipo (pura, testada em `scripts/tests/design-handoff_test.ts`). Ver Handoff, abaixo.
|
|
79
|
+
- `scripts/handoff-prototype.ts` — CLI que lê a extração (JSON) e grava o Design Contract em
|
|
80
|
+
`.vetor/design/handoff/` via a lib acima.
|
|
81
|
+
- `scripts/lib/design-loop-mcp.ts` — `detectBrowserMcpServer`/`reportLoopStep`: formaliza o relato
|
|
82
|
+
de cada passo do Loop dependente de MCP de browser quando ele não está disponível, para nunca
|
|
83
|
+
pular uma etapa em silêncio nem fingir que a inspeção ocorreu (ver Loop §"Sem MCP de browser").
|
|
84
|
+
- `scripts/lib/spec-design-conflict.ts` — `detectFieldConflict`/`detectPrimaryActionConflict`:
|
|
85
|
+
compara um valor de decisão já extraído do Design Contract e da Specification e relata a
|
|
86
|
+
divergência sem escolher um lado (design-vocabulary.md §7). Usado no Loop, passo 1 (abaixo) e
|
|
87
|
+
passo 8.
|
|
88
|
+
- `../shared/references/tdd-conventions.md` — disciplina de teste aplicada
|
|
89
|
+
ao Fix (Loop, passo 8): reproduza o problema objetivo antes de corrigi-lo, quando o módulo tiver
|
|
90
|
+
suíte.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Artefatos
|
|
95
|
+
|
|
96
|
+
Toda a árvore gravada em `.vetor/design/` — `system/`, `direction/`, `prototype/`, `handoff/` — está
|
|
97
|
+
documentada em `design-vocabulary.md` §6. Resumo:
|
|
98
|
+
|
|
99
|
+
```text
|
|
100
|
+
.vetor/
|
|
101
|
+
└── design/
|
|
102
|
+
├── system/ ← Setup, passo 2 (abaixo)
|
|
103
|
+
├── direction/ ← Setup, passo 3 (abaixo)
|
|
104
|
+
├── prototype/ ← origem observada pelo agente (Handoff, passo 1)
|
|
105
|
+
└── handoff/ ← Design Contract gerado (Handoff, passo 4)
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Setup — Modo de operação, Design System Import, Design Direction
|
|
111
|
+
|
|
112
|
+
### 1 — Detectar o modo de operação
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
deno run -A "$SKILL_DIR/../../scripts/detect-design-mode.ts" <diretório>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Saída JSON: `mode`, `hasPrototype`, `evidence`, `written`, `skipped`.
|
|
119
|
+
|
|
120
|
+
Modos, nesta ordem de prioridade (ver #213 "Modos de operação"):
|
|
121
|
+
|
|
122
|
+
1. **Prototype-first** — existe `.vetor/design/prototype/`. Prossiga para a seção Handoff, abaixo,
|
|
123
|
+
para transformar o protótipo em Design Contract.
|
|
124
|
+
2. **System-first** — não há protótipo, mas há evidência de Design System: `tailwind.config.*`,
|
|
125
|
+
`tokens.*`, `components/`/`ui/` (raiz ou `src/`), `.storybook/`, ou dependência de design em
|
|
126
|
+
`package.json` (`tailwindcss`, `styled-components`, `@mui/material`, `@chakra-ui/react`,
|
|
127
|
+
`@storybook/react`, `@emotion/styled`).
|
|
128
|
+
3. **Vetor-first** — nenhuma das fontes acima. A Design Direction (passo 3) é a única fonte visual
|
|
129
|
+
disponível além da Specification.
|
|
130
|
+
|
|
131
|
+
Reporte o modo detectado e a evidência encontrada antes de prosseguir para os passos seguintes.
|
|
132
|
+
|
|
133
|
+
### 2 — Design System Import (quando há evidência)
|
|
134
|
+
|
|
135
|
+
Quando `evidence` não está vazio, o script do passo 1 já escreveu (ou já existiam — ver `skipped`)
|
|
136
|
+
|
|
137
|
+
```text
|
|
138
|
+
.vetor/
|
|
139
|
+
└── design/
|
|
140
|
+
└── system/
|
|
141
|
+
├── tokens.md
|
|
142
|
+
├── components.md
|
|
143
|
+
├── patterns.md
|
|
144
|
+
└── evidence.md
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Cada arquivo:
|
|
148
|
+
|
|
149
|
+
- referencia a fonte original via frontmatter `source`/`version`/`authority: project` — **nunca
|
|
150
|
+
copia** valores de token, cor, tipografia, espaçamento, radius, elevation ou motion;
|
|
151
|
+
- é criado **uma única vez**: uma segunda execução nunca sobrescreve um arquivo já existente — a
|
|
152
|
+
representação em `.vetor/` é "criada/atualizável" manualmente, não regenerada a cada varredura.
|
|
153
|
+
|
|
154
|
+
`patterns.md` nunca é preenchido com um padrão de interação inferido de forma especulativa — padrões
|
|
155
|
+
de interação (ex.: "ações destrutivas sempre pedem confirmação") não são deriváveis de uma varredura
|
|
156
|
+
de arquivos, então o arquivo registra um `OPEN_QUESTION` (ver `evidence-state.md`) em vez de um
|
|
157
|
+
default plausível.
|
|
158
|
+
|
|
159
|
+
Se `skipped` incluir algum desses arquivos, reporte que já existiam e não foram tocados.
|
|
160
|
+
|
|
161
|
+
### 3 — Design Direction persistente
|
|
162
|
+
|
|
163
|
+
O mesmo script garante `.vetor/design/direction/product.md`, com o esqueleto:
|
|
164
|
+
|
|
165
|
+
```markdown
|
|
166
|
+
# Design Direction
|
|
167
|
+
|
|
168
|
+
## Product
|
|
169
|
+
|
|
170
|
+
## Audience
|
|
171
|
+
|
|
172
|
+
## Primary job
|
|
173
|
+
|
|
174
|
+
## Visual personality
|
|
175
|
+
|
|
176
|
+
## Density
|
|
177
|
+
|
|
178
|
+
## Typography
|
|
179
|
+
|
|
180
|
+
## Palette
|
|
181
|
+
|
|
182
|
+
## Layout
|
|
183
|
+
|
|
184
|
+
## Design Signature
|
|
185
|
+
|
|
186
|
+
## Motion
|
|
187
|
+
|
|
188
|
+
## Avoid
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Ao preencher o esqueleto (seja você preenchendo agora, seja orientando o usuário a preencher),
|
|
192
|
+
aplique a regra central:
|
|
193
|
+
|
|
194
|
+
```text
|
|
195
|
+
DEFAULT ≠ FORBIDDEN
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Um padrão comum continua permitido quando há justificativa funcional ou estética derivada do
|
|
199
|
+
produto, conteúdo ou interação (ver `design-vocabulary.md` §2). Nunca transforme "isso é comum em
|
|
200
|
+
interfaces genéricas geradas por IA" em "isso está proibido aqui" sem essa justificativa — a seção
|
|
201
|
+
`Avoid` documenta o que evitar **e por quê**, não uma lista de proibições universais.
|
|
202
|
+
|
|
203
|
+
Assim como os arquivos do passo 2, `product.md` é criado uma única vez — execuções seguintes
|
|
204
|
+
preservam qualquer edição feita nele.
|
|
205
|
+
|
|
206
|
+
### 4 — Reportar
|
|
207
|
+
|
|
208
|
+
Resuma ao final:
|
|
209
|
+
|
|
210
|
+
- modo detectado (Prototype-first/System-first/Vetor-first) e a evidência que sustentou a decisão;
|
|
211
|
+
- arquivos criados nesta execução vs. arquivos que já existiam e foram preservados;
|
|
212
|
+
- se o Design System referenciado tem uma versão conhecida (campo `version` do frontmatter) ou
|
|
213
|
+
`unknown` (nenhuma dependência de design com versão detectável em `package.json`).
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Handoff — Protótipo → Design Contract
|
|
218
|
+
|
|
219
|
+
Só se aplica quando o Setup detectou `mode: "prototype-first"` (passo 1, acima). Transforma o
|
|
220
|
+
protótipo em `.vetor/design/prototype/` no Design Contract consumido pelo Loop — nunca uma cópia
|
|
221
|
+
visual do protótipo (design-vocabulary.md §4.1).
|
|
222
|
+
|
|
223
|
+
### 1 — Observar o protótipo
|
|
224
|
+
|
|
225
|
+
A origem é a ferramenta de design suportada pelo workflow, ou qualquer outro artefato visual
|
|
226
|
+
disponível ao agente (imagens, export estático, MCP de design quando presente). Este passo é
|
|
227
|
+
trabalho do agente, não deste script: leia/observe o conteúdo de `.vetor/design/prototype/` e
|
|
228
|
+
extraia, conforme aplicável (design-vocabulary.md §4.2):
|
|
229
|
+
|
|
230
|
+
```text
|
|
231
|
+
objetivo da experiência, telas, hierarquia, componentes, tokens observáveis, conteúdo real,
|
|
232
|
+
interações, estados, responsividade, restrições técnicas reais, decisões, questões abertas
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
**Preserve, nunca copie pixels:**
|
|
236
|
+
|
|
237
|
+
```text
|
|
238
|
+
prototype intent + real application data + real application states + real technical constraints
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
Conteúdo (`content`) é sempre real — textos, labels e mensagens do produto, nunca lorem ipsum.
|
|
242
|
+
Restrições (`constraints`) documentam limitações técnicas reais que o protótipo pode não refletir
|
|
243
|
+
(ex.: um campo que o protótipo mostra sempre preenchido, mas que a API real pode retornar vazio).
|
|
244
|
+
|
|
245
|
+
### 2 — Estados de interface (além do happy path)
|
|
246
|
+
|
|
247
|
+
O protótipo tipicamente mostra só o happy path. Avalie cada um dos 9 estados canônicos de
|
|
248
|
+
`design-vocabulary.md` §4.3 para a tela/fluxo:
|
|
249
|
+
|
|
250
|
+
```text
|
|
251
|
+
loading, empty, populated, error, partial failure, permission denied, offline, disabled, success
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
Para cada estado, **ou**:
|
|
255
|
+
|
|
256
|
+
- especifique-o (`states`): `trigger`, `expectedBehavior`, `primaryAction`/`visualTreatment` quando
|
|
257
|
+
aplicável, e `evidence` (`"Prototype"`, `"Specification"`, ou a combinação);
|
|
258
|
+
- marque-o como não aplicável a esta tela (`notApplicableStates`), com a razão — ex.: uma tela sem
|
|
259
|
+
controle de acesso por usuário não precisa de "permission denied";
|
|
260
|
+
|
|
261
|
+
**nunca omita um estado em silêncio.** `renderDesignContract` (`scripts/lib/design-handoff.ts`)
|
|
262
|
+
garante isso: qualquer um dos 9 estados que não for especificado nem marcado como não aplicável
|
|
263
|
+
aparece no documento como um bloco `OPEN_QUESTION` — a lacuna fica visível, nunca escondida.
|
|
264
|
+
|
|
265
|
+
### 3 — Decisões e Evidence State
|
|
266
|
+
|
|
267
|
+
Classifique cada decisão de design usando `design-vocabulary.md` §4.4 (`CONFIRMED`/`INFERRED` citam
|
|
268
|
+
`source`; `ASSUMED` cita `reason`, nunca `source`). O que ainda não foi decidido vai para
|
|
269
|
+
`openQuestions` (`impact`), nunca para `decisions`. Nunca promova `INFERRED`/`ASSUMED` a `CONFIRMED`
|
|
270
|
+
sem evidência qualificada nova (`evidence-state.md` §5) — implementar uma leitura não a confirma.
|
|
271
|
+
|
|
272
|
+
### 4 — Gerar o Design Contract
|
|
273
|
+
|
|
274
|
+
Monte a extração como `PrototypeExtraction` (`scripts/lib/design-handoff.ts`) num JSON e rode:
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
deno run -A "$SKILL_DIR/../../scripts/handoff-prototype.ts" <extração.json> <diretório>
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
Saída JSON: `written`, `skipped`, `unaddressedStates`. O Design Contract é gravado em
|
|
281
|
+
`.vetor/design/handoff/<slug-do-título>.md` — nunca sobrescreve um já existente (mesmo contrato de
|
|
282
|
+
`writeDesignFiles`, Setup passo 2). Exemplo completo (Painel de Worktrees, com estados Empty/Error)
|
|
283
|
+
em `skills/design/examples/prototype-handoff-example.md`.
|
|
284
|
+
|
|
285
|
+
### 5 — Reportar
|
|
286
|
+
|
|
287
|
+
Resuma: título do Design Contract gerado (ou já existente, preservado), estados especificados vs.
|
|
288
|
+
`notApplicableStates` vs. `unaddressedStates` (estes últimos precisam de decisão humana antes da
|
|
289
|
+
implementação), e as questões abertas pendentes.
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## Loop — Frontend Self-Correction
|
|
294
|
+
|
|
295
|
+
### 0 — Quando aplicar
|
|
296
|
+
|
|
297
|
+
Mesmos sinais de `frontend-design-enforcement.md` §"Como detectar": label `ui`/`frontend`/`design`,
|
|
298
|
+
ou menção a UI, interface, layout, componente visual, tela, página, CSS, estilo, tipografia, design
|
|
299
|
+
system, mockup, wireframe. Não aplique a módulos puramente backend/CLI/infra.
|
|
300
|
+
|
|
301
|
+
### 1 — Design Contract
|
|
302
|
+
|
|
303
|
+
Entrada do loop: o Design Contract da tela/fluxo (`design-vocabulary.md` §4) — objetivo, hierarquia,
|
|
304
|
+
componentes, tokens, estados, responsividade, acessibilidade. Se o modo é Prototype-first (Setup,
|
|
305
|
+
passo 1), procure primeiro um Design Contract já gerado pelo Handoff em
|
|
306
|
+
`.vetor/design/handoff/<slug>.md`; se ainda não existir para esta tela/fluxo, rode o Handoff (seção
|
|
307
|
+
acima) antes de prosseguir, em vez de tratar o protótipo como se não existisse. Só na ausência de
|
|
308
|
+
protótipo e de Design Contract explícito, trate a Specification + código de referência do Design
|
|
309
|
+
System (ver Setup, acima) como a melhor aproximação disponível e **registre isso como premissa** no
|
|
310
|
+
relatório final do loop — nunca invente decisões de design que deveriam vir do contrato.
|
|
311
|
+
|
|
312
|
+
Ao ler o Design Contract, confira também se ele diverge da Specification da mesma tela/fluxo em
|
|
313
|
+
alguma decisão relevante (ex.: ação primária) — ver `design-vocabulary.md` §7 e
|
|
314
|
+
`scripts/lib/spec-design-conflict.ts`. Encontrar essa divergência aqui, antes do Build, evita
|
|
315
|
+
implementar uma tela sobre uma base já conflitante.
|
|
316
|
+
|
|
317
|
+
### 2 — Build
|
|
318
|
+
|
|
319
|
+
Rode o build do módulo alterado (comando do `module-test-map.md`, ou o comando de build do
|
|
320
|
+
projeto-alvo quando distinto do de teste). Build quebrado é sempre autocorrigível (é um erro
|
|
321
|
+
objetivo) — corrija e repita antes de prosseguir; não avance para Run com build vermelho.
|
|
322
|
+
|
|
323
|
+
### 3 — Run
|
|
324
|
+
|
|
325
|
+
Suba a aplicação (dev server, preview build, ou o mecanismo que a skill `run` já usa para o
|
|
326
|
+
projeto). Se subir falhar, trate como o mesmo tipo de erro objetivo do passo 2.
|
|
327
|
+
|
|
328
|
+
**Sem MCP de browser disponível**, você ainda pode confirmar que o processo subiu (porta aberta, log
|
|
329
|
+
de inicialização) por CLI — isso não depende de MCP. O que depende de MCP são os passos 4-6.
|
|
330
|
+
|
|
331
|
+
### 4 — Inspect
|
|
332
|
+
|
|
333
|
+
Com MCP de browser disponível: navegue até a tela (`navigate_page`), interaja com os fluxos que a
|
|
334
|
+
mudança afeta (`click`/`fill`/`fill_form`), e colete o estado renderizado.
|
|
335
|
+
|
|
336
|
+
**Sem MCP de browser:** chame `reportLoopStep("inspect", <ferramentas disponíveis>)` de
|
|
337
|
+
`scripts/lib/design-loop-mcp.ts` (ou aplique o mesmo raciocínio manualmente) e inclua a `limitation`
|
|
338
|
+
retornada no relatório final. Prossiga o loop com o que é verificável sem browser: leitura do
|
|
339
|
+
código, dos testes existentes e do Design Contract. Nunca pule esta etapa em silêncio, nunca marque
|
|
340
|
+
como verificada sem tê-la executado.
|
|
341
|
+
|
|
342
|
+
### 5 — Screenshot
|
|
343
|
+
|
|
344
|
+
Com MCP: `take_screenshot` da tela em pelo menos o viewport padrão do Design Contract.
|
|
345
|
+
|
|
346
|
+
Sem MCP: mesmo tratamento do passo 4 — `reportLoopStep("screenshot", ...)`, sem inventar uma
|
|
347
|
+
descrição visual do que não foi capturado.
|
|
348
|
+
|
|
349
|
+
### 6 — Accessibility Snapshot
|
|
350
|
+
|
|
351
|
+
Com MCP: capture a árvore de acessibilidade (ex.: `take_snapshot`/accessibility tree do MCP de
|
|
352
|
+
browser em uso) — papéis (roles), rótulos (labels), ordem de foco.
|
|
353
|
+
|
|
354
|
+
Sem MCP: mesmo tratamento — `reportLoopStep("accessibility_snapshot", ...)`. A verificação estática
|
|
355
|
+
ainda é possível e deve ser feita: leia o JSX/HTML alterado e confira `alt`, `aria-*`, associação
|
|
356
|
+
`label`/`input`, ordem de tab implícita pela ordem do DOM — mas isso é revisão de código, não
|
|
357
|
+
inspeção ao vivo, e o relatório final deve dizer isso explicitamente.
|
|
358
|
+
|
|
359
|
+
### 7 — Critique (Visual Critique)
|
|
360
|
+
|
|
361
|
+
Avalie a implementação nas **10 dimensões** abaixo. Cada dimensão recebe um veredito objetivo: `ok`,
|
|
362
|
+
`problema encontrado` (com o achado descrito), ou `não verificável sem MCP de browser` (para as
|
|
363
|
+
dimensões que dependem de renderização real quando não há MCP — ver coluna "Sem MCP").
|
|
364
|
+
|
|
365
|
+
| # | Dimensão | O que avalia | Sem MCP |
|
|
366
|
+
| -- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------- |
|
|
367
|
+
| 1 | Specification fidelity | A implementação cobre o que a Specification pede — nenhum requisito perdido ou reinterpretado | Verificável (leitura de código × spec) |
|
|
368
|
+
| 2 | Design fidelity | A implementação reflete o Design Contract (componentes, tokens, hierarquia) — não uma interpretação livre | Parcialmente verificável (código × contrato); confirmação visual fica pendente |
|
|
369
|
+
| 3 | Hierarquia visual | Primário/secundário/terciário estão visualmente distinguíveis, conforme o campo "Hierarquia" do contrato | Não verificável sem MCP |
|
|
370
|
+
| 4 | Domain specificity | A interface tem características do produto ou poderia ser de qualquer app parecido (genérica)? | Não verificável sem MCP |
|
|
371
|
+
| 5 | Repetição sem justificativa semântica | Padrões repetidos (mesmo componente, mesmo layout) têm razão de domínio, não só conveniência de copiar-colar | Parcialmente verificável (código) |
|
|
372
|
+
| 6 | Tipografia | Escala, peso, tracking conforme Design System/Direction | Não verificável sem MCP |
|
|
373
|
+
| 7 | Layout | Grid/colunas/regiões conforme o campo "Layout" do contrato | Não verificável sem MCP |
|
|
374
|
+
| 8 | Interação/estados | Os estados de `design-vocabulary.md` §4.3 (loading/empty/error/etc.) estão implementados e navegáveis | Parcialmente verificável (código dos handlers/estados); navegação ao vivo fica pendente |
|
|
375
|
+
| 9 | Acessibilidade | Foco, contraste, navegação por teclado, semântica (ver passo 6) | Parcialmente verificável (estática) |
|
|
376
|
+
| 10 | Comportamento responsivo | Breakpoints do contrato se comportam como especificado | Não verificável sem MCP |
|
|
377
|
+
|
|
378
|
+
Cada `problema encontrado` vira um item do passo 8 (Fix ou Escalação, conforme o critério abaixo).
|
|
379
|
+
Cada `não verificável sem MCP de browser` entra no relatório final como limitação explícita — nunca
|
|
380
|
+
como `ok`.
|
|
381
|
+
|
|
382
|
+
### 8 — Fix vs. Escalação
|
|
383
|
+
|
|
384
|
+
**Autocorrija** (objetivo e reversível):
|
|
385
|
+
|
|
386
|
+
- overflow;
|
|
387
|
+
- elemento ausente;
|
|
388
|
+
- erro JS;
|
|
389
|
+
- interação quebrada;
|
|
390
|
+
- erro de responsividade;
|
|
391
|
+
- console/network error;
|
|
392
|
+
- componente divergente do Design Contract.
|
|
393
|
+
|
|
394
|
+
**Escale ao usuário** (decisão de produto/design — nunca decida sozinho):
|
|
395
|
+
|
|
396
|
+
- interpretações legítimas conflitantes do protótipo;
|
|
397
|
+
- conflito Specification × Prototype;
|
|
398
|
+
- conflito Specification × Design Contract (ver `design-vocabulary.md` §7 e
|
|
399
|
+
`detectFieldConflict`/`detectPrimaryActionConflict` de `scripts/lib/spec-design-conflict.ts`);
|
|
400
|
+
- mudança de information architecture;
|
|
401
|
+
- ausência de ação primária definida;
|
|
402
|
+
- mudança de identidade visual;
|
|
403
|
+
- conflito Design System × Prototype.
|
|
404
|
+
|
|
405
|
+
Ao escalar, siga o mecanismo padrão de `BLOCKED_WAITING` (`agent-status.template.md`): descreva a
|
|
406
|
+
opção em conflito nos blocos `Blocked on`/`Options`/`Recommendation` — nunca escolha por conta
|
|
407
|
+
própria entre interpretações de design legitimamente divergentes.
|
|
408
|
+
|
|
409
|
+
Para os itens autocorrigíveis, aplique TDD quando o módulo tiver suíte (`tdd-conventions.md`):
|
|
410
|
+
reproduza o problema objetivo antes de corrigi-lo — uma fatia por vez, sem refatoração especulativa
|
|
411
|
+
fora do escopo do achado.
|
|
412
|
+
|
|
413
|
+
### 9 — Verify
|
|
414
|
+
|
|
415
|
+
Repita os passos 2-7 que foram afetados pelo fix (não o loop inteiro, apenas o que o fix pode ter
|
|
416
|
+
mudado). Se um fix tocar um passo que dependia de MCP indisponível, o relatório final continua
|
|
417
|
+
carregando a mesma limitação daquele passo — corrigir código não substitui uma verificação visual
|
|
418
|
+
que nunca ocorreu.
|
|
419
|
+
|
|
420
|
+
### 10 — Done
|
|
421
|
+
|
|
422
|
+
Produza um relatório curto com: o veredito de cada uma das 10 dimensões do passo 7, os fixes
|
|
423
|
+
aplicados, as escalações pendentes (se houver) e a lista de passos marcados como
|
|
424
|
+
`não verificável sem MCP de browser`. **Nunca** declare a tela "verificada visualmente" quando essa
|
|
425
|
+
lista não está vazia — declare exatamente o que foi e o que não foi confirmado.
|
|
426
|
+
|
|
427
|
+
### Sem MCP de browser (degradação graciosa)
|
|
428
|
+
|
|
429
|
+
Este loop nunca falha nem trava por falta de MCP de browser, e nunca finge que a inspeção ocorreu.
|
|
430
|
+
Quando nenhum servidor de browser (`mcp__chrome-devtools__*`, `mcp__playwright__*`) está na lista de
|
|
431
|
+
ferramentas da sessão:
|
|
432
|
+
|
|
433
|
+
1. Os passos 4, 5, 6 e a parte visual do 7/9 usam `reportLoopStep(<step>, <ferramentas>)` de
|
|
434
|
+
`scripts/lib/design-loop-mcp.ts`, que retorna `verdict: "unverified"` com uma `limitation`
|
|
435
|
+
explícita nomeando a etapa pulada — nunca `verdict: "verified"` sem MCP, e a função nunca lança.
|
|
436
|
+
2. O loop **continua** com o que é verificável por código: build, testes existentes, leitura
|
|
437
|
+
estática do componente contra o Design Contract (dimensões 1, 2, 5, 8 e 9 parcialmente).
|
|
438
|
+
3. O relatório final (passo 10) lista cada limitação — a ausência de MCP é um fato reportado, não um
|
|
439
|
+
detalhe omitido silenciosamente nem um motivo para `BLOCKED_WAITING` (a verificação visual ao
|
|
440
|
+
vivo é sempre opcional; sua ausência não bloqueia entrega, só limita a confiança do veredito).
|
|
441
|
+
4. Confirmação visual/acessibilidade ao vivo, quando não houver MCP, fica marcada como validação
|
|
442
|
+
manual pendente pós-merge — nunca como critério de `GREEN` do worker.
|
|
443
|
+
|
|
444
|
+
---
|
|
445
|
+
|
|
446
|
+
## Restrições
|
|
447
|
+
|
|
448
|
+
- Nunca duplica ou substitui tokens/componentes de um Design System já existente — a representação
|
|
449
|
+
em `.vetor/design/system/` é referência/handoff, nunca uma segunda fonte concorrente de tokens.
|
|
450
|
+
- Nunca sobrescreve `.vetor/design/system/*.md` ou `.vetor/design/direction/product.md` já
|
|
451
|
+
existentes.
|
|
452
|
+
- Nunca varre recursivamente o filesystem em busca de evidência — só os caminhos candidatos fixos de
|
|
453
|
+
`scripts/lib/design-mode.ts` (raiz + primeiro nível comum), evitando falso positivo em
|
|
454
|
+
`node_modules/`, `dist/`, `build/`.
|
|
455
|
+
- Nunca promove um padrão comum a proibição universal na Design Direction sem justificativa ligada
|
|
456
|
+
ao produto (`DEFAULT ≠ FORBIDDEN`).
|
|
457
|
+
- O Handoff nunca produz um Design Contract que seja cópia do protótipo (posição de pixel,
|
|
458
|
+
screenshot anotada, cópia de camadas) — sempre decisões que sobrevivem à transferência para código
|
|
459
|
+
(design-vocabulary.md §4.1).
|
|
460
|
+
- O Handoff nunca omite em silêncio um dos 9 estados canônicos: cada um é especificado, marcado como
|
|
461
|
+
não aplicável (com razão), ou vira `OPEN_QUESTION` no documento gerado.
|
|
462
|
+
- O Handoff nunca promove `INFERRED`/`ASSUMED` a `CONFIRMED` sem evidência qualificada nova
|
|
463
|
+
(`evidence-state.md` §5).
|
|
464
|
+
- O conflito Specification × Design Contract nunca é resolvido silenciosamente — sempre relatado
|
|
465
|
+
(`spec-design-conflict.ts`) e escalado via `BLOCKED_WAITING` (#231, design-vocabulary.md §7).
|
|
466
|
+
- Design Drift, Visual Debt e a integração com Guardian são pontos de extensão **documentados, não
|
|
467
|
+
implementados** nesta issue (#231, design-vocabulary.md §8) — sem mecanismo de detecção/tracking
|
|
468
|
+
automático nesta skill ainda.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Design Contract — Exemplo (Painel de Worktrees)
|
|
2
|
+
|
|
3
|
+
Fixture de referência para a integração do Design Contract com o Evidence State
|
|
4
|
+
(`skills/shared/references/evidence-state.md`, #214 — ver `design-vocabulary.md` §4.4). Cobre os
|
|
5
|
+
campos mínimos necessários para demonstrar as Decisões e a Questão aberta; não é um Design Contract
|
|
6
|
+
completo (campos como Tokens, Responsividade e Acessibilidade foram omitidos por não serem
|
|
7
|
+
necessários para este exemplo).
|
|
8
|
+
|
|
9
|
+
## Objetivo da experiência
|
|
10
|
+
|
|
11
|
+
Permitir ao usuário visualizar os worktrees ativos do projeto e criar um novo sem sair da
|
|
12
|
+
aplicação.
|
|
13
|
+
|
|
14
|
+
## Telas
|
|
15
|
+
|
|
16
|
+
Painel de Worktrees (lista) → Modal de criação de worktree.
|
|
17
|
+
|
|
18
|
+
## Decisões
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
CONFIRMED
|
|
22
|
+
Ação primária da tela é "Criar worktree".
|
|
23
|
+
Source: Prototype
|
|
24
|
+
|
|
25
|
+
INFERRED
|
|
26
|
+
A sidebar representa navegação persistente entre projetos.
|
|
27
|
+
Source: Prototype + Specification
|
|
28
|
+
|
|
29
|
+
ASSUMED
|
|
30
|
+
Navegação desktop permanece expandida acima de 1024px.
|
|
31
|
+
Reason: Nenhuma tela do protótipo cobre breakpoints intermediários; premissa necessária para
|
|
32
|
+
avançar a especificação.
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Questões abertas
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
OPEN_QUESTION
|
|
39
|
+
Os filtros da lista de worktrees devem persistir entre sessões?
|
|
40
|
+
Impact: Afeta se o estado do filtro precisa ser persistido em storage do cliente ou servidor.
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Referências
|
|
44
|
+
|
|
45
|
+
- Prototype: (link do protótipo)
|
|
46
|
+
- Specification: (link da spec)
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
> Exemplo de handoff completo (#229): Design Contract gerado por
|
|
2
|
+
> `renderDesignContract`/`handoff-prototype.ts` (`scripts/lib/design-handoff.ts`) a partir de uma
|
|
3
|
+
> extração estruturada do protótipo do Painel de Worktrees. Cobre os 9 estados canônicos de
|
|
4
|
+
> `design-vocabulary.md` §4.3 — 4 especificados (`empty`, `error`, `loading`, `populated`) e 5
|
|
5
|
+
> marcados explicitamente como não aplicáveis a esta tela, cada um com a razão registrada; nenhum é
|
|
6
|
+
> omitido em silêncio. Continuação do exemplo mínimo de Evidence State em
|
|
7
|
+
> `design-contract-example.md` (#214), agora com a extração completa do handoff.
|
|
8
|
+
|
|
9
|
+
# Design Contract — Painel de Worktrees
|
|
10
|
+
|
|
11
|
+
## Objetivo da experiência
|
|
12
|
+
|
|
13
|
+
Permitir ao usuário visualizar os worktrees ativos do projeto e criar um novo sem sair da aplicação.
|
|
14
|
+
|
|
15
|
+
## Telas
|
|
16
|
+
|
|
17
|
+
Painel de Worktrees (lista) → Modal de criação de worktree.
|
|
18
|
+
|
|
19
|
+
## Hierarquia
|
|
20
|
+
|
|
21
|
+
Ação primária ('Criar worktree') é o botão sólido no topo direito da tela; a lista de worktrees é o conteúdo primário abaixo dela; a sidebar é navegação secundária persistente.
|
|
22
|
+
|
|
23
|
+
## Componentes
|
|
24
|
+
|
|
25
|
+
Button (primary/ghost), Card (item de worktree), Modal (criação), Badge (status).
|
|
26
|
+
|
|
27
|
+
## Conteúdo
|
|
28
|
+
|
|
29
|
+
Título da tela: 'Worktrees ativos'. Botão primário: 'Criar worktree'. Cada card mostra o nome da branch e o status (ativo/stale).
|
|
30
|
+
|
|
31
|
+
## Interações
|
|
32
|
+
|
|
33
|
+
Clique em 'Criar worktree' abre o Modal de criação. Clique num card de worktree navega para o detalhe. Clique fora do Modal ou Esc fecha sem salvar.
|
|
34
|
+
|
|
35
|
+
## Estados
|
|
36
|
+
|
|
37
|
+
### State: empty
|
|
38
|
+
|
|
39
|
+
Trigger:
|
|
40
|
+
Nenhum worktree ativo no projeto.
|
|
41
|
+
|
|
42
|
+
Expected behavior:
|
|
43
|
+
Explicar que não há worktree ativo no momento, sem tratar como erro.
|
|
44
|
+
|
|
45
|
+
Primary action:
|
|
46
|
+
Criar worktree.
|
|
47
|
+
|
|
48
|
+
Visual treatment:
|
|
49
|
+
Ilustração mínima + texto + botão primário, centralizado na área de conteúdo.
|
|
50
|
+
|
|
51
|
+
Evidence:
|
|
52
|
+
Prototype + Specification
|
|
53
|
+
|
|
54
|
+
### State: error
|
|
55
|
+
|
|
56
|
+
Trigger:
|
|
57
|
+
Falha ao carregar a lista de worktrees (erro de rede ou filesystem).
|
|
58
|
+
|
|
59
|
+
Expected behavior:
|
|
60
|
+
Exibir mensagem de erro específica (não genérica) com opção de tentar novamente; nunca falhar silenciosamente para uma lista vazia.
|
|
61
|
+
|
|
62
|
+
Primary action:
|
|
63
|
+
Tentar novamente.
|
|
64
|
+
|
|
65
|
+
Evidence:
|
|
66
|
+
Specification
|
|
67
|
+
|
|
68
|
+
### State: loading
|
|
69
|
+
|
|
70
|
+
Trigger:
|
|
71
|
+
Lista de worktrees ainda sendo carregada.
|
|
72
|
+
|
|
73
|
+
Expected behavior:
|
|
74
|
+
Exibir skeleton dos cards, sem layout shift quando os dados chegarem.
|
|
75
|
+
|
|
76
|
+
Evidence:
|
|
77
|
+
Specification
|
|
78
|
+
|
|
79
|
+
### State: populated
|
|
80
|
+
|
|
81
|
+
Trigger:
|
|
82
|
+
Um ou mais worktrees ativos.
|
|
83
|
+
|
|
84
|
+
Expected behavior:
|
|
85
|
+
Listar cada worktree com nome da branch e status.
|
|
86
|
+
|
|
87
|
+
Evidence:
|
|
88
|
+
Prototype
|
|
89
|
+
|
|
90
|
+
### State: permission denied
|
|
91
|
+
|
|
92
|
+
Not applicable:
|
|
93
|
+
O painel roda localmente, sem controle de permissão por usuário nesta versão.
|
|
94
|
+
|
|
95
|
+
### State: offline
|
|
96
|
+
|
|
97
|
+
Not applicable:
|
|
98
|
+
Ferramenta de desenvolvimento local — não depende de conectividade externa.
|
|
99
|
+
|
|
100
|
+
### State: disabled
|
|
101
|
+
|
|
102
|
+
Not applicable:
|
|
103
|
+
A ação 'Criar worktree' nunca fica desabilitada nesta tela — sempre disponível.
|
|
104
|
+
|
|
105
|
+
### State: success
|
|
106
|
+
|
|
107
|
+
Not applicable:
|
|
108
|
+
Coberto pelo fluxo do Modal de criação (fora do escopo desta extração de tela).
|
|
109
|
+
|
|
110
|
+
### State: partial failure
|
|
111
|
+
|
|
112
|
+
Not applicable:
|
|
113
|
+
A listagem é uma única chamada — não há sub-operações que possam falhar parcialmente.
|
|
114
|
+
|
|
115
|
+
## Responsividade
|
|
116
|
+
|
|
117
|
+
Acima de 1024px: sidebar expandida + grid de 3 colunas de cards. Abaixo de 1024px: sidebar colapsada + lista de 1 coluna (ASSUMED — ver Decisões).
|
|
118
|
+
|
|
119
|
+
## Referências
|
|
120
|
+
|
|
121
|
+
- Prototype: .vetor/design/prototype/painel-de-worktrees
|
|
122
|
+
- Specification: docs/specs/painel-de-worktrees.md
|
|
123
|
+
|
|
124
|
+
## Decisões
|
|
125
|
+
|
|
126
|
+
CONFIRMED
|
|
127
|
+
Ação primária da tela é 'Criar worktree'.
|
|
128
|
+
Source: Prototype
|
|
129
|
+
|
|
130
|
+
INFERRED
|
|
131
|
+
A sidebar representa navegação persistente entre projetos.
|
|
132
|
+
Source: Prototype + Specification
|
|
133
|
+
|
|
134
|
+
ASSUMED
|
|
135
|
+
Navegação desktop permanece expandida acima de 1024px.
|
|
136
|
+
Reason: Nenhuma tela do protótipo cobre breakpoints intermediários; premissa necessária para avançar a especificação.
|
|
137
|
+
|
|
138
|
+
## Questões abertas
|
|
139
|
+
|
|
140
|
+
OPEN_QUESTION
|
|
141
|
+
Os filtros da lista de worktrees devem persistir entre sessões?
|
|
142
|
+
Impact: Afeta se o estado do filtro precisa ser persistido em storage do cliente ou servidor.
|