Melhora prompts vagos usando as instruções do projeto e as skills, troca o texto na caixa e só envia quando você clicar em Enviar.

Mods que eu mesmo criei para o Claude Code (interface e comportamento: painéis, comandos, hooks). Fonte completa de cada um.
| Mod | Versão | O que faz | Pasta |
|---|---|---|---|
assumption-session | 0.1.0 | Lista as suposições que o Claude faz enquanto constrói, num painel onde você aprova ou corrige. Abra com /suposicoes. | mods/assumption-session |
cofre-chaves | 0.1.0 | Guarda chaves no .env pelo /chave e impede que elas passem pelo chat, pelas ferramentas ou pela saída delas | mods/cofre-chaves |
comandos-mod | 0.1.0 | /comandosmod abre um painel lateral com todos os seus mods e o comando de cada um. | mods/comandos-mod |
plain-answers | 0.1.0 | Faz o Claude responder em linguagem simples, sem jargão. Liga/desliga com /simples. | mods/plain-answers |
prompt-enhance | 0.1.0 | Melhora prompts vagos usando as instruções do projeto e as skills, troca o texto na caixa e só envia quando você clicar em Enviar. | mods/prompt-enhance |
session-dashboard | 0.1.0 | Painel lateral com todas as sessões ativas: trabalhando, concluída ou esperando resposta. Abra com /sessoes. | mods/session-dashboard |
Cada pasta é um plugin do Claude Code (.claude-plugin/plugin.json, hooks/). Para carregar um mod, aponte para a pasta dele pela variável CLAUDE_CODE_PLUGIN_DIRS no settings.json (bloco env), conforme a documentação do Claude Code. Os mods são em português.
Antes de usar, leia o código de cada um. Os mods rodam hooks com acesso aos arquivos do seu projeto.
.claude-plugin/types) não foram incluídos. Para compilar, rode o tsc no mod (há um tsconfig.json em cada um).cofre-chaves não guarda chaves neste repo: o código só contém os padrões usados para detectar chaves e testes com valores fictícios.Não copiei o código destes. Estão listados no repositório claude-code-plugins, com a fonte e o commit exato:
skins (hellosverre/claude-skins)mods-manager (ptpmediabr/mods-manager)usage-weather (ptpmediabr/usage-weather)ideas-shelf (ptpmediabr/ideas-shelf)side-chat (ptpmediabr/side-chat)hooks/register.tsx 74 lines1import { atom, read, update } from 'claude-code'
2import type { Register } from 'claude-code'
3
4const phase = atom({ plugin: 'prompt-enhance', key: 'phase' } as const, 'idle')
5const SKILLS_DIR = `${process.env.HOME}/.claude/skills`
6
7const SYSTEM = `Você reescreve prompts vagos para um assistente de código (Claude Code). Use as instruções do projeto e as skills disponíveis só para tornar o prompt mais específico (arquivos, convenções, skills relevantes, critérios de pronto). Não invente fatos nem amplie o escopo. Mantenha o idioma do prompt original. Responda APENAS com o prompt melhorado, sem comentários.`
8
9async function enhance($: any) {
10 const draft = (await $.prompt.read()).text.trim()
11 if (!draft) return $.ui.toast('Escreva um prompt primeiro')
12 await update($, phase, () => 'working')
13 const root = await $.session.root()
14 const instructions = await $.fs.read(`${root}/CLAUDE.md`).catch(() => '')
15 const skills = (await $.fs.list(SKILLS_DIR).catch(() => []))
16 .filter((f: { kind: string }) => f.kind === 'dir')
17 .map((f: { name: string }) => f.name)
18 .join(', ')
19 const r = await $.model.complete({
20 model: 'sonnet',
21 system: SYSTEM,
22 prompt: `Instruções do projeto (CLAUDE.md):\n${instructions.slice(0, 6000)}\n\nSkills instaladas: ${skills}\n\nPrompt original:\n${draft}`,
23 })
24 if (r.isAnswered) {
25 await $.prompt.fill({ text: r.text.trim(), mode: 'replace' })
26 await update($, phase, () => 'ready')
27 } else {
28 $.ui.toast('Não consegui melhorar o prompt')
29 await update($, phase, () => 'idle')
30 }
31}
32
33export const register: Register = on => {
34 on('session.start', async ($, e, next) => {
35 await $.command.register({ name: 'melhorar', description: 'Melhora o prompt da caixa; depois clique em Enviar' })
36
37 return next(e)
38 })
39
40 on('command.run', { command: 'melhorar' }, async $ => {
41 await enhance($)
42
43 return { text: 'Prompt melhorado na caixa. Revise e clique em Enviar.' }
44 })
45
46 on('ui.render', { component: 'AbovePrompt' }, async ($, e, next) => {
47 if (e.props.hasSurvey) return next(e)
48 const { Box, Button, Text } = $.ui.resolve(e)
49 const p = await read($, phase)
50
51 return (
52 <Box>
53 {p === 'working' && <Text dimColor>Melhorando o prompt… </Text>}
54 {p !== 'working' && <Button key="enh" label="✨ Melhorar" onPress={() => enhance($)} />}
55 {p === 'ready' && (
56 <Box>
57 <Text> </Text>
58 <Button
59 key="send"
60 label="Enviar"
61 onPress={async () => {
62 const text = (await $.prompt.read()).text
63 await update($, phase, () => 'idle')
64 await $.prompt.fill({ text: '', mode: 'replace' })
65 void $.prompt.submit({ text })
66 }}
67 />
68 </Box>
69 )}
70 </Box>
71 )
72 })
73}
74