pir0c0pter0/claude-plugins
Marketplace pessoal de plugins Claude Code mantidos por @pir0c0pter0.
Status: plugins prontos para uso. Cada um é documentado individualmente dentro da sua pasta.
📦 Plugins disponíveis
| Plugin | Versão | Descrição |
|---|
qwen-review | 0.1.5 | Stop-time review gate via API Qwen 3.7 Max — bloqueia stop quando o Qwen identifica problema no turn anterior. Wizard via /qwen-review:wizard (AskUserQuestion). |
🚀 Instalação (4 fases)
Cada fase tem uma verificação simples antes de avançar pra próxima — evita o problema de "tudo parece quebrado porque eu pulei um passo".
Fase 1 — Registrar marketplace + instalar o plugin
Três rotas equivalentes. Escolha uma:
Rota A — slash commands (mais simples):
/plugins marketplace add pir0c0pter0/claude-plugins
/plugins install qwen-review@pir0c0pter0
/plugins install já ativa — hooks rodam e slash commands ficam disponíveis imediatamente. Não precisa de /plugins enable separado (esse só serve pra reativar após /plugins disable).
Rota B — ~/.claude/settings.json user-level manual:
{
"extraKnownMarketplaces": {
"pir0c0pter0": {
"source": { "source": "github", "repo": "pir0c0pter0/claude-plugins" }
}
},
"enabledPlugins": {
"qwen-review@pir0c0pter0": true
}
}
⚠️ Marketplace nova só carrega no startup — feche e abra o Claude Code da primeira vez. Atualizações subsequentes dos plugins puxam via /reload-plugins.
Rota C — <project>/.claude/settings.json committed (team-scope):
Mesmo JSON da Rota B, mas no .claude/ do projeto (não home). Commitado no repo, todo dev pega a config ao clonar.
Precedência de settings (alto → baixo, override completo sem merge):
- Managed (admin/MDM) — não override-ável
.claude/settings.local.json (gitignored, override pessoal)
.claude/settings.json (committed, team config)
~/.claude/settings.json (user-level)
⚠️ Nunca ponha env.QWEN_API_KEY em settings project-level — segredo no repo. A chave fica sempre em ~/.claude/settings.json per-user (o wizard escreve lá por isso).
Verificação da Fase 1:
/plugins list
Deve listar qwen-review@pir0c0pter0. Nesse ponto o plugin tá instalado e ativo, mas ainda sem chave — então /qwen-review:status vai mostrar envOk: false. Isso é esperado, próxima fase resolve.
Se /plugins list não mostra o plugin, rode /doctor e revise o passo de install.
Fase 2 — Configurar a API com o wizard
Forma mais fácil — slash command que imprime o comando pronto pra copiar:
/qwen-review:wizard
Cole a linha que ele te dá (já com ! no início e o path resolvido) e o wizard abre. Detalhes em seção do wizard abaixo (incluindo alias permanente).
Verificação da Fase 2:
/qwen-review:status
Agora deve mostrar envOk: true + apiKey: "sk-•••XXX" (mascarada) + os outros valores. Se ainda mostra envOk: false, reinicie o Claude Code (env só recarrega no startup).
reviewGateEnabled continua false — fase 3.
Fase 3 — Habilitar o gate no workspace
Entre no diretório do projeto onde quer review automático e rode:
/qwen-review:setup --enable
O gate é por workspace — state isolado por SHA-256 do realpath. Pode habilitar em qualquer número de projetos sem interferência.
Verificação da Fase 3:
/qwen-review:status
Agora deve mostrar reviewGateEnabled: true além do que já tinha.
Fase 4 — Smoke test end-to-end
⚠️ Antes de fazer qualquer coisa nessa fase, rode /qwen-review:status e anote o lastReview.ts atual (pode estar null se nunca rodou, ou pode ter um timestamp antigo de outro workspace/dia). Só assim você consegue provar que o smoke test foi de fato a chamada que populou o estado.
Agora faça uma edit qualquer (até trivial, tipo um comentário) num arquivo do projeto e termine o turn no Claude Code. O hook Stop dispara, manda pro Qwen, e:
- Qwen responde
ALLOW: → stop normal (silencioso)
- Qwen responde
BLOCK: → Claude vê {decision:"block"} no transcript e continua o turn
Confirme com:
/qwen-review:status
Checagens (todas têm que valer):
lastReview é não-null
lastReview.ts mudou vs. o valor que você anotou antes (ou virou um timestamp se era null)
lastReview.ts é dos últimos minutos (não algo do dia anterior)
lastReview.model bate com o QWEN_MODEL que você configurou
lastReview.latencyMs e promptTokens/completionTokens fazem sentido (não-zero)