@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,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.