@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,195 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec-validate
|
|
3
|
+
description: Valida a qualidade de uma Spec (RF/RNF, Acceptance Criteria, Non-Goals, Edge Cases) contra o Quality Model do Vetor — score 0-100 ponderado por dimensão e Quality Gate (READY/NEEDS_REFINEMENT/INCOMPLETE) — e reporta Strengths/Gaps/Suggestions.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Claude Code, OpenCode, Codex, Antigravity
|
|
6
|
+
metadata:
|
|
7
|
+
author: vitortavares
|
|
8
|
+
version: "1.0.0"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Você é a skill de validação de qualidade de Specs do Vetor (Handoff #203). Sua missão é ler uma
|
|
12
|
+
Spec já persistida em disco, computar seu score contra o Quality Model (5 dimensões ponderadas),
|
|
13
|
+
classificá-la no Quality Gate e reportar o resultado em Strengths/Gaps/Suggestions — nunca decidir
|
|
14
|
+
sozinho se a Spec "está boa o bastante": o Quality Gate é um mecanismo de decisão, quem age sobre o
|
|
15
|
+
resultado (refinar, seguir para implementação) é sempre o usuário ou a skill chamadora.
|
|
16
|
+
|
|
17
|
+
O Quality Model, o Quality Gate, a estrutura de saída (Score/Status/Strengths/Gaps/Suggestions —
|
|
18
|
+
#220), os dimension checkers heurísticos (#221: Must sem Acceptance Criteria, termos vagos sem
|
|
19
|
+
métrica mensurável, `⚠️ ABERTO` explícito vs. omissão silenciosa, Non-Goals ausente, Edge Cases
|
|
20
|
+
contextuais), o feedback estruturado por gap (`location`/`problem`/`impact`/`suggestedAction`), o
|
|
21
|
+
Quality Report em Markdown persistido separado da Spec e o refinamento iterativo com limite de 3
|
|
22
|
+
ciclos (#222) já estão completos e operacionais. O formato de metadados de rastreabilidade por
|
|
23
|
+
requisito (`id`/`priority`/`status`) e o Decision Log (#223) também estão preparados — ver
|
|
24
|
+
`references/traceability.md` —, mas **sem** integração real com Coordinator/Guardian: essa
|
|
25
|
+
integração é infraestrutura futura, não código funcional desta skill.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Sintaxe
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
/vetor:spec-validate <path>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
- `<path>`: caminho (relativo ao repositório) de uma Spec em markdown já persistida em disco (ex.:
|
|
36
|
+
`docs/specs/authentication.md`).
|
|
37
|
+
|
|
38
|
+
Também invocável como etapa interna de `/vetor:spec` (uso futuro, quando #216-#219 estiverem
|
|
39
|
+
mergeados e a skill `spec` passar a chamar esta validação antes de apresentar o rascunho final ao
|
|
40
|
+
usuário) — nesse caso, a mesma CLI abaixo é chamada, só que a partir do fluxo de `/vetor:spec` em
|
|
41
|
+
vez de invocação direta pelo usuário.
|
|
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
|
+
- `../../scripts/spec-validate.ts` — CLI que expõe o Quality Model e os dimension
|
|
56
|
+
checkers (`scripts/lib/spec-quality.ts`, `scripts/lib/spec-quality-checkers.ts`,
|
|
57
|
+
`scripts/lib/spec-parser.ts`). Uma `SKILL.md` é prosa interpretada por um agente — não pode
|
|
58
|
+
importar módulos TypeScript diretamente (mesmo padrão de `scripts/knowledge-doc.ts` para
|
|
59
|
+
`skills/spec/SKILL.md`).
|
|
60
|
+
- `templates/spec.md` — esqueleto que os dimension checkers assumem ao fazer o parsing heurístico
|
|
61
|
+
(headings `## Nome da Seção`, requisitos `### RF-NN - <nome>` / `### RNF-NN - <nome>`).
|
|
62
|
+
- `references/traceability.md` — formato de metadados de
|
|
63
|
+
requisito (`id`/`priority`/`status`), Decision Log (`DEC-NN`) e os pontos de extensão futuros
|
|
64
|
+
para Coordinator (RF→Task) e Guardian (Spec Drift) — #223, preparação sem integração real.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Comportamento
|
|
69
|
+
|
|
70
|
+
### 1 — Rodar o Quality Model
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
deno run -A "$SKILL_DIR/../../scripts/spec-validate.ts" <path> [--config <path-do-config>] [--history <path>]
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
- `<path>`: obrigatório — path para a Spec em markdown.
|
|
77
|
+
- `--config`: opcional — path para `.claude/vetor/config.json` (default), de onde os thresholds do
|
|
78
|
+
Quality Gate são lidos (ver passo 3). Path inexistente/config sem a chave usam os thresholds
|
|
79
|
+
default.
|
|
80
|
+
- `--history`: opcional — sobrescreve onde o histórico de validação é persistido (default:
|
|
81
|
+
derivado da raiz do repositório git + path da Spec, `<git-toplevel>/.claude/vetor/specs/
|
|
82
|
+
<slug>.validation.json` — não do cwd do processo, para que duas invocações a partir de
|
|
83
|
+
subdiretórios diferentes do mesmo checkout encontrem o mesmo histórico). `<slug>` é o path
|
|
84
|
+
relativo da Spec sem extensão, com `/` virando `-` (`validationPathFor`, spec-quality-
|
|
85
|
+
persistence.ts) — não só o basename, para que duas Specs de mesmo nome em pastas diferentes não
|
|
86
|
+
colidam no mesmo histórico (#269). Use `--history` só em cenário de teste/automação; em uso
|
|
87
|
+
normal, deixe o CLI derivar o path sozinho.
|
|
88
|
+
|
|
89
|
+
O CLI lê a Spec, faz o parsing heurístico (`spec-parser.ts`), roda os 5 dimension checkers
|
|
90
|
+
(`spec-quality-checkers.ts`) e agrega o resultado no Quality Model (`spec-quality.ts`), imprimindo
|
|
91
|
+
o Quality Report em Markdown na saída padrão (`spec-quality-report.ts`). Se o path não existir ou
|
|
92
|
+
não puder ser lido, o CLI termina com exit code 1 e uma mensagem de erro — repasse-a ao usuário sem
|
|
93
|
+
tentar adivinhar o path correto por conta própria.
|
|
94
|
+
|
|
95
|
+
### 2 — Quality Model
|
|
96
|
+
|
|
97
|
+
Score final é `0-100`, soma ponderada de 5 dimensões (`DIMENSION_WEIGHTS` em `spec-quality.ts`,
|
|
98
|
+
#203 §2):
|
|
99
|
+
|
|
100
|
+
| Dimensão | Peso |
|
|
101
|
+
| ------------ | ---: |
|
|
102
|
+
| Completeness | 30 |
|
|
103
|
+
| Testability | 25 |
|
|
104
|
+
| Clarity | 20 |
|
|
105
|
+
| Scope | 15 |
|
|
106
|
+
| Edge Cases | 10 |
|
|
107
|
+
|
|
108
|
+
Cada dimensão é avaliada por um checker independente que devolve uma fração `0-1` de quanto foi
|
|
109
|
+
satisfeita; o score da dimensão é `fraction × peso`, arredondado. A soma das 5 dimensões nunca
|
|
110
|
+
ultrapassa 100.
|
|
111
|
+
|
|
112
|
+
### 3 — Quality Gate
|
|
113
|
+
|
|
114
|
+
Classificação operacional a partir do score (`gateFor` em `spec-quality.ts`, #203 §3):
|
|
115
|
+
|
|
116
|
+
```text
|
|
117
|
+
80-100 → READY
|
|
118
|
+
60-79 → NEEDS_REFINEMENT
|
|
119
|
+
0-59 → INCOMPLETE
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Os thresholds são configuráveis via `.claude/vetor/config.json`:
|
|
123
|
+
|
|
124
|
+
```json
|
|
125
|
+
{
|
|
126
|
+
"specValidate": {
|
|
127
|
+
"thresholds": { "ready": 80, "needsRefinement": 60 }
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Um override parcial (ex.: só `ready`) preserva o default para o campo omitido — nunca assuma que a
|
|
133
|
+
ausência de `specValidate` no config é um erro, é o caso comum (default aplicado silenciosamente).
|
|
134
|
+
|
|
135
|
+
### 4 — Apresentar o resultado
|
|
136
|
+
|
|
137
|
+
Reproduza o Quality Report emitido pelo CLI ao usuário — não resuma nem edite os números nem os
|
|
138
|
+
gaps. Cada gap listado já vem estruturado (`location`/`problem`/`impact`/`suggestedAction`, #203
|
|
139
|
+
§9) — nunca substitua esse detalhe por uma frase genérica tipo "a Spec precisa melhorar". O relato
|
|
140
|
+
sempre inclui, no mínimo:
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
Score: <N>/100
|
|
144
|
+
Status: <READY|NEEDS_REFINEMENT|INCOMPLETE>
|
|
145
|
+
|
|
146
|
+
## Strengths
|
|
147
|
+
...
|
|
148
|
+
|
|
149
|
+
## Gaps
|
|
150
|
+
- **<location>**: <problem>
|
|
151
|
+
- Impact: <impact>
|
|
152
|
+
- Suggested action: <suggestedAction>
|
|
153
|
+
|
|
154
|
+
## Suggestions
|
|
155
|
+
...
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### 5 — Refinamento iterativo (limite de 3 ciclos)
|
|
159
|
+
|
|
160
|
+
Quando `Status` for `NEEDS_REFINEMENT` ou `INCOMPLETE`, o ciclo `validate → gaps → refine →
|
|
161
|
+
validate` (#203 §10) pode se repetir **no máximo 3 vezes** (`MAX_REFINEMENT_CYCLES` em
|
|
162
|
+
`spec-quality-report.ts`) além da validação inicial:
|
|
163
|
+
|
|
164
|
+
1. Rode o passo 1. Se `Status` for `READY`, pare — não há necessidade de refinar.
|
|
165
|
+
2. Caso contrário, aplique **uma** correção objetiva a partir de um `Gap` do relatório (edite a
|
|
166
|
+
Spec você mesmo ou peça ao usuário, conforme o contexto de quem chamou esta skill).
|
|
167
|
+
3. Rode o passo 1 de novo, **sempre com o mesmo `<path>`** (o CLI deriva o mesmo arquivo de
|
|
168
|
+
histórico automaticamente a partir do path da Spec — não passe `--history` em uso normal).
|
|
169
|
+
4. O Quality Report da segunda chamada em diante inclui `## Refinement History` com a evolução do
|
|
170
|
+
score (ex.: `54 → 71 → 84`). Repita os passos 2-3 até `READY` ou até o CLI imprimir a mensagem de
|
|
171
|
+
limite de ciclos atingido.
|
|
172
|
+
5. Se o CLI sinalizar que o limite foi atingido, **pare** — não invente uma 5ª validação. Informe ao
|
|
173
|
+
usuário que a Spec precisa de revisão manual; esta skill nunca decide sozinha refinar além do
|
|
174
|
+
limite.
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Restrições
|
|
179
|
+
|
|
180
|
+
- Nunca decida sozinho que uma Spec `NEEDS_REFINEMENT`/`INCOMPLETE` pode seguir para implementação
|
|
181
|
+
mesmo assim — o Quality Gate é informativo para quem decide (usuário ou skill chamadora), não uma
|
|
182
|
+
trava automática nesta versão.
|
|
183
|
+
- Nunca edite a Spec original a partir desta skill fora do ciclo de refinamento explícito do passo
|
|
184
|
+
5 — validação é somente leitura por padrão; qualquer edição fora desse ciclo é responsabilidade
|
|
185
|
+
de quem chamou (`/vetor:spec` ou o usuário diretamente).
|
|
186
|
+
- Nunca invente um score, gate ou gap fora do que o CLI (`scripts/spec-validate.ts`) reportou.
|
|
187
|
+
- Nunca substitua o `problem`/`impact`/`suggestedAction` de um gap por uma frase genérica — o
|
|
188
|
+
Handoff #203 §9 proíbe explicitamente saída tipo "Spec precisa ser melhorada" sem especificar
|
|
189
|
+
location/problem/impact/ação.
|
|
190
|
+
- Nunca trate a ausência de `specValidate.thresholds` no config como erro — é o caso default,
|
|
191
|
+
silenciosamente resolvido para `{ ready: 80, needsRefinement: 60 }`.
|
|
192
|
+
- Nunca ultrapasse `MAX_REFINEMENT_CYCLES` (3) ciclos de refinamento automático — ao atingir o
|
|
193
|
+
limite, pare e escale para revisão manual em vez de insistir em mais uma tentativa.
|
|
194
|
+
- Nunca escreva o Quality Report dentro do arquivo da Spec — ele é sempre persistido separado
|
|
195
|
+
(`scripts/lib/spec-quality-persistence.ts`), nunca misturado ao conteúdo da Spec.
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# Rastreabilidade Spec → Task → Code → Test (#223, preparação)
|
|
2
|
+
|
|
3
|
+
Este documento descreve o formato e os pontos de extensão preparados por #223 (Handoff #203
|
|
4
|
+
§13-§18). **Nenhuma integração real está implementada aqui** — nem transformação de requirement em
|
|
5
|
+
task pelo Coordinator, nem detecção de Spec Drift pelo Guardian. O que existe é o formato de dados
|
|
6
|
+
e as garantias que essas integrações futuras vão poder assumir, implementadas em
|
|
7
|
+
`scripts/lib/spec-traceability.ts`.
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
Spec
|
|
11
|
+
│
|
|
12
|
+
├── RF-01
|
|
13
|
+
├── RF-02
|
|
14
|
+
└── RF-03
|
|
15
|
+
│
|
|
16
|
+
▼
|
|
17
|
+
Task (Coordinator — §2, não implementado)
|
|
18
|
+
│
|
|
19
|
+
▼
|
|
20
|
+
Code
|
|
21
|
+
│
|
|
22
|
+
▼
|
|
23
|
+
Test
|
|
24
|
+
│
|
|
25
|
+
▼
|
|
26
|
+
Guardian (§3, não implementado)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 1. Metadados por requisito
|
|
32
|
+
|
|
33
|
+
Cada requisito (`RF-NN`/`RNF-NN`, ver `templates/spec.md` e `skills/spec/SKILL.md` §5.2) pode
|
|
34
|
+
carregar metadados de rastreabilidade:
|
|
35
|
+
|
|
36
|
+
```yaml
|
|
37
|
+
id: RF-01
|
|
38
|
+
priority: must
|
|
39
|
+
status: planned
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
- `id`: o mesmo identificador estável já usado pelo motor de geração de `/vetor:spec` — nunca é
|
|
43
|
+
renumerado (ver `skills/spec/SKILL.md` §5.2).
|
|
44
|
+
- `priority`: `must | should | could` (MoSCoW), mesma semântica de `**Priority:**` no template.
|
|
45
|
+
- `status`: um de `planned | confirmed | implemented | verified` (`RequirementStatus` em
|
|
46
|
+
`scripts/lib/spec-traceability.ts`).
|
|
47
|
+
|
|
48
|
+
**Garantia central:** o `id` nunca muda através de nenhuma transição de `status`. `RF-01` continua
|
|
49
|
+
`RF-01` depois de implementado e verificado — só o campo `status` evolui.
|
|
50
|
+
`transitionRequirementStatus(metadata, novoStatus)` (spec-traceability.ts) formaliza essa garantia:
|
|
51
|
+
devolve um novo objeto com `status` atualizado e `id`/`priority` preservados, sem mutar o original.
|
|
52
|
+
|
|
53
|
+
A ordem sugerida de estados (`REQUIREMENT_STATUSES`) é um fluxo recomendado, não uma máquina de
|
|
54
|
+
estados imposta — `transitionRequirementStatus` não valida que a transição segue essa ordem (ex.:
|
|
55
|
+
pular de `planned` direto para `verified`). Impor ou não essa ordem é decisão de quem consumir este
|
|
56
|
+
módulo no futuro (Coordinator, Guardian), não deste módulo em si.
|
|
57
|
+
|
|
58
|
+
Onde esses metadados vivem fisicamente (frontmatter YAML por requisito, um arquivo `.json` paralelo
|
|
59
|
+
à Spec, ou embutido no Quality Report — ver `skills/shared/references/knowledge-provider-contract.md`
|
|
60
|
+
para o precedente de persistência do Vetor) é uma decisão de implementação para quando a integração
|
|
61
|
+
real (item 2 ou 3) for construída — esta issue não fixa esse formato de armazenamento, só a forma
|
|
62
|
+
(`RequirementMetadata`) e a garantia de estabilidade do `id`.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 2. Ponto de extensão: Coordinator (RF → Task)
|
|
67
|
+
|
|
68
|
+
Fluxo futuro:
|
|
69
|
+
|
|
70
|
+
```text
|
|
71
|
+
RF-01
|
|
72
|
+
↓
|
|
73
|
+
Task: Implement user registration
|
|
74
|
+
|
|
75
|
+
RF-02
|
|
76
|
+
↓
|
|
77
|
+
Task: Implement email verification
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
O `issue-coordinator` (`skills/issue-coordinator/SKILL.md`) já despacha issues do GitHub para
|
|
81
|
+
workers isolados; a extensão futura é a **origem** dessas issues poder ser um requisito de Spec
|
|
82
|
+
(`RF-NN`) em vez de uma issue criada manualmente. Para isso, cada task despachada precisaria
|
|
83
|
+
referenciar o `id` do requisito que a originou — por exemplo, um campo `sourceRequirement: RF-01`
|
|
84
|
+
na issue do GitHub ou no corpo da task.
|
|
85
|
+
|
|
86
|
+
**Não implementado nesta issue** — geraria uma mudança grande no `issue-coordinator` (que hoje só
|
|
87
|
+
conhece issues do GitHub, não requisitos de Spec) fora do escopo de #223. O que fica pronto é a
|
|
88
|
+
garantia de que `RF-01` é um identificador estável o bastante para ser citado por uma task futura
|
|
89
|
+
sem risco de a referência quebrar quando a Spec evoluir (ver item 1).
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 3. Ponto de extensão: Guardian (Spec Drift)
|
|
94
|
+
|
|
95
|
+
Fluxo futuro:
|
|
96
|
+
|
|
97
|
+
```text
|
|
98
|
+
Spec
|
|
99
|
+
│
|
|
100
|
+
▼
|
|
101
|
+
Implementation
|
|
102
|
+
│
|
|
103
|
+
▼
|
|
104
|
+
Guardian
|
|
105
|
+
│
|
|
106
|
+
├── RF-01 ✅
|
|
107
|
+
├── RF-02 ✅
|
|
108
|
+
├── RF-03 ⚠️
|
|
109
|
+
└── RF-04 ❌
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
O `guardian` (`skills/guardian/SKILL.md`) hoje audita gaps que o pre-commit não cobre (JSON
|
|
113
|
+
inválido, migrations, worktrees órfãos, etc.). A extensão futura é ele também poder avaliar, por
|
|
114
|
+
requisito:
|
|
115
|
+
|
|
116
|
+
- **requirement sem implementação aparente** (`status: planned`/`confirmed` há muito tempo sem
|
|
117
|
+
commit relacionado);
|
|
118
|
+
- **código sem requirement correspondente** (mudança de comportamento sem `RF-`/`RNF-` que a
|
|
119
|
+
explique);
|
|
120
|
+
- **teste ausente** (`status: implemented` sem cobertura de teste correspondente);
|
|
121
|
+
- **Spec Drift**: divergência relevante entre o comportamento especificado e o
|
|
122
|
+
implementado/documentado. Exemplo:
|
|
123
|
+
|
|
124
|
+
```text
|
|
125
|
+
Spec:
|
|
126
|
+
RF-03 → mensagens devem utilizar processamento assíncrono.
|
|
127
|
+
|
|
128
|
+
Code:
|
|
129
|
+
implementação utiliza chamada síncrona.
|
|
130
|
+
|
|
131
|
+
Guardian:
|
|
132
|
+
⚠️ POSSIBLE SPEC DRIFT
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Não implementado nesta issue** — exigiria análise semântica de código (comparar comportamento
|
|
136
|
+
declarado vs. implementado), explicitamente fora do escopo de #223 (Handoff #203 §16-§17: "não
|
|
137
|
+
implementar ainda análise semântica completa do código"). O que fica pronto é o formato de
|
|
138
|
+
metadados (`status`) sobre o qual essa análise futura poderia se apoiar.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 4. Decision Log
|
|
143
|
+
|
|
144
|
+
Alterações importantes na Spec (decisões arquiteturais, mudanças de escopo) podem ser registradas
|
|
145
|
+
num log minimalista, formato `DEC-NN` (mesma disciplina de IDs estáveis do item 1):
|
|
146
|
+
|
|
147
|
+
```markdown
|
|
148
|
+
### DEC-01
|
|
149
|
+
|
|
150
|
+
Date: 2026-09-16
|
|
151
|
+
|
|
152
|
+
Decision:
|
|
153
|
+
...
|
|
154
|
+
|
|
155
|
+
Reason:
|
|
156
|
+
...
|
|
157
|
+
|
|
158
|
+
Impact:
|
|
159
|
+
...
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
`renderDecisionLogEntry`/`applyDecisionLogEntry` (`scripts/lib/spec-traceability.ts`) formalizam a
|
|
163
|
+
renderização e a regra de que uma nova decisão sempre vai para o **final** do log, nunca substitui
|
|
164
|
+
ou reordena entradas anteriores — mesmo espírito de nunca renumerar `RF-`/`RNF-` existentes.
|
|
165
|
+
|
|
166
|
+
Quando uma decisão registrada aqui for arquitetural, o fluxo poderá **futuramente** gerar um ADR
|
|
167
|
+
(`skills/architecture-review/`, se existir no projeto) — esta issue não implementa essa
|
|
168
|
+
transformação automática (Handoff #203 §18: "não transformar esta issue em implementação completa
|
|
169
|
+
de ADR").
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stack-practices
|
|
3
|
+
description: Detecta as libs/frameworks estruturais do projeto e grava regras de melhores práticas via Context7 (conhecimento externo, path-scoped, separado das rules factuais do /vetor).
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Claude Code
|
|
6
|
+
metadata:
|
|
7
|
+
author: vitortavares
|
|
8
|
+
version: "1.0.0"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Você é a skill de melhores práticas de stack do Vetor. Sua missão é detectar as libs/frameworks
|
|
12
|
+
estruturais do projeto-alvo, consultar o Context7 para cada uma e gravar regras de melhores
|
|
13
|
+
práticas — rotuladas explicitamente como conhecimento externo, nunca misturadas às rules factuais
|
|
14
|
+
que o `/vetor` já gera.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Sintaxe
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
/vetor:stack-practices [--refresh]
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- sem flag: só gera regras para libs que ainda não têm arquivo em
|
|
25
|
+
`.claude/rules/vetor/best-practices/`.
|
|
26
|
+
- `--refresh`: força reconsulta ao Context7 e sobrescreve as regras já existentes — melhores
|
|
27
|
+
práticas envelhecem com o tempo, diferente das rules factuais de `/vetor` (que só mudam quando o
|
|
28
|
+
repo muda).
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Referências
|
|
33
|
+
|
|
34
|
+
> Paths relativos abaixo resolvem a partir do diretório desta própria skill (informado ao carregar,
|
|
35
|
+
> ex. "Base directory for this skill: ..."), não do `cwd` de execução. Em comandos `bash`/`deno run`,
|
|
36
|
+
> prefixe o path absoluto desse diretório ao caminho relativo antes de executar — defina uma vez:
|
|
37
|
+
> ```bash
|
|
38
|
+
> SKILL_DIR="<path absoluto informado como 'Base directory for this skill' no carregamento>"
|
|
39
|
+
> ```
|
|
40
|
+
> e use `"$SKILL_DIR/../../scripts/..."` em todo comando abaixo, nunca o path relativo isolado.
|
|
41
|
+
|
|
42
|
+
- `../shared/references/mcp-availability.md` — mecanismo de checagem de
|
|
43
|
+
disponibilidade do Context7 ("Documentação de ferramentas/libs (Context7)"). Esta skill é uma das
|
|
44
|
+
que tornam o Context7 **obrigatório quando disponível** — nunca usa conhecimento pré-treinado do
|
|
45
|
+
agente como fonte de melhor prática, com ou sem o MCP.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Comportamento
|
|
50
|
+
|
|
51
|
+
### 1 — Detectar libs/frameworks estruturais
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
deno run -A "$SKILL_DIR/../../scripts/lib/deps.ts" .
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
(ou, dentro de outra skill/script Deno, importe `detectStructuralDeps` de
|
|
58
|
+
`scripts/lib/deps.ts`). O detector cruza `package.json`, `deno.json`/`deno.jsonc`,
|
|
59
|
+
`pyproject.toml` e `Cargo.toml` e devolve só o punhado de dependências diretas *estruturais* —
|
|
60
|
+
frameworks web, ORMs, a lib de UI principal — nunca toda dependência declarada nem dependências
|
|
61
|
+
transitivas. Uma rule por utilitário/dependência transitiva infla o contexto sem ganho; o escopo
|
|
62
|
+
é deliberadamente restrito ao mesmo allowlist do detector.
|
|
63
|
+
|
|
64
|
+
Sem `--refresh`, filtre a lista às libs que ainda **não** têm arquivo em
|
|
65
|
+
`.claude/rules/vetor/best-practices/<lib>.md`. Com `--refresh`, mantenha a lista inteira.
|
|
66
|
+
|
|
67
|
+
Se a lista resultante estiver vazia (nenhuma lib estrutural detectada, ou todas já têm regra e não
|
|
68
|
+
foi passado `--refresh`), reporte e pare — nada a fazer.
|
|
69
|
+
|
|
70
|
+
### 2 — Checar disponibilidade do Context7
|
|
71
|
+
|
|
72
|
+
Siga o mecanismo de `mcp-availability.md`: procure por qualquer ferramenta com prefixo
|
|
73
|
+
`mcp__context7__` (direta ou diferida via `ToolSearch`).
|
|
74
|
+
|
|
75
|
+
**Se não disponível:** não gere nenhuma regra para as libs afetadas. Reporte a limitação no
|
|
76
|
+
resultado final ("Context7 indisponível — nenhuma regra de melhores práticas gerada para: <libs>")
|
|
77
|
+
e pare. **Nunca** escreva melhor prática com base no conhecimento pré-treinado do agente como
|
|
78
|
+
fallback — o risco de estar desatualizado para a versão exata em uso é exatamente o que esta skill
|
|
79
|
+
existe para evitar.
|
|
80
|
+
|
|
81
|
+
### 3 — Consultar o Context7 por lib
|
|
82
|
+
|
|
83
|
+
Para cada lib da lista do passo 1:
|
|
84
|
+
|
|
85
|
+
1. `mcp__context7__resolve-library-id` para achar o library ID a partir do nome (e, se disponível
|
|
86
|
+
na resposta, restrinja pela versão detectada no passo 1).
|
|
87
|
+
2. `mcp__context7__query-docs` com uma pergunta específica e escopada, no estilo "práticas atuais
|
|
88
|
+
recomendadas e APIs deprecated para `<lib>` versão `<versão>`" — nunca uma pergunta genérica que
|
|
89
|
+
force o Context7 a devolver um resumo raso.
|
|
90
|
+
|
|
91
|
+
Se a resolução ou a query falharem para uma lib específica (lib não indexada, erro transiente),
|
|
92
|
+
**pule só aquela lib** — reporte a falha no resultado e continue com as demais. Uma lib com erro
|
|
93
|
+
nunca bloqueia a geração das regras das outras.
|
|
94
|
+
|
|
95
|
+
### 4 — Gravar a regra
|
|
96
|
+
|
|
97
|
+
Para cada lib com resposta do Context7, escreva `.claude/rules/vetor/best-practices/<lib>.md`:
|
|
98
|
+
|
|
99
|
+
```markdown
|
|
100
|
+
---
|
|
101
|
+
paths:
|
|
102
|
+
- "<globs relevantes à lib, ex. '**/*.tsx' para uma lib de UI React>"
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
> Gerado por `/vetor:stack-practices` a partir da documentação de <lib>@<versão> via Context7 em <data ISO>.
|
|
106
|
+
> Conhecimento externo, não um fato observado neste repositório — pode ficar desatualizado.
|
|
107
|
+
> Rode `/vetor:stack-practices --refresh` periodicamente. Editável — não sobrescrito sem `--refresh`.
|
|
108
|
+
|
|
109
|
+
# Melhores práticas — <lib>@<versão>
|
|
110
|
+
|
|
111
|
+
- <bullet curto e citável, só o que o Context7 retornou como prática atual documentada>
|
|
112
|
+
- <...>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Regras:
|
|
116
|
+
- Cabeçalho de proveniência (as 3 linhas `>`) é obrigatório e distinto do `ORIGIN` usado pelas
|
|
117
|
+
rules factuais de `scripts/lib/rules.ts` — nunca escreva regra de melhor prática no mesmo arquivo
|
|
118
|
+
`.claude/rules/vetor/<runtime>.md` gerado pelo `/vetor`, cuja regra de ouro é "só fato observado
|
|
119
|
+
localmente". `.claude/rules/vetor/best-practices/` é um diretório à parte.
|
|
120
|
+
- `<data ISO>` é a data da consulta, não uma data fixa — usada depois pelo guardian para medir
|
|
121
|
+
staleness (passo 5).
|
|
122
|
+
- Bullets refletem só o que a fonte (Context7) disse — nunca elaboração ou inferência do agente
|
|
123
|
+
além do que a resposta retornou.
|
|
124
|
+
- Sem `--refresh`, nunca sobrescreva um arquivo já existente para a mesma lib.
|
|
125
|
+
|
|
126
|
+
### 5 — Sinalizar staleness no guardian (referência cruzada)
|
|
127
|
+
|
|
128
|
+
Esta skill não roda o guardian. A auditoria de staleness (regra de melhor prática com mais de 90
|
|
129
|
+
dias desde a última consulta) já está documentada em `skills/guardian/SKILL.md` — nenhuma ação
|
|
130
|
+
extra aqui, além de manter a data no cabeçalho (passo 4) precisa e atualizada a cada
|
|
131
|
+
`--refresh`, já que é o dado que o guardian lê.
|
|
132
|
+
|
|
133
|
+
### 6 — Reportar
|
|
134
|
+
|
|
135
|
+
Ao final, resuma:
|
|
136
|
+
- Libs detectadas no passo 1 e quais já tinham regra (puladas, sem `--refresh`).
|
|
137
|
+
- Libs com regra gerada/atualizada nesta execução, com a versão consultada.
|
|
138
|
+
- Libs puladas por falha de resolução/query no Context7 (passo 3).
|
|
139
|
+
- Se o Context7 não estava disponível: a lista completa de libs sem regra por esse motivo (passo 2).
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Restrições
|
|
144
|
+
|
|
145
|
+
- Nunca gera regra de melhor prática sem o Context7 disponível — sem exceção, sem fallback de
|
|
146
|
+
conhecimento pré-treinado.
|
|
147
|
+
- Nunca escreve em `.claude/rules/vetor/<runtime>.md` (rules factuais do `/vetor`) — só em
|
|
148
|
+
`.claude/rules/vetor/best-practices/`.
|
|
149
|
+
- Nunca gera regra para dependência transitiva ou utilitária fora do allowlist estrutural do
|
|
150
|
+
detector (`scripts/lib/deps.ts`).
|
|
151
|
+
- Sem `--refresh`, nunca sobrescreve uma regra já existente.
|