@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.
Files changed (78) hide show
  1. package/README.md +42 -0
  2. package/bin/vetor.js +6 -0
  3. package/lib/banner.js +35 -0
  4. package/lib/commands/install.js +71 -0
  5. package/lib/commands/status.js +59 -0
  6. package/lib/commands/uninstall.js +119 -0
  7. package/lib/commands/update.js +63 -0
  8. package/lib/installer/command-exists.js +30 -0
  9. package/lib/installer/cursor-hooks.js +181 -0
  10. package/lib/installer/detector.js +79 -0
  11. package/lib/installer/manifest.js +76 -0
  12. package/lib/installer/prompts.js +97 -0
  13. package/lib/installer/writer.js +382 -0
  14. package/lib/router.js +50 -0
  15. package/package.json +39 -0
  16. package/templates/.gitkeep +0 -0
  17. package/templates/agents/code-review/agent.json +27 -0
  18. package/templates/agents/code-review/codex.toml +37 -0
  19. package/templates/agents/code-review.md +99 -0
  20. package/templates/agents/issue-worker/agent.json +33 -0
  21. package/templates/agents/issue-worker/codex.toml +57 -0
  22. package/templates/agents/issue-worker.md +112 -0
  23. package/templates/hooks/hooks-codex.json +48 -0
  24. package/templates/hooks/hooks.json +62 -0
  25. package/templates/opencode/agent/code-review.md +73 -0
  26. package/templates/opencode/agent/issue-coordinator.md +521 -0
  27. package/templates/opencode/agent/issue-worker.md +64 -0
  28. package/templates/opencode/mcp.jsonc +39 -0
  29. package/templates/opencode/plugin/vetor.ts +207 -0
  30. package/templates/opencode/scripts/agent-registration_test.ts +92 -0
  31. package/templates/opencode/scripts/check-edit.ts +147 -0
  32. package/templates/opencode/scripts/ensure-external-directory-permission.ts +110 -0
  33. package/templates/opencode/scripts/ensure-external-directory-permission_test.ts +142 -0
  34. package/templates/opencode/scripts/lib/guard.ts +45 -0
  35. package/templates/opencode/scripts/lib/model-health.ts +133 -0
  36. package/templates/opencode/scripts/lib/model-health_test.ts +181 -0
  37. package/templates/opencode/scripts/lib/project.ts +240 -0
  38. package/templates/opencode/scripts/lib/project_test.ts +45 -0
  39. package/templates/opencode/scripts/lib/status.ts +69 -0
  40. package/templates/opencode/scripts/lib/worktree.ts +41 -0
  41. package/templates/opencode/scripts/model-health.ts +50 -0
  42. package/templates/opencode/scripts/model-health_test.ts +80 -0
  43. package/templates/opencode/scripts/resolve-model.ts +112 -0
  44. package/templates/opencode/scripts/resolve-model_test.ts +185 -0
  45. package/templates/opencode/scripts/safety-check.ts +203 -0
  46. package/templates/opencode/scripts/vetor-checks.sh +217 -0
  47. package/templates/opencode/scripts/vetor-status.sh +99 -0
  48. package/templates/skills/architecture-review/SKILL.md +187 -0
  49. package/templates/skills/backlog-ideator/SKILL.md +277 -0
  50. package/templates/skills/design/SKILL.md +468 -0
  51. package/templates/skills/design/examples/design-contract-example.md +46 -0
  52. package/templates/skills/design/examples/prototype-handoff-example.md +142 -0
  53. package/templates/skills/fix-loop-agent/SKILL.md +255 -0
  54. package/templates/skills/guardian/SKILL.md +343 -0
  55. package/templates/skills/issue-coordinator/SKILL.md +596 -0
  56. package/templates/skills/retro/SKILL.md +156 -0
  57. package/templates/skills/shared/references/agent-status.template.md +68 -0
  58. package/templates/skills/shared/references/codebase-design-vocabulary.md +54 -0
  59. package/templates/skills/shared/references/conflict-resolution.md +94 -0
  60. package/templates/skills/shared/references/delegate-to-runtime.md +239 -0
  61. package/templates/skills/shared/references/design-vocabulary.md +508 -0
  62. package/templates/skills/shared/references/evidence-state.md +365 -0
  63. package/templates/skills/shared/references/frontend-design-enforcement.md +33 -0
  64. package/templates/skills/shared/references/grilling-conventions.md +64 -0
  65. package/templates/skills/shared/references/knowledge-provider-contract.md +150 -0
  66. package/templates/skills/shared/references/mcp-availability.md +104 -0
  67. package/templates/skills/shared/references/module-test-map.template.md +72 -0
  68. package/templates/skills/shared/references/planning-conventions.md +97 -0
  69. package/templates/skills/shared/references/project-conventions.md +63 -0
  70. package/templates/skills/shared/references/tdd-conventions.md +81 -0
  71. package/templates/skills/shared/references/touched-files-cache.md +30 -0
  72. package/templates/skills/spec/SKILL.md +524 -0
  73. package/templates/skills/spec-validate/SKILL.md +195 -0
  74. package/templates/skills/spec-validate/references/traceability.md +169 -0
  75. package/templates/skills/stack-practices/SKILL.md +151 -0
  76. package/templates/skills/vetor/SKILL.md +174 -0
  77. package/templates/skills/worktree-create/SKILL.md +142 -0
  78. package/templates/skills/worktree-ship/SKILL.md +394 -0
