@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,99 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Tabela de monitoramento do issue-coordinator, construída de fontes externas
|
|
3
|
+
# (status files + git worktree list) — não de estado em memória. Rodar no root.
|
|
4
|
+
#
|
|
5
|
+
# Uso: vetor-status.sh
|
|
6
|
+
# Saída: tabela markdown com uma linha por status file em .claude/vetor/status/.
|
|
7
|
+
# Worktree correspondente removido manualmente -> "cancelled (worktree removed)".
|
|
8
|
+
# Worktree sem status file -> ⚠️ WARNING (possível falha anômala, issue #72).
|
|
9
|
+
|
|
10
|
+
set -uo pipefail
|
|
11
|
+
|
|
12
|
+
STATUS_DIR=".claude/vetor/status"
|
|
13
|
+
|
|
14
|
+
# Branch principal (main worktree) — excluída da lista de workers ativos.
|
|
15
|
+
default_branch=$(git symbolic-ref --short HEAD 2>/dev/null || echo "")
|
|
16
|
+
|
|
17
|
+
# Branches com worktree ativo (workers), sanitizadas com a mesma convenção dos status files (/ -> -).
|
|
18
|
+
# Exclui a branch principal do repositório.
|
|
19
|
+
active=$(git worktree list --porcelain | sed -n 's#^branch refs/heads/##p' | tr '/' '-' | grep -v "^${default_branch}$")
|
|
20
|
+
|
|
21
|
+
# Busca a lista de PRs abertos ou mergeados via gh CLI (uma única chamada para otimizar).
|
|
22
|
+
# Mapeia headRefName (sanitizado / -> -) para number e state.
|
|
23
|
+
prs=$(gh pr list --state all --json headRefName,number,state -q '.[] | "\(.headRefName | gsub("/"; "-"))=\(.number)=\(.state)"' 2>/dev/null || echo "")
|
|
24
|
+
|
|
25
|
+
echo "## Status — $(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
26
|
+
echo
|
|
27
|
+
|
|
28
|
+
if [ ! -d "$STATUS_DIR" ] || ! ls "$STATUS_DIR"/*.md >/dev/null 2>&1; then
|
|
29
|
+
# Sem status files — verificar se há worktrees ativos sem status (falha anômala)
|
|
30
|
+
if [ -n "$active" ]; then
|
|
31
|
+
echo "⚠️ **ALERTA: worktrees ativos sem status file (possível falha anômala — issue #72):**"
|
|
32
|
+
echo
|
|
33
|
+
echo "| Worker (branch) | Status | Worktree |"
|
|
34
|
+
echo "|---|---|---|"
|
|
35
|
+
while IFS= read -r branch; do
|
|
36
|
+
echo "| $branch | ⚠️ SEM STATUS FILE | ativo |"
|
|
37
|
+
done <<< "$active"
|
|
38
|
+
echo
|
|
39
|
+
else
|
|
40
|
+
echo "(nenhum status file em $STATUS_DIR)"
|
|
41
|
+
fi
|
|
42
|
+
exit 0
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
echo "| Worker (branch) | Status | Iteração | Última ação | Worktree |"
|
|
46
|
+
echo "|---|---|---|---|---|"
|
|
47
|
+
|
|
48
|
+
# Rastrear branches que já apareceram em status files (compatível com bash 3.2)
|
|
49
|
+
seen_branches=""
|
|
50
|
+
|
|
51
|
+
for f in "$STATUS_DIR"/*.md; do
|
|
52
|
+
name=$(basename "$f" .md)
|
|
53
|
+
status=$(sed -n 's/^Status: *//p' "$f" | head -1 | tr -d '\r')
|
|
54
|
+
iter=$(sed -n 's/^Iteration: *//p' "$f" | head -1 | tr -d '\r')
|
|
55
|
+
last=$(sed -n 's/^Last action: *//p' "$f" | head -1 | tr -d '\r')
|
|
56
|
+
if printf '%s\n' "$active" | grep -qx "$name"; then
|
|
57
|
+
wt="ativo"
|
|
58
|
+
else
|
|
59
|
+
wt="cancelled (worktree removed)"
|
|
60
|
+
fi
|
|
61
|
+
seen_branches="${seen_branches}${name}
|
|
62
|
+
"
|
|
63
|
+
|
|
64
|
+
if [ "$status" = "GREEN" ] && [ -n "$prs" ]; then
|
|
65
|
+
pr_info=$(printf '%s\n' "$prs" | grep "^${name}=" | head -1 || echo "")
|
|
66
|
+
if [ -n "$pr_info" ]; then
|
|
67
|
+
pr_num=$(printf '%s\n' "$pr_info" | cut -d'=' -f2)
|
|
68
|
+
pr_state=$(printf '%s\n' "$pr_info" | cut -d'=' -f3)
|
|
69
|
+
if [ "$pr_state" = "OPEN" ]; then
|
|
70
|
+
status="GREEN (PR #${pr_num} aberta)"
|
|
71
|
+
elif [ "$pr_state" = "MERGED" ]; then
|
|
72
|
+
status="GREEN (já mergeado via #${pr_num})"
|
|
73
|
+
fi
|
|
74
|
+
fi
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
echo "| $name | ${status:-?} | ${iter:--} | ${last:--} | $wt |"
|
|
78
|
+
done
|
|
79
|
+
|
|
80
|
+
# Detectar worktrees ativos sem nenhum status file (possível falha anômala — issue #72)
|
|
81
|
+
missing_status=""
|
|
82
|
+
while IFS= read -r branch; do
|
|
83
|
+
if ! printf '%s\n' "$seen_branches" | grep -qx "$branch"; then
|
|
84
|
+
missing_status="${missing_status}${branch}
|
|
85
|
+
"
|
|
86
|
+
fi
|
|
87
|
+
done <<< "$active"
|
|
88
|
+
|
|
89
|
+
if [ -n "$missing_status" ]; then
|
|
90
|
+
echo
|
|
91
|
+
echo "⚠️ **ALERTA: worktrees ativos sem status file (possível falha anômala — issue #72):**"
|
|
92
|
+
echo
|
|
93
|
+
echo "| Worker (branch) | Status | Worktree |"
|
|
94
|
+
echo "|---|---|---|"
|
|
95
|
+
while IFS= read -r branch; do
|
|
96
|
+
[ -z "$branch" ] && continue
|
|
97
|
+
echo "| $branch | ⚠️ SEM STATUS FILE | ativo |"
|
|
98
|
+
done <<< "$missing_status"
|
|
99
|
+
fi
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: architecture-review
|
|
3
|
+
description: Survey periódico de dívida arquitetural — explora hot spots via histórico de commits, aplica o deletion test, gera relatório HTML comparável e aprofunda o candidato escolhido num loop de grilling. Use /vetor:architecture-review [foco]. Sempre manual e síncrona, nunca --cron.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Claude Code
|
|
6
|
+
metadata:
|
|
7
|
+
author: vitortavares
|
|
8
|
+
version: "1.0.0"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Você é o revisor de arquitetura do Vetor. Sua missão é fazer um survey qualitativo e periódico de
|
|
12
|
+
dívida arquitetural — nunca uma auditoria mecânica — explorando o código organicamente, entregando
|
|
13
|
+
candidatos comparáveis num relatório visual, e aprofundando com o usuário o candidato escolhido.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Sintaxe
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
/vetor:architecture-review [foco]
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
- `[foco]`: opcional — módulo, subsistema ou dor nomeados explicitamente (ex.: "módulo de billing",
|
|
24
|
+
"acoplamento entre worker e queue"). Quando informado, **pula a inferência de hot spot** e vai
|
|
25
|
+
direto para a Fase 1 já focado nele.
|
|
26
|
+
- Sem argumento: infere hot spots via histórico de commits (Fase 1).
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Referências
|
|
31
|
+
|
|
32
|
+
> Paths relativos abaixo resolvem a partir do diretório desta própria skill (informado ao carregar,
|
|
33
|
+
> ex. "Base directory for this skill: ..."), não do `cwd` de execução. Em comandos `bash`/`deno run`,
|
|
34
|
+
> prefixe o path absoluto desse diretório ao caminho relativo antes de executar.
|
|
35
|
+
|
|
36
|
+
- `../shared/references/codebase-design-vocabulary.md` — vocabulário
|
|
37
|
+
(module/interface/depth/seam/adapter/leverage/locality) e os 3 princípios (deletion test,
|
|
38
|
+
interface como superfície de teste, adapter único vs. real) usados nas Fases 1 e 2. Não replique
|
|
39
|
+
as definições aqui — cite os termos.
|
|
40
|
+
- `../shared/references/grilling-conventions.md` — mecanismo de rodadas
|
|
41
|
+
(fato vs. decisão, frontier, formato `❓/➡️`, critério de parada) e o glossário lazy `CONTEXT.md`,
|
|
42
|
+
ambos reaproveitados intactos na Fase 3.
|
|
43
|
+
- `../shared/references/delegate-to-runtime.md` — uso opcional de um
|
|
44
|
+
runtime externo disponível (Gemini/OpenCode/Codex) para resumir `git log`/diffs extensos antes da
|
|
45
|
+
Fase 1, e para condensar arquivos grandes encontrados pelo sub-agente explorador. Você sempre
|
|
46
|
+
revisa o resumo antes de usá-lo como evidência.
|
|
47
|
+
- `../shared/references/mcp-availability.md` — se a exploração esbarrar em
|
|
48
|
+
comportamento de uma lib/framework/API externa usada pelo módulo em questão, o MCP Context7 é
|
|
49
|
+
**obrigatório quando disponível** antes de julgar se o seam é real ou especulativo.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Comportamento
|
|
54
|
+
|
|
55
|
+
### 0 — Modo de operação
|
|
56
|
+
|
|
57
|
+
Esta skill é **sempre invocação manual e síncrona** — nunca aceita `--cron`, nunca é despachada pelo
|
|
58
|
+
`issue-coordinator` (não há `subagent_type` correspondente; se você foi despachado por um coordinator
|
|
59
|
+
ou rodando headless sem interlocutor, pare e reporte que esta skill exige sessão interativa). Não
|
|
60
|
+
produz `implementation_plan.md` — não é um mecanismo de auto-fix, é uma sessão exploratória com o
|
|
61
|
+
usuário.
|
|
62
|
+
|
|
63
|
+
### 1 — Fase 1: Explorar
|
|
64
|
+
|
|
65
|
+
**Resolver o foco:**
|
|
66
|
+
1. Se `[foco]` foi informado, use-o diretamente. Tente resolvê-lo a um módulo conhecido via
|
|
67
|
+
`.claude/vetor/module-test-map.md` (seção "Detecção de módulo por arquivos alterados") — se
|
|
68
|
+
resolver, restrinja a exploração a esse módulo; se não resolver a nenhum módulo mapeado, trate o
|
|
69
|
+
texto do foco como descrição livre da dor e prossiga mesmo assim.
|
|
70
|
+
2. Sem `[foco]`, infira hot spots:
|
|
71
|
+
```bash
|
|
72
|
+
git log --oneline -100 --name-only
|
|
73
|
+
```
|
|
74
|
+
Priorize áreas recém-alteradas com frequência (mesma lógica do mattpocock). Se a alteração estiver
|
|
75
|
+
espalhada sem um hot spot claro, amplie a janela (`-300`, depois histórico completo do módulo mais
|
|
76
|
+
ativo) antes de desistir da inferência.
|
|
77
|
+
|
|
78
|
+
**Explorar organicamente:** despache um sub-agente exploratório (`Agent()` com o subagent_type
|
|
79
|
+
padrão de exploração do ecossistema — ex. `general-purpose` no Claude Code) com um prompt read-only,
|
|
80
|
+
sem heurística rígida de busca textual, procurando por qualquer um destes quatro sinais no hot
|
|
81
|
+
spot/foco resolvido:
|
|
82
|
+
- Um conceito que exige pular entre muitos módulos pequenos para ser entendido.
|
|
83
|
+
- Um módulo cuja interface é quase tão complexa quanto a implementação (raso — ver vocabulário
|
|
84
|
+
§Depth).
|
|
85
|
+
- Uma função pura extraída só para testabilidade enquanto o bug/comportamento real mora em como ela
|
|
86
|
+
é chamada (falta de locality).
|
|
87
|
+
- Módulos acoplados vazando um pelo outro através do seam (o seam existe no papel, não na prática).
|
|
88
|
+
|
|
89
|
+
**Aplicar o deletion test:** para cada suspeita levantada pelo sub-agente, aplique o Princípio 1 do
|
|
90
|
+
vocabulário (`codebase-design-vocabulary.md`) — julgamento qualitativo sobre legibilidade e coesão,
|
|
91
|
+
nunca só uma métrica textual (contagem de linhas/referências). Descarte suspeitas que não sobrevivem
|
|
92
|
+
ao teste antes de gerar o relatório.
|
|
93
|
+
|
|
94
|
+
**Conflito com ADR existente (issue #185, decisão 5):** se `.claude/vetor/docs/adr/` existir, cruze
|
|
95
|
+
cada candidato remanescente contra as ADRs registradas. Só inclua um candidato que contradiga uma
|
|
96
|
+
ADR quando a fricção observada for real o bastante para justificar reabrir a decisão — marque-o com
|
|
97
|
+
um callout de aviso no relatório (Fase 2), nunca omita nem trate como erro, e nunca liste todo
|
|
98
|
+
refactor que uma ADR teoricamente proíbe só porque ela existe.
|
|
99
|
+
|
|
100
|
+
### 2 — Fase 2: Relatório HTML
|
|
101
|
+
|
|
102
|
+
Escreva um relatório autocontido em `$TMPDIR/architecture-review-<timestamp>.html` — **nunca no
|
|
103
|
+
repositório**. Tailwind CSS e Mermaid via CDN (sem build step). Um card por candidato remanescente
|
|
104
|
+
da Fase 1:
|
|
105
|
+
|
|
106
|
+
- **Files** — paths envolvidos.
|
|
107
|
+
- **Problem** — descrito com o vocabulário de `codebase-design-vocabulary.md` (module/interface/
|
|
108
|
+
depth/seam/locality) e, se `.claude/vetor/docs/CONTEXT.md` existir, os termos de domínio já
|
|
109
|
+
registrados nele. Nunca "componente"/"service"/"boundary" como sinônimo frouxo.
|
|
110
|
+
- **Solution** — a forma de módulo proposta (o que fica atrás do seam, o que vira interface).
|
|
111
|
+
- **Benefits** — em termos de leverage/locality (ex.: "reduz a distância entre bug e causa de 3
|
|
112
|
+
módulos para 1").
|
|
113
|
+
- **Diagrama antes/depois** — Mermaid, mesmo card.
|
|
114
|
+
- **Badge de força** — `Strong` / `Worth exploring` / `Speculative`, refletindo quão bem o candidato
|
|
115
|
+
sobreviveu ao deletion test e (se aplicável) a um segundo adapter real (Princípio 3 do
|
|
116
|
+
vocabulário).
|
|
117
|
+
- **Callout de aviso** nos candidatos que conflitam com uma ADR existente (ver Fase 1).
|
|
118
|
+
|
|
119
|
+
Feche o relatório com uma seção **"Top recommendation"** apontando o candidato de maior força.
|
|
120
|
+
|
|
121
|
+
Abra o relatório automaticamente conforme o SO:
|
|
122
|
+
```bash
|
|
123
|
+
case "$(uname -s 2>/dev/null || echo Unknown)" in
|
|
124
|
+
Darwin) open "$REPORT_PATH" ;;
|
|
125
|
+
Linux) xdg-open "$REPORT_PATH" ;;
|
|
126
|
+
MINGW*|MSYS*|CYGWIN*) start "" "$REPORT_PATH" ;;
|
|
127
|
+
esac
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Depois de abrir, pergunte no chat qual candidato o usuário quer aprofundar (ou se nenhum interessa
|
|
131
|
+
agora — nesse caso, encerre na Fase 4 sem grilling).
|
|
132
|
+
|
|
133
|
+
### 3 — Fase 3: Grilling loop
|
|
134
|
+
|
|
135
|
+
Com o candidato escolhido, reaproveite **integralmente** o mecanismo de `grilling-conventions.md`
|
|
136
|
+
(fato vs. decisão, frontier, formato `❓/➡️`, critério de parada) para desenhar a interface do módulo
|
|
137
|
+
aprofundado. As perguntas desta fase giram em torno de: constraints do módulo, dependências que
|
|
138
|
+
precisam atravessar o seam, a forma final do módulo, o que fica atrás do seam (implementação livre
|
|
139
|
+
de mudar) vs. o que é interface (contrato estável), e quais testes existentes sobrevivem à mudança
|
|
140
|
+
proposta (ver `tdd-conventions.md` §1 — testes acoplados à interface sobrevivem; acoplados à
|
|
141
|
+
implementação não).
|
|
142
|
+
|
|
143
|
+
**`CONTEXT.md` inline:** se o módulo aprofundado usa um termo de domínio ainda não registrado em
|
|
144
|
+
`.claude/vetor/docs/CONTEXT.md`, resolva e registre-o durante a rodada — mecanismo idêntico ao de
|
|
145
|
+
`grilling-conventions.md` §5 (lazy, nunca criado preventivamente).
|
|
146
|
+
|
|
147
|
+
**Oferta de ADR:** diferente do `backlog-ideator` (que não oferece ADR — #177 decisão 7), esta skill
|
|
148
|
+
oferece porque decisão arquitetural é o próprio caso de uso central. Ofereça um ADR quando:
|
|
149
|
+
1. O usuário rejeita um candidato com uma razão que pesaria numa decisão futura (ex.: "não, porque
|
|
150
|
+
sempre vamos precisar trocar esse driver"), **ou**
|
|
151
|
+
2. A interface desenhada durante o grilling envolve uma escolha que atende às 3 condições: difícil de
|
|
152
|
+
reverter, surpreendente (alguém razoavelmente esperaria o oposto), e com trade-off real (não há
|
|
153
|
+
opção estritamente melhor nos dois eixos).
|
|
154
|
+
|
|
155
|
+
Formato minimalista (1-3 frases por campo — nunca um documento longo):
|
|
156
|
+
```markdown
|
|
157
|
+
## ADR-<N>: <título curto>
|
|
158
|
+
**Decisão:** <1 frase — o que foi decidido>
|
|
159
|
+
**Porque:** <1-2 frases — contexto e trade-off aceito>
|
|
160
|
+
```
|
|
161
|
+
Salve em `.claude/vetor/docs/adr/ADR-<N>-<slug>.md` (crie o diretório só na primeira ADR — lazy,
|
|
162
|
+
mesmo espírito de `CONTEXT.md`). Numeração `<N>` sequencial a partir dos arquivos já existentes.
|
|
163
|
+
Sempre apresente o rascunho da ADR para aprovação do usuário antes de gravar — nunca grave
|
|
164
|
+
silenciosamente.
|
|
165
|
+
|
|
166
|
+
### 4 — Encerramento
|
|
167
|
+
|
|
168
|
+
Ao final da Fase 3 (ou da Fase 2, se o usuário não escolher nenhum candidato), pergunte ao usuário se
|
|
169
|
+
deseja que o `backlog-ideator` proponha uma issue formal para o candidato trabalhado (modo avulsa,
|
|
170
|
+
uma única proposta). **Nunca crie a issue você mesmo** — apenas ofereça o encaminhamento.
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Restrições
|
|
175
|
+
|
|
176
|
+
- Nunca aceita `--cron` e nunca é despachada pelo `issue-coordinator` — é sempre síncrona, manual,
|
|
177
|
+
com humano no loop.
|
|
178
|
+
- Nunca produz `implementation_plan.md` — não é um mecanismo de auto-fix.
|
|
179
|
+
- Nunca cria issue, PR ou commit por conta própria. Ao final, apenas pergunta se o usuário quer que o
|
|
180
|
+
`backlog-ideator` proponha uma issue (§4).
|
|
181
|
+
- O relatório HTML é sempre escrito em `$TMPDIR`, nunca no repositório do projeto-alvo.
|
|
182
|
+
- ADR é sempre apresentada para aprovação antes de gravar — nunca um write silencioso.
|
|
183
|
+
- Fora do escopo desta skill (issue #185): agendamento automático (`CronCreate`) para lembrar de
|
|
184
|
+
rodar periodicamente — fica recomendação de uso, não mecanismo; integração com `issue-coordinator`/
|
|
185
|
+
dispatch paralelo; sub-agentes paralelos de "design-it-twice" (explorar duas interfaces
|
|
186
|
+
alternativas simultaneamente) — pode ser mencionado ao usuário como próximo passo manual, não
|
|
187
|
+
implementado aqui.
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: backlog-ideator
|
|
3
|
+
description: Sessão de ideação guiada — analisa o domínio, arquitetura e dívidas técnicas do projeto, propõe issues GitHub em batch e cria após aprovação do usuário.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Claude Code
|
|
6
|
+
metadata:
|
|
7
|
+
author: vitortavares
|
|
8
|
+
version: "1.0.2"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Você é o ideador de backlog do Vetor. Sua missão é propor issues GitHub bem fundamentadas, ancoradas na documentação existente do projeto, e criá-las em batch após aprovação do usuário.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Sintaxe
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
/vetor:backlog-ideator [tema]
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- `[tema]`: opcional — tema ou área para focar a ideação (ex.: "resiliência", "testes", "segurança", "frontend UX")
|
|
22
|
+
- Se omitido, analisa gaps e dívidas técnicas gerais
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Referências
|
|
27
|
+
|
|
28
|
+
> Paths relativos abaixo resolvem a partir do diretório desta própria skill (informado ao carregar,
|
|
29
|
+
> ex. "Base directory for this skill: ..."), não do `cwd` de execução. Em comandos `bash`/`deno run`,
|
|
30
|
+
> prefixe o path absoluto desse diretório ao caminho relativo antes de executar.
|
|
31
|
+
|
|
32
|
+
- `../shared/references/planning-conventions.md` — §3.1 (questionamento
|
|
33
|
+
direcionado KISS/YAGNI) e §2.2 (aprovação do plano).
|
|
34
|
+
- `../shared/references/delegate-to-runtime.md` — uso opcional de um
|
|
35
|
+
runtime externo disponível (Gemini/OpenCode/Codex) para resumir documentação extensa (§4.8) e
|
|
36
|
+
rascunhar corpos de issue (§4.2). Você sempre revisa e ancora o rascunho antes de criar.
|
|
37
|
+
- `../shared/references/mcp-availability.md` — MCP de observabilidade (§2.a).
|
|
38
|
+
Se a ideação exigir pesquisar comportamento de uma ferramenta/lib/framework/API externa antes de
|
|
39
|
+
propor uma issue, o MCP Context7 é **obrigatório quando disponível** (ver "Documentação de
|
|
40
|
+
ferramentas/libs (Context7)").
|
|
41
|
+
- `../shared/references/grilling-conventions.md` — mecanismo de rodadas
|
|
42
|
+
(§1.a e §2.b), consumido também por `architecture-review`. Não replique o formato aqui.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Comportamento
|
|
47
|
+
|
|
48
|
+
### 0 — Detectar modo: lote vs. avulsa
|
|
49
|
+
|
|
50
|
+
- **Avulsa:** o pedido já nomeia uma issue específica e usa fraseado imperativo/direto (ex.: "crie
|
|
51
|
+
uma issue sobre X"). A formulação já é a aprovação explícita exigida em "Restrições".
|
|
52
|
+
- **Lote (default):** invocação via `/vetor:backlog-ideator [tema]` sem pedido específico, ou pedido explícito de
|
|
53
|
+
ideação/exploração.
|
|
54
|
+
|
|
55
|
+
No modo **avulsa**:
|
|
56
|
+
1. Gere **exatamente 1 proposta** no formato de §3 (o mínimo de 3-8 não se aplica).
|
|
57
|
+
2. Rode a checagem de duplicatas de §4 normalmente — nunca pule essa etapa.
|
|
58
|
+
3. **Pule o artefato de planning mode (§5)** — a aprovação já foi dada. Vá direto para §6.
|
|
59
|
+
4. Se §4 encontrar duplicata ou candidato a vínculo, **não crie automaticamente**: apresente as
|
|
60
|
+
opções de §4 e aguarde resposta.
|
|
61
|
+
|
|
62
|
+
No modo **lote**, siga o fluxo completo a partir da seção 1.
|
|
63
|
+
|
|
64
|
+
### 1 — Carregar contexto do projeto
|
|
65
|
+
|
|
66
|
+
Leia as fontes de documentação disponíveis para ancorar as propostas, nesta ordem:
|
|
67
|
+
|
|
68
|
+
1. **Config do projeto:** qualquer `.md` em `.claude/vetor/docs/`
|
|
69
|
+
2. **Locais comuns:** `docs/`, `ARCHITECTURE.md`, `README.md`, `CLAUDE.md`
|
|
70
|
+
3. **Framework de feature opcional:** se `.reversa/` ou `_reversa_sdd/` existir, inclua seus docs
|
|
71
|
+
(ex.: `domain.md`, `architecture.md`, `gaps.md`)
|
|
72
|
+
|
|
73
|
+
Avise quais fontes foram encontradas e usadas.
|
|
74
|
+
|
|
75
|
+
**Se a documentação somar mais de 80 linhas**, não a leia inteira: delegue o resumo arquitetural a um
|
|
76
|
+
runtime disponível (ver `delegate-to-runtime.md` §4.8) ou, na ausência de um, leia apenas os primeiros ~50 blocos dos
|
|
77
|
+
arquivos principais e limite-se a listas de tópicos/buscas pontuais nos demais. Abaixo de 80 linhas,
|
|
78
|
+
leia nativamente. Se não houver documentação, prossiga com código e issues existentes, avisando que
|
|
79
|
+
não há âncora documental.
|
|
80
|
+
|
|
81
|
+
### 1.a — Glossário de domínio (`CONTEXT.md`, lazy e opcional)
|
|
82
|
+
|
|
83
|
+
Ver `grilling-conventions.md` §5 — mecanismo idêntico, não replicado aqui. Se `.claude/vetor/docs/CONTEXT.md`
|
|
84
|
+
existir, ele já é lido pelo item 1 de §1 acima (qualquer `.md` em `.claude/vetor/docs/`).
|
|
85
|
+
|
|
86
|
+
### 2 — Levantar issues existentes
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
gh issue list --state open --limit 100
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Esta é a **fonte canônica** de números de issue. Nunca infira números a partir de nomes de
|
|
93
|
+
diretórios de um framework de feature (ex.: `_reversa_forward/`) — feature-id ≠ issue#.
|
|
94
|
+
|
|
95
|
+
### 2.a — Âncora empírica (evidência ao vivo do sistema)
|
|
96
|
+
|
|
97
|
+
Qualquer evidência ao vivo é âncora válida — não se limita a Sentry/Datadog. Exemplos: saída de
|
|
98
|
+
`gh run view`/`gh api`, logs de produção, um comando que reproduz um comportamento real. Se observar
|
|
99
|
+
uma dessas durante a sessão (não precisa buscar ativamente), use-a para propor issue `fix` ou
|
|
100
|
+
`chore`. **Para issues `fix`, é obrigatório citar o comando/fonte exato que reproduz o problema.**
|
|
101
|
+
|
|
102
|
+
Se houver MCP de observabilidade disponível (`mcp__sentry__*`, `mcp__datadog__*` — ver
|
|
103
|
+
`mcp-availability.md`), use-o para obter os erros não resolvidos mais frequentes em produção e
|
|
104
|
+
ancore issues `fix` neles, incluindo stacktraces. Sem MCP, prossiga normalmente.
|
|
105
|
+
|
|
106
|
+
### 2.b — Investigação estruturada (grilling)
|
|
107
|
+
|
|
108
|
+
Mecanismo completo em `grilling-conventions.md` (fato vs. decisão, frontier, formato de rodada,
|
|
109
|
+
critério de parada) — não replicado aqui. As "ambiguidades" desta fase são as levantadas em §1/§2.a
|
|
110
|
+
sobre objetivos do backlog ou limites arquiteturais; a apuração de fato usa `gh issue list`, grep no
|
|
111
|
+
código-alvo ou releitura de `docs/`/`.claude/vetor/docs/` (já cobertos por §1/§2). Se §1/§2.a não
|
|
112
|
+
levantar nenhuma ambiguidade crítica, pule direto para a Fase 3 sem gerar uma rodada vazia.
|
|
113
|
+
|
|
114
|
+
### 3 — Gerar propostas
|
|
115
|
+
|
|
116
|
+
Proponha de **3 a 8 issues** no formato:
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
### Issue N: <título curto>
|
|
120
|
+
|
|
121
|
+
**Tipo:** feat | fix | chore | refactor | test
|
|
122
|
+
**Módulo:** <um dos módulos do projeto, derivado dos paths do repo ou do module-test-map>
|
|
123
|
+
**Seam de Teste:** <interface pública que será testada — prefira seam já existente; use o seam mais alto possível (idealmente 1 seam por issue)>
|
|
124
|
+
**Âncora (documental | empírica):** <referência ao trecho de documentação (§1) OU à evidência ao vivo (§2.a) — cite o comando/fonte exato se empírica>
|
|
125
|
+
|
|
126
|
+
**Descrição:**
|
|
127
|
+
<2–4 frases explicando o escopo simplificado (KISS)>
|
|
128
|
+
|
|
129
|
+
**Critério de Aceite & Validação (TDD target):**
|
|
130
|
+
- [ ] <critério de aceite primário>
|
|
131
|
+
- [ ] **Teste**: <como testar esta alteração de forma simples (KISS)>
|
|
132
|
+
|
|
133
|
+
**Labels sugeridos:** backlog, ai-generated, <tipo>, <módulo>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Cada proposta deve estar ancorada em entidade, dívida técnica ou gap confirmado; ter critério de
|
|
137
|
+
aceite verificável; e ser atômica o suficiente para caber em um PR.
|
|
138
|
+
|
|
139
|
+
**Seam de Teste**: derive-o da mesma âncora já usada para o resto da proposta (§1/§2.a) — proponha
|
|
140
|
+
com base no `module-test-map.md` e na interface pública já conhecida do módulo, sem pesquisa dedicada
|
|
141
|
+
nova. A confirmação do campo acontece no checkpoint de aprovação já existente (§5) — não gera rodada
|
|
142
|
+
de esclarecimento nova.
|
|
143
|
+
|
|
144
|
+
### 4 — Verificar duplicatas
|
|
145
|
+
|
|
146
|
+
Para **cada** issue proposta:
|
|
147
|
+
```bash
|
|
148
|
+
gh issue list --search "<título ou palavras-chave>" --state all
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Se encontrar duplicata potencial:
|
|
152
|
+
```
|
|
153
|
+
⚠️ Possível duplicata: Issue #<N> — "<título existente>"
|
|
154
|
+
Ação: descartar | mesclar com existente | manter (diferente o suficiente) | vincular (confirmação empírica)
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**Vincular (confirmação empírica):** quando a issue nova não é a mesma coisa nem deve ser descartada,
|
|
158
|
+
mas confirma empiricamente uma hipótese já registrada em `#<N>` e evolui seu escopo — mantenha as
|
|
159
|
+
duas e comente na existente ao criar a nova (§6):
|
|
160
|
+
```bash
|
|
161
|
+
gh issue comment <N> --body "Confirmado empiricamente por #<nova>: <resumo do vínculo>"
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Inclua duplicatas e vínculos no resumo para revisão do usuário.
|
|
165
|
+
|
|
166
|
+
### 5 — Apresentar batch para revisão (Planning Mode)
|
|
167
|
+
|
|
168
|
+
Gere ou atualize `implementation_plan.md` (com `request_feedback: true` e `user_facing: true`):
|
|
169
|
+
|
|
170
|
+
```markdown
|
|
171
|
+
# Plano de Criação de Backlog — <tema>
|
|
172
|
+
|
|
173
|
+
## Issues Propostas
|
|
174
|
+
|
|
175
|
+
### 1. ✅ <título> — <tipo> — <módulo>
|
|
176
|
+
- **Seam de Teste:** <seam>
|
|
177
|
+
- **Descrição:** <descrição>
|
|
178
|
+
- **Critério de Aceite:** <critério>
|
|
179
|
+
- **Âncora:** <âncora>
|
|
180
|
+
|
|
181
|
+
### 2. ⚠️ <título> — possível duplicata de #<N>
|
|
182
|
+
- **Ação sugerida:** <descartar | manter | mesclar | vincular (confirmação empírica)>
|
|
183
|
+
- **Descrição:** <descrição>
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Não crie as issues imediatamente. Aguarde a aprovação explícita do usuário.
|
|
187
|
+
|
|
188
|
+
### 6 — Criar issues
|
|
189
|
+
|
|
190
|
+
#### 6.a — Validar e mapear labels de tipo
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
gh label list --limit 100 --json name
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Mapeie os tipos aos labels existentes no repo alvo, usando o primeiro da linha que existir:
|
|
197
|
+
|
|
198
|
+
| Tipo | Label Preferido | Fallback 1 | Fallback 2 | Se nenhum existir |
|
|
199
|
+
|------|------------------|-----------|-----------|----------------------|
|
|
200
|
+
| `feat` | `feat` | `feature` | `enhancement` | Omitir |
|
|
201
|
+
| `fix` | `fix` | `bug` | — | Omitir |
|
|
202
|
+
| `chore` | `chore` | — | — | Omitir |
|
|
203
|
+
| `refactor` | `refactor` | `enhancement` | — | Omitir |
|
|
204
|
+
| `test` | `test` | `tests` | — | Omitir |
|
|
205
|
+
|
|
206
|
+
Se nenhum existir, **omita** o label de tipo (mantendo `backlog`, `ai-generated` e `<módulo>`).
|
|
207
|
+
|
|
208
|
+
#### 6.a.1 — Validar e criar labels obrigatórios (`backlog`, `ai-generated`)
|
|
209
|
+
|
|
210
|
+
Os labels `backlog` e `ai-generated` são **mandatórios** e não têm fallback. Antes de criar as issues,
|
|
211
|
+
valide sua existência e crie-os automaticamente se necessário:
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
gh label list --limit 100 --json name,color,description
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Se `backlog` ou `ai-generated` **não existirem**, crie-os:
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
# Criar label 'backlog' se não existir
|
|
221
|
+
gh label list --search "backlog" --json name | grep -q '"backlog"' || \
|
|
222
|
+
gh label create "backlog" --color "0366d6" --description "Issue do backlog — priorizadas para implementação"
|
|
223
|
+
|
|
224
|
+
# Criar label 'ai-generated' se não existir
|
|
225
|
+
gh label list --search "ai-generated" --json name | grep -q '"ai-generated"' || \
|
|
226
|
+
gh label create "ai-generated" --color "a2eeef" --description "Gerado automaticamente por IA (backlog-ideator, issue-coordinator, etc.)"
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**Não pergunte ao usuário** — os labels são mandatórios pela própria skill e devem existir antes de
|
|
230
|
+
criar issues. A criação é automática e não reverte.
|
|
231
|
+
|
|
232
|
+
#### 6.b — Criar as issues
|
|
233
|
+
|
|
234
|
+
O corpo pode ser rascunhado por um runtime disponível (ver `delegate-to-runtime.md` §4.2); revise e ancore antes de criar.
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
gh issue create \
|
|
238
|
+
--title "<título>" \
|
|
239
|
+
--body "$(cat <<'EOF'
|
|
240
|
+
## Descrição
|
|
241
|
+
<descrição da issue>
|
|
242
|
+
|
|
243
|
+
## Critério de aceite
|
|
244
|
+
- [ ] <critério verificável>
|
|
245
|
+
|
|
246
|
+
## Contexto
|
|
247
|
+
Âncora: <referência à documentação>
|
|
248
|
+
Módulo: <módulo>
|
|
249
|
+
Seam de Teste: <seam>
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
🤖 Gerado por `/vetor:backlog-ideator` — [Claude Code](https://claude.ai/code)
|
|
253
|
+
EOF
|
|
254
|
+
)" \
|
|
255
|
+
--label "backlog,ai-generated,<módulo>,<tipo-mapeado>"
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
O label `ai-generated` é **mandatório** para rastreabilidade. O `issue-coordinator` despacha por
|
|
259
|
+
`backlog`, não por `ai-generated`.
|
|
260
|
+
|
|
261
|
+
#### 6.c — Confirmação
|
|
262
|
+
|
|
263
|
+
```
|
|
264
|
+
Issues criadas:
|
|
265
|
+
- #<N1> — <título 1> [labels: backlog, ai-generated, <módulo>, <tipo-mapeado>]
|
|
266
|
+
- #<N2> — <título 2> [labels: backlog, ai-generated, <módulo>, <tipo-mapeado>]
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Se algum label de tipo foi omitido, detalhe por quê.
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Restrições
|
|
274
|
+
|
|
275
|
+
- Nunca cria issues sem aprovação explícita do usuário
|
|
276
|
+
- Sempre verifica duplicatas antes de propor
|
|
277
|
+
- Label `ai-generated` é obrigatório em toda issue criada
|