@@ -0,0 +1,524 @@
1
+ ---
2
+ name: spec
3
+ description: Gera uma Spec estruturada (RF/RNF, Acceptance Criteria, Edge Cases, Non-Goals) a partir de um tema, ancorada no contexto descoberto no próprio projeto (README, docs, ADRs, Specs existentes, código, configuração do Vetor).
4
+ license: MIT
5
+ compatibility: Claude Code
6
+ metadata:
7
+ author: vitortavares
8
+ version: "1.4.0"
9
+ ---
10
+
11
+ Você é a skill de geração de Specs do Vetor. Sua missão é descobrir o contexto já existente no
12
+ projeto, decompor requisitos grandes em componentes, esclarecer o que faltar com uma entrevista
13
+ focada e, a partir disso, redigir um rascunho de Spec estruturada — descrevendo comportamento, não
14
+ implementação — usando `$SKILL_DIR/../../templates/spec.md` como esqueleto.
15
+
16
+ Esta skill ainda não cobre todo o pipeline de #202: implementa a entrada, a descoberta de contexto
17
+ (via Knowledge Provider quando disponível, com fallback para filesystem direto), a decomposição em
18
+ componentes, a entrevista focada, o motor de geração de RF/RNF/Acceptance Criteria/Edge Cases/
19
+ Non-Goals, a montagem do rascunho a partir do template e a persistência (frontmatter válido,
20
+ identidade estável, path previsível em `docs/specs/<slug>.md` por padrão, overwrite nunca silencioso
21
+ — sempre `update`/`create-new`/`cancel`, ver passo 6). Validação de qualidade (Quality Gate,
22
+ rastreabilidade — Handoff #203) chega em outra issue; overwrite avançado (versionamento, merge de
23
+ rascunhos) chega em outra; Obsidian como Knowledge Provider chega em outra (issue #225); consumo
24
+ automático da Spec pelo `issue-coordinator` (geração de código) não é escopo desta skill — cada
25
+ estágio abaixo sinaliza explicitamente o que ainda não está implementado.
26
+
27
+ ---
28
+
29
+ ## Sintaxe
30
+
31
+ ```
32
+ /vetor:spec
33
+ /vetor:spec <tema>
34
+ ```
35
+
36
+ - `<tema>`: opcional — o assunto a especificar (ex.: "sistema de autenticação", "melhorar fluxo de
37
+ checkout", "API de notificações").
38
+ - Se omitido, rode o passo 1 **sem filtro de palavra-chave** (visão geral do projeto — categorias 1
39
+ a 5 e 7), proponha um tema a partir do que foi encontrado e confirme com o usuário antes de seguir
40
+ para o passo 2. Se nada relevante for encontrado, pergunte objetivamente ao usuário qual tema
41
+ especificar (uma pergunta direta, não uma entrevista). Só depois de o tema estar definido — por
42
+ argumento ou por confirmação — aplique o filtro por palavra-chave da categoria 6.
43
+
44
+ ---
45
+
46
+ ## Referências
47
+
48
+ > Paths relativos abaixo resolvem a partir do diretório desta própria skill (informado ao carregar,
49
+ > ex. "Base directory for this skill: ..."), não do `cwd` de execução. Em comandos `bash`/`deno run`,
50
+ > prefixe o path absoluto desse diretório ao caminho relativo antes de executar — defina uma vez:
51
+ > ```bash
52
+ > SKILL_DIR="<path absoluto informado como 'Base directory for this skill' no carregamento>"
53
+ > ```
54
+ > e use `"$SKILL_DIR/../../scripts/..."` em todo comando abaixo, nunca o path relativo isolado.
55
+
56
+ - `$SKILL_DIR/../../templates/spec.md` — esqueleto da Spec usado no passo 5.
57
+ - `../shared/references/planning-conventions.md` — §3 ("Regra das 3
58
+ perguntas"), base da entrevista focada do passo 4 e aplicável também quando o tema (Sintaxe)
59
+ precisar de uma pergunta direta ao usuário.
60
+ - `../shared/references/delegate-to-runtime.md` — uso opcional de um
61
+ runtime externo disponível (Gemini/OpenCode/Codex) para resumir documentação extensa encontrada no
62
+ passo 1 (mesmo critério de `backlog-ideator`: acima de ~80 linhas, delegue o resumo em vez de ler
63
+ tudo nativamente).
64
+ - `../shared/references/knowledge-provider-contract.md` — contrato do
65
+ Knowledge Provider consumido pelos passos 0.2, 1 (item 5) e 4 via `scripts/knowledge-doc.ts`.
66
+ - `../../scripts/knowledge-doc.ts` — CLI que expõe `status`/`search-specs`/
67
+ `create-spec`/`update-spec`/`find` sobre o Knowledge Provider (ver passo 0.2).
68
+
69
+ ---
70
+
71
+ ## Comportamento
72
+
73
+ ### 0 — Triagem de complexidade e Knowledge Provider
74
+
75
+ **0.1 — Triagem de complexidade**
76
+
77
+ Antes de investir no fluxo completo (passos 1-6), classifique o `<tema>` já confirmado (ver Sintaxe)
78
+ em um de três níveis de processo — vocabulário adaptado dos níveis Spike/Bounded/Architectural da
79
+ skill `brainstorming` do superpowers (`obra/superpowers`, MIT) ao vocabulário do Vetor:
80
+
81
+ | Nível | Critério | O que muda no fluxo |
82
+ |-------|----------|----------------------|
83
+ | **Investigação** (Spike) | O tema é uma pergunta aberta ou exploração de viabilidade, sem uma capacidade concreta ainda decidida (ex.: "investigar como resolver X", "viabilidade de Y") — não há o que decompor nem um "sim/não" que baste virar Acceptance Criteria. | Rode o passo 1 (Context Discovery) normalmente para levantar o que já existe, mas **não gere o rascunho do passo 5 ainda**. Pare após o passo 2 e pergunte ao usuário se deseja (a) prosseguir mesmo assim, aceitando lacunas amplas (`⚠️ ABERTO` na maioria das seções), (b) tratar como Confirmação rápida assim que a decisão estiver mais clara, ou (c) encerrar aqui — investigação registrada, sem Spec gerada. |
84
+ | **Confirmação rápida** (Bounded) | O tema já é uma capacidade atômica — mesmo critério de "tema grande" do passo 3, mas na negativa (nenhum sinal de múltiplos fluxos/personas/fronteiras) — e o contexto do passo 1 tende a bastar com poucas perguntas. | Pule o passo 3 (Decomposição, que já se aplicaria a temas atômicos) e resolva o passo 4 (Entrevista) com o mínimo de perguntas necessário — a "confirmação rápida de 2-3 pontos" é o limite de 3 perguntas já imposto ao passo 4. Siga direto ao passo 5 para um rascunho enxuto. |
85
+ | **Spec completa** (Architectural) | O tema apresenta qualquer sinal de "tema grande" do passo 3 (múltiplos fluxos, múltiplas personas, capacidades separáveis, fronteiras/dependências entre partes). | Fluxo padrão, sem atalho: passos 1-6 completos, incluindo decomposição (passo 3) e entrevista por componente (passo 4). |
86
+
87
+ Registre a classificação escolhida (1 linha, com a razão) antes de seguir para o passo 1 — não decida
88
+ silenciosamente. Se a classificação for ambígua entre dois níveis, prefira o nível mais alto (mais
89
+ rigor, nunca menos, na dúvida) e registre a ambiguidade em `Open Questions` no rascunho (passo 5.6).
90
+
91
+ Esta triagem é interna ao fluxo de geração da Spec — decide **quanto** processo aplicar aqui dentro
92
+ depois que o usuário já pediu uma Spec. Uma triagem equivalente, mas orientada a decidir **se** uma
93
+ Spec é necessária antes do dispatch de implementação, acontece em `issue-coordinator` Fase 2 (gate de
94
+ Spec/design) — ver `wiki/Arquitetura.md` e `wiki/Decisoes-de-Design.md`. As duas são independentes:
95
+ esta skill nunca é invocada automaticamente por aquele gate, que apenas sinaliza a ausência de Spec.
96
+
97
+ **0.2 — Knowledge Provider**
98
+
99
+ A busca por Specs relacionadas (passo 1, item 5) e a persistência (passo 6) são feitas através de um
100
+ **Knowledge Provider** — uma fonte de conhecimento do projeto, abstrata por design:
101
+
102
+ ```
103
+ Knowledge Provider
104
+ ├── filesystem (implementado — via scripts/knowledge-doc.ts)
105
+ ├── obsidian (issue #225, ainda não implementado neste código)
106
+ └── future providers
107
+ ```
108
+
109
+ Antes do passo 1, rode:
110
+
111
+ ```bash
112
+ deno run -A "$SKILL_DIR/../../scripts/knowledge-doc.ts" status
113
+ ```
114
+
115
+ - `{"enabled": true, ...}` (default quando `.claude/vetor/config.json` não define `knowledge`, ou
116
+ define `knowledge.enabled` diferente de `false`) → use o Knowledge Provider nos passos 1 (item 5) e
117
+ 4 conforme descrito abaixo.
118
+ - `{"enabled": false, ...}` (`knowledge.enabled: false` explícito) → **fallback**: ignore o provider
119
+ em todo o fluxo — descoberta do item 5 vira busca direta por `grep`/`find` em `docs/specs/**/*.md`
120
+ (como nas demais categorias do passo 1) e o passo 6 não persiste nada em disco (apenas apresenta o
121
+ rascunho, como nesta skill antes desta integração).
122
+
123
+ A skill nunca assume nem referencia Obsidian diretamente em nenhum ponto do fluxo — o CLI sempre usa
124
+ `FilesystemKnowledgeProvider` hoje; quando `ObsidianKnowledgeProvider` existir (#225), a mudança fica
125
+ isolada em `scripts/knowledge-doc.ts`, sem alterar os passos abaixo.
126
+
127
+ ### 1 — Context Discovery
128
+
129
+ Antes de gerar qualquer rascunho, procure contexto no projeto **nesta ordem de prioridade**. Em toda
130
+ busca por arquivo (`find`/`grep`), exclua sempre
131
+ `.claude/worktrees/*`, `node_modules/`, `target/`, `build/`, `dist/`, `.venv/`, `__pycache__/`.
132
+
133
+ Se `<tema>` já foi informado (ou já foi confirmado com o usuário — ver Sintaxe), use-o para filtrar
134
+ a categoria 6 e para julgar a relevância do conteúdo lido nas demais. **Se `<tema>` ainda não existe**
135
+ (invocação sem argumento, primeira passada), rode as categorias 1 a 5 e 7 **sem filtro** — como
136
+ levantamento geral do projeto — para propor um tema; a categoria 6 (código por palavra-chave) só se
137
+ aplica depois que o tema estiver definido.
138
+
139
+ 1. **Documentação existente do Vetor:** `.claude/vetor/docs/**/*.md`
140
+ 2. **README:** `README.md` na raiz do projeto
141
+ 3. **Arquitetura:** `ARCHITECTURE.md`, `docs/architecture/**`, ou qualquer `docs/*.md` cujo conteúdo
142
+ trate de arquitetura
143
+ 4. **ADRs:** `docs/adr/**`, `docs/decisions/**`, ou arquivos que casem com `*ADR*.md`
144
+ 5. **Specs existentes:** se o Knowledge Provider estiver habilitado (passo 0.2), rode
145
+ `deno run -A "$SKILL_DIR/../../scripts/knowledge-doc.ts" search-specs "<tema>"` — a busca
146
+ prévia por Specs relacionadas antes de gerar uma nova; senão, `grep`/`find` direto em
147
+ `docs/specs/**/*.md`. Em ambos os casos, o objetivo é o mesmo: evitar duplicar uma Spec já criada
148
+ para o mesmo tema
149
+ 6. **Código relevante:** busque por palavras-chave do tema (já definido) nos módulos indicados por
150
+ `.claude/vetor/module-test-map.md` (se existir)
151
+ 7. **Configuração do Vetor:** `.claude/vetor/config.json`, `.claude/vetor/module-test-map.md`,
152
+ `.claude/rules/vetor/*.md`
153
+ 8. **Contexto fornecido diretamente pelo usuário:** qualquer detalhe já dado na mensagem atual ou em
154
+ resposta a uma pergunta feita por esta skill
155
+
156
+ Para cada categoria, registre o que foi encontrado (arquivo + trecho relevante) ou, explicitamente,
157
+ que nada foi encontrado — uma categoria vazia deve aparecer no relatório do passo 2 como vazia, nunca
158
+ ser omitida silenciosamente. Se um arquivo encontrado passar de ~80 linhas, resuma-o (nativamente ou
159
+ via runtime de delegação disponível, ver Referências) em vez de reproduzi-lo inteiro.
160
+
161
+ ### 2 — Reportar o contexto encontrado
162
+
163
+ **Antes de redigir qualquer rascunho de Spec**, apresente o resultado da descoberta. Quando o tema
164
+ ainda não estiver confirmado (levantamento geral do passo 1), use `"(tema a confirmar — ver
165
+ proposta abaixo)"` no lugar de `<tema>` e liste a proposta de tema logo após o relatório, para
166
+ confirmação do usuário antes do passo 3 (Decomposição).
167
+
168
+ ```
169
+ ## Contexto encontrado para "<tema>"
170
+
171
+ 1. Documentação do Vetor: <arquivo(s) + trecho | "nenhuma encontrada">
172
+ 2. README: <trecho relevante | "nenhum README encontrado">
173
+ 3. Arquitetura: <arquivo(s) + trecho | "nenhuma encontrada">
174
+ 4. ADRs: <arquivo(s) + trecho | "nenhum ADR encontrado">
175
+ 5. Specs existentes: <arquivo(s) + trecho | "nenhuma Spec existente para este tema">
176
+ 6. Código relevante: <arquivo(s)/módulo(s) | "nenhum código relevante localizado">
177
+ 7. Configuração do Vetor: <achado | "sem configuração relevante">
178
+ 8. Contexto fornecido pelo usuário: <resumo | "nenhum">
179
+ ```
180
+
181
+ Se a Spec existente do item 5 já cobrir o mesmo tema, pare aqui e pergunte ao usuário se deseja
182
+ atualizar a existente em vez de gerar uma nova (não decida por conta própria) — use o mecanismo de
183
+ pergunta disponível (`AskUserQuestion` em modo interativo; texto livre em modo headless, ver passo 6
184
+ para o vocabulário exato de opções). Este é um aviso antecipado baseado em busca textual (pode
185
+ falsear por tema parecido, mas não idêntico); a checagem definitiva — por identidade exata
186
+ (`spec:<slug>`) — acontece no passo 6, na hora de persistir.
187
+
188
+ ### 3 — Decomposição em componentes
189
+
190
+ Antes de entrevistar ou redigir qualquer rascunho, avalie se o tema é **grande** o bastante para
191
+ exigir decomposição. Um tema é grande quando o contexto do passo 1-2 sustenta **mais de uma**
192
+ capacidade independente — sinal disso é a presença de qualquer um destes:
193
+
194
+ - mais de um fluxo de usuário essencialmente distinto (ex.: "entrar" vs. "recuperar senha");
195
+ - mais de uma persona com necessidades diferentes;
196
+ - capacidades que poderiam ser entregues, testadas ou desativadas de forma separada;
197
+ - dependências ou fronteiras funcionais claras entre partes do tema.
198
+
199
+ Se **nenhum** desses sinais aparecer (tema já é uma única capacidade atômica, ex.: "adicionar botão
200
+ de copiar no card de resultado"), pule este passo e o passo 4 — vá direto ao passo 5.
201
+
202
+ Quando o tema for grande, identifique os componentes considerando escopo, usuários/personas,
203
+ capacidades, critérios de aceitação, dependências e fronteiras funcionais, e apresente-os ao
204
+ usuário **antes de prosseguir**:
205
+
206
+ ```
207
+ ## Decomposição proposta para "<tema>"
208
+
209
+ 1. <Componente 1> — <1 frase: o que cobre>
210
+ 2. <Componente 2> — <1 frase: o que cobre>
211
+ 3. <Componente N> — <1 frase: o que cobre>
212
+
213
+ Confirma esta decomposição, ou deseja ajustar/reorganizar?
214
+ ```
215
+
216
+ Exemplo (tema "sistema de autenticação"):
217
+
218
+ ```
219
+ ## Decomposição proposta para "sistema de autenticação"
220
+
221
+ 1. Login — autenticação de credenciais e emissão de sessão.
222
+ 2. Recuperação de senha — fluxo de redefinição para usuário que perdeu acesso.
223
+ 3. Sessão — manutenção, expiração e renovação do estado autenticado.
224
+ 4. Autorização — controle de acesso a recursos após autenticação.
225
+
226
+ Confirma esta decomposição, ou deseja ajustar/reorganizar?
227
+ ```
228
+
229
+ O usuário pode confirmar, pedir ajustes (adicionar/remover/renomear/fundir componentes) ou
230
+ reorganizar. Limite a **no máximo 2 rodadas de ajuste** após a proposta inicial — evita loop
231
+ infinito de refinamento. Ao atingir o limite sem confirmação explícita, prossiga com a última
232
+ versão da decomposição e registre a divergência residual em `Open Questions` no rascunho (passo 5),
233
+ em vez de insistir em mais uma rodada.
234
+
235
+ Trate cada componente confirmado como uma unidade independente para o passo 4 e para as seções de
236
+ `Functional Requirements` do rascunho (passo 5).
237
+
238
+ ### 4 — Entrevista focada
239
+
240
+ Só entreviste quando o contexto reunido nos passos 1-3 **não** for suficiente para produzir, para
241
+ aquele componente (ou para o tema inteiro, se o passo 3 foi pulado), uma Spec confiável — isto é,
242
+ quando falta informação que mudaria de forma significativa o conteúdo do rascunho (ex.: altera um
243
+ Acceptance Criteria, muda um Non-Goal, ou decide um Edge Case). Nunca pergunte por completude
244
+ cosmética ou sobre cenário hipotético/futuro (ver `planning-conventions.md` §3, "Regra das 3
245
+ perguntas").
246
+
247
+ Para cada componente que precisar de entrevista, faça **no máximo 3 perguntas objetivas**,
248
+ priorizando nesta ordem (pare assim que tiver o suficiente — nem sempre as 3 são necessárias):
249
+
250
+ 1. problema que está sendo resolvido;
251
+ 2. resultado esperado;
252
+ 3. escopo e não-escopo;
253
+ 4. comportamento esperado;
254
+ 5. casos de erro;
255
+ 6. restrições relevantes.
256
+
257
+ Se, após 3 perguntas, ainda faltar informação para aquele componente, **não faça uma quarta
258
+ pergunta** — marque a lacuna como `⚠️ ABERTO: <o que falta definir>` no rascunho (passo 5), o mesmo
259
+ idioma já usado no restante da skill para incerteza.
260
+
261
+ ### 5 — Motor de geração: montar o rascunho a partir do template
262
+
263
+ Copie a estrutura de `$SKILL_DIR/../../templates/spec.md` e preencha, a partir **apenas** do que foi encontrado ou
264
+ confirmado nos passos 1-4, aplicando as regras 5.1-5.5 a `Functional Requirements`,
265
+ `Non-Functional Requirements`, `Edge Cases` e `Non-Goals` — o núcleo do motor de geração — e 5.6 às
266
+ demais seções do template.
267
+
268
+ #### 5.1 — Comportamento, não implementação
269
+
270
+ Toda Spec descreve **o que** o sistema faz, nunca **como** foi construído. Evite decisão
271
+ tecnológica em `Functional Requirements`/`Non-Functional Requirements` quando ela não for parte do
272
+ próprio requisito:
273
+
274
+ ```text
275
+ Evitar: "Utilizar Spring Boot com PostgreSQL."
276
+ Preferir: "O sistema deve persistir o cadastro do usuário e permitir sua recuperação posteriormente."
277
+ ```
278
+
279
+ Exceção: quando a decisão tecnológica **é** o requisito (ex.: "integrar com o gateway de pagamento
280
+ X já contratado pela empresa" — uma restrição externa, não uma escolha de implementação livre),
281
+ mantenha-a no requisito. Toda decisão arquitetural/tecnológica encontrada nos passos 1-4 que não for
282
+ parte de um requisito vai para `## Decisions` como candidata a ADR — nunca embutida em
283
+ `Functional Requirements`/`Non-Functional Requirements`.
284
+
285
+ #### 5.2 — IDs estáveis (RF-/RNF-)
286
+
287
+ - Numere sequencialmente a partir de `RF-01` para requisitos funcionais e `RNF-01` para não
288
+ funcionais — uma sequência própria para cada prefixo, contínua por toda a Spec (não reinicia por
289
+ componente nem por seção).
290
+ - Quando o passo 3 identificou componentes, agrupe os RF-XX de cada componente sob um subtítulo com
291
+ o nome do componente (em vez de diluir os componentes num único bloco de requisitos), mas mantenha
292
+ a numeração global e sequencial — o agrupamento é só apresentação, não reinicia a sequência.
293
+ - IDs são estáveis: ao **refinar** uma Spec existente (nova rodada sobre um rascunho já gerado, ou
294
+ atualização via `create-spec`/edição manual), novos requisitos recebem o **próximo número
295
+ disponível**; nunca renumere um `RF-`/`RNF-` já existente para "abrir espaço" ou reordenar. Um
296
+ requisito removido deixa lacuna na numeração — isso é esperado e preferível a renumerar (mesmo
297
+ espírito de #202 §7: os IDs sustentarão futuramente `spec → requirement → task → code → test`).
298
+
299
+ #### 5.3 — Priority e Acceptance Criteria
300
+
301
+ - Toda seção de requisito usa `**Priority:** Must | Should | Could` (MoSCoW), derivada do que os
302
+ passos 1-4 sustentam: o que é indispensável ao Goal declarado é `Must`; o que foi mencionado como
303
+ desejável mas não essencial é `Should`; o que é especulativo/futuro é `Could`. Quando a prioridade
304
+ não puder ser inferida com confiança, prefira `Should` e registre
305
+ `⚠️ ABERTO: confirmar prioridade deste requisito` em `Open Questions` — nunca marque `Must` só
306
+ para "jogar seguro".
307
+ - Todo requisito `Must` tem **ao menos um** Acceptance Criteria verificável — binário, observável ou
308
+ com valor mensurável, nunca um adjetivo vago:
309
+
310
+ ```text
311
+ Evitar: "O sistema deve ser rápido."
312
+ Preferir: "Uma solicitação válida deve receber resposta em até 500 ms em condições normais."
313
+ ```
314
+
315
+ Quando o contexto ou a entrevista não permitiram determinar um valor concreto, **não omita o
316
+ critério** — escreva-o com a lacuna explícita, no mesmo checkbox:
317
+
318
+ ```text
319
+ - [ ] ⚠️ ABERTO: definir limite máximo aceitável para o tempo de resposta.
320
+ ```
321
+
322
+ - Requisitos `Should`/`Could` têm Acceptance Criteria quando o contexto sustentar; sua ausência não
323
+ exige justificativa nem `⚠️ ABERTO` — a obrigatoriedade desta regra é exclusiva de `Must`.
324
+
325
+ #### 5.4 — Edge Cases (contextuais)
326
+
327
+ Avalie, para cada requisito ou componente, quais destas categorias são plausíveis no domínio da
328
+ Spec — **sem exigir todas em toda feature**:
329
+
330
+ ```text
331
+ entrada inválida · ausência de dados · timeout · dependência indisponível · duplicidade ·
332
+ concorrência · retry · autenticação expirada · estado inconsistente
333
+ ```
334
+
335
+ - Inclua em `## Edge Cases` só as categorias com relevância real para o tema (ex.: uma Spec sem
336
+ chamada a serviço externo não precisa tratar "dependência indisponível"); para cada categoria
337
+ incluída, defina o comportamento esperado — nomear o caso sem descrever o comportamento não conta
338
+ como tratado.
339
+ - Se nenhuma categoria for relevante ao tema, não deixe a seção vazia silenciosamente — escreva
340
+ explicitamente algo como "Nenhum edge case relevante identificado para este tema" (mesmo princípio
341
+ de "vazio explícito, nunca omitido" já usado no passo 2 para as categorias de contexto).
342
+ - Nunca preencha a seção mecanicamente com as 9 categorias só para parecer completo — isso é padding
343
+ irrelevante, não Edge Case relevante ao domínio.
344
+
345
+ #### 5.5 — Non-Goals (sempre explícitos)
346
+
347
+ `## Non-Goals` nunca fica vazia. Derive ao menos uma entrada de:
348
+
349
+ - componentes identificados no passo 3 mas deliberadamente fora do escopo desta Spec;
350
+ - decisões tecnológicas/arquiteturais encontradas nos passos 1-4 e roteadas para `## Decisions`
351
+ (5.1) em vez de viraram requisito;
352
+ - fronteiras explícitas mencionadas em `Goals` ou na entrevista — o complemento natural de cada
353
+ Goal, isto é, o que ele deliberadamente não cobre.
354
+
355
+ Se a descoberta não sustentar nenhum Non-Goal específico, registre a fronteira mais óbvia do tema
356
+ (ex.: "Não cobre cenários fora do descrito em Goals") em vez de deixar a seção sem conteúdo. Isso
357
+ existe para impedir expansão silenciosa de escopo durante a implementação (#202 §10) — nunca é
358
+ opcional.
359
+
360
+ #### 5.6 — Demais seções
361
+
362
+ - **Título / Summary:** derive do tema e do contexto encontrado, em 1-2 frases.
363
+ - **Context:** síntese das fontes relevantes, citando os arquivos de origem.
364
+ - Demais seções do template (Goals, Users/Personas, Behavior/States, Data,
365
+ Integrations/Dependencies, Error Handling, Security/Privacy, Rollout, References): preencha o que
366
+ o contexto sustenta; onde a informação não existir, escreva explicitamente
367
+ `⚠️ ABERTO: <o que falta definir>` em vez de deixar a seção vazia ou inventar conteúdo.
368
+ - **Open Questions:** liste toda pergunta ainda sem resposta identificada durante a descoberta, a
369
+ decomposição (divergência residual do passo 3), a entrevista (lacunas marcadas `⚠️ ABERTO` no
370
+ passo 4) e as prioridades não confirmadas (5.3).
371
+ - **Revision History:** uma linha inicial com a data e "rascunho inicial gerado por /vetor:spec".
372
+
373
+ Mantenha a estrutura extensível — não invente seções obrigatórias fora do template, e não force
374
+ seções irrelevantes para um tema pequeno (ver `$SKILL_DIR/../../templates/spec.md`).
375
+
376
+ ### 6 — Apresentar o rascunho e persistir
377
+
378
+ Mostre o rascunho completo na conversa para revisão do usuário e pergunte se deseja salvá-lo. Explicite
379
+ o que esta versão da skill **não** cobre ainda, para não sugerir uma qualidade que ela ainda não
380
+ entrega:
381
+
382
+ - validação de qualidade (Quality Gate, dimension checkers, rastreabilidade — Handoff #203) e
383
+ refinamento iterativo a partir de feedback de qualidade;
384
+ - overwrite avançado (versionamento, merge automático de rascunhos divergentes) — o que existe é o
385
+ fluxo binário `update`/`create-new`/`cancel` abaixo, não um merge de conteúdo;
386
+ - Knowledge Provider além de filesystem (ex.: Obsidian, issue #225);
387
+ - geração de código a partir da Spec — esta skill só produz o documento; consumi-lo para gerar
388
+ Issues/Tasks/Worktree/Implementation é responsabilidade de um estágio posterior do workflow (ex.:
389
+ `issue-coordinator`), fora do escopo desta skill.
390
+
391
+ **Path previsível (issue #219):** com o Knowledge Provider `filesystem` (default, sem config
392
+ adicional), toda Spec é persistida em `docs/specs/<slug>.md` — o mesmo `<slug>` usado na identidade
393
+ `spec:<slug>`. Este path é a forma documentada de localizar a Spec fora da conversa (ex.: por um
394
+ humano, ou por uma etapa futura do workflow que venha a consumi-la).
395
+
396
+ **6.1 — Checar colisão de identidade antes de persistir**
397
+
398
+ Antes de chamar `create-spec`, sempre confira se a identidade já existe:
399
+
400
+ ```bash
401
+ deno run -A "$SKILL_DIR/../../scripts/knowledge-doc.ts" find spec:<slug-derivado-do-tema>
402
+ ```
403
+
404
+ Sem `--root` (default `docs`, mesmo default usado em 6.2/6.3 — nunca troque de root entre as três
405
+ chamadas, senão a checagem e a escrita podem mirar locais diferentes). O `<slug>` já deve estar
406
+ normalizado em kebab-case (o mesmo valor que será passado a `create-spec`/`update-spec` a seguir) —
407
+ `find` não normaliza como `create-spec` normaliza `--slug`; se o slug usado aqui divergir do
408
+ normalizado, a colisão real só será pega pelo fallback de 6.2.
409
+
410
+ - `null` → nenhuma colisão, siga direto para 6.2 (`create-spec`).
411
+ - Um resultado (`{"path": ..., "excerpt": ...}`) → existe uma Spec com esta identidade exata. Nunca
412
+ prossiga direto para `create-spec` (ele falharia) nem decida sozinho qual ação tomar — vá para 6.3
413
+ (decisão de overwrite).
414
+
415
+ **6.2 — Persistir (sem colisão)**
416
+
417
+ ```bash
418
+ # grave o rascunho completo em um arquivo temporário antes (evita problemas de quoting em
419
+ # heredoc com o conteúdo livre da Spec) e use-o como stdin:
420
+ deno run -A "$SKILL_DIR/../../scripts/knowledge-doc.ts" create-spec \
421
+ --slug <slug-derivado-do-tema> --project <nome-do-repositório> --status draft \
422
+ < <arquivo-temporário-com-o-rascunho>
423
+ ```
424
+
425
+ - O `slug` deriva do tema (kebab-case, ex.: "autenticação de usuários" → `autenticacao-de-usuarios`).
426
+ - O documento recebe frontmatter válido (`id`, `type: spec`, `project`, `status: draft`, `created`,
427
+ `updated`) e identidade estável `spec:<slug>`, localizável depois via
428
+ `knowledge-doc.ts find spec:<slug>`.
429
+ - Se o passo 1 encontrou um documento com relação clara ao tema (ex.: o ADR que rege a decisão, ou a
430
+ arquitetura específica do componente — não qualquer resultado incidental), passe
431
+ `--link <path-do-documento-relacionado>` para criar o link. Não linke indiscriminadamente: só
432
+ quando a relação for evidente a partir do que foi encontrado no passo 1. O path pode ser passado
433
+ tanto relativo à raiz do repositório (ex.: `docs/adr/001.md`, como reportado pelo passo 1) quanto
434
+ relativo à raiz do Knowledge Provider (ex.: `adr/001.md`) — o CLI normaliza um prefixo `docs/`
435
+ redundante automaticamente.
436
+ - Se `create-spec` mesmo assim falhar (corrida com outra sessão entre 6.1 e 6.2, por exemplo),
437
+ trate como colisão — vá para 6.3 — em vez de tentar sobrescrever por conta própria.
438
+ - Reporte ao usuário a identidade e o path onde a Spec foi salva.
439
+
440
+ **6.3 — Decisão de overwrite: `update` / `create-new` / `cancel`**
441
+
442
+ Nunca decida sozinho qual das três opções aplicar. Em modo **interativo**, use `AskUserQuestion` com
443
+ as três opções abaixo (uma pergunta, não texto livre); em modo **headless** — sem interlocutor para
444
+ responder (ex.: despachada de forma não-interativa por outro agente/skill) — **nunca assuma
445
+ `update`**: trate a ausência de resposta como `cancel`, reporte a colisão (identidade e path
446
+ existente) e pare, sem persistir nada. Silenciosamente sobrescrever é exatamente o que esta issue
447
+ proíbe.
448
+
449
+ ```
450
+ Já existe uma Spec com a identidade "spec:<slug>" (<path>). O que deseja fazer?
451
+
452
+ 1. update — sobrescrever o conteúdo desta Spec com o novo rascunho (mantém created, avança updated)
453
+ 2. create-new — manter a existente intacta e persistir este rascunho sob um novo slug
454
+ 3. cancel — não persistir nada; o rascunho continua disponível apenas nesta conversa
455
+ ```
456
+
457
+ - **`update`**: rode `update-spec` (mesmo `--slug`, corpo via stdin como em 6.2). Preserva
458
+ `id`/`type`/`project`/`created` do frontmatter existente e avança apenas `updated`; `status` só
459
+ muda se `--status` for passado explicitamente (ex.: usuário confirmou uma transição de `draft`
460
+ para `approved`). Também preserva qualquer linha `- Relacionado: <target>` já gravada no corpo por
461
+ um `create-spec --link` anterior, mesmo que o novo rascunho não a mencione — `update-spec` **não
462
+ adiciona** um link novo durante a atualização (limitação conhecida: vincular um documento
463
+ relacionado depois da criação ainda não tem um comando dedicado).
464
+
465
+ ```bash
466
+ deno run -A "$SKILL_DIR/../../scripts/knowledge-doc.ts" update-spec \
467
+ --slug <slug-derivado-do-tema> \
468
+ < <arquivo-temporário-com-o-rascunho>
469
+ ```
470
+
471
+ - **`create-new`**: pergunte (ou proponha) um novo `<slug>` que diferencie esta Spec da existente
472
+ (ex.: sufixo do tema, não um sufixo numérico arbitrário) e siga 6.2 normalmente com esse slug —
473
+ isso nunca é um comando novo, é o mesmo `create-spec`.
474
+ - **`cancel`**: não execute `create-spec` nem `update-spec`. Informe ao usuário que o rascunho
475
+ permanece apenas na conversa e pode ser retomado depois.
476
+ - Em qualquer uma das três opções, reporte ao usuário o resultado (identidade + path persistido, ou
477
+ confirmação de que nada foi gravado).
478
+
479
+ Quando o Knowledge Provider está desabilitado (passo 0.2), mantenha o comportamento anterior: **não
480
+ grava a Spec em disco** — o rascunho fica apenas na conversa, e 6.1-6.3 não se aplicam.
481
+
482
+ ---
483
+
484
+ ## Restrições
485
+
486
+ - Nunca afirme certeza sobre um requisito que o contexto descoberto não sustenta — marque como
487
+ `⚠️ ABERTO`.
488
+ - Nunca decida sozinho sobrescrever uma Spec existente — ao detectar colisão de identidade (passo
489
+ 6.1), sempre ofereça a escolha explícita `update`/`create-new`/`cancel` (passo 6.3) via
490
+ `AskUserQuestion` em modo interativo; em modo headless sem interlocutor, trate a ausência de
491
+ resposta como `cancel` — nunca como `update` implícito.
492
+ - Nunca acople a descoberta de contexto a um provider específico além de `FilesystemKnowledgeProvider`
493
+ (hoje o único implementado em `scripts/knowledge-doc.ts`).
494
+ - Nunca persista a Spec sem antes ter rodado a busca prévia do passo 1, item 5, **e** a checagem de
495
+ colisão por identidade exata do passo 6.1 — a busca do passo 1 é textual/aproximada, não substitui
496
+ a checagem por identidade.
497
+ - Nunca crie um link (`--link`) para um documento sem relação clara com o tema — vínculos
498
+ indiscriminados são piores que a ausência de vínculo.
499
+ - Nunca persista em disco quando o Knowledge Provider estiver desabilitado (passo 0.2) — apenas
500
+ apresente o rascunho na conversa.
501
+ - Nunca omita uma categoria de busca do relatório do passo 2, mesmo quando vazia.
502
+ - Nunca gere o rascunho (passo 5) sem antes apresentar a decomposição (passo 3) quando o tema for
503
+ grande (ver critério de "tema grande" no passo 3) — a confirmação do usuário é obrigatória, não
504
+ opcional. Temas atômicos (nenhum sinal de "grande") pulam os passos 3 e 4 legitimamente, direto
505
+ ao passo 5 — isso não viola esta restrição.
506
+ - Nunca ultrapasse 2 rodadas de ajuste na decomposição (passo 3) — ao atingir o limite, prossiga com
507
+ a última versão e registre a divergência em `Open Questions`.
508
+ - Nunca faça mais de 3 perguntas por componente na entrevista (passo 4) — ver `planning-conventions.md`
509
+ §3 ("Regra das 3 perguntas"). Ao esgotar o limite sem resposta suficiente, marque `⚠️ ABERTO` em vez
510
+ de perguntar de novo.
511
+ - Nunca pergunte quando a resposta não mudaria a Spec de forma significativa (ex.: não alteraria um
512
+ Acceptance Criteria, Non-Goal ou Edge Case) — prossiga com o que já foi descoberto.
513
+ - Nunca registre decisão tecnológica/arquitetural em `Functional Requirements`/
514
+ `Non-Functional Requirements` quando ela não for parte do próprio requisito — roteie para
515
+ `## Decisions` (5.1).
516
+ - Nunca renumere um `RF-`/`RNF-` já existente ao refinar uma Spec — novos requisitos recebem o
517
+ próximo número disponível da sequência; uma lacuna por remoção é aceitável (5.2).
518
+ - Nunca deixe um requisito `Must` sem Acceptance Criteria verificável — quando não houver valor
519
+ determinável, marque `⚠️ ABERTO` explicitamente no próprio checkbox em vez de omitir o critério
520
+ (5.3).
521
+ - Nunca preencha `## Edge Cases` mecanicamente com todas as categorias, nem a deixe vazia sem uma
522
+ frase explícita quando nenhuma for relevante ao tema (5.4).
523
+ - Nunca deixe `## Non-Goals` vazia — na ausência de achado específico, registre a fronteira mais
524
+ óbvia do tema (5.5).