Lista as suposições que o Claude faz enquanto constrói, num painel onde você aprova ou corrige. Abra com /suposicoes.

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 86 lines1import { atom, read, update } from 'claude-code'
2import type { Register } from 'claude-code'
3
4import type { Assumption } from '../types'
5
6const PANE = 'assumptions'
7const list = atom({ plugin: 'assumption-session', key: 'list' } as const, [])
8const TOOL = 'mcp__assumption-session__record_assumption'
9
10const RULES = `Sempre que, ao construir ou decidir algo, você assumir algo que o usuário não disse explicitamente (uma escolha de tecnologia, um comportamento, um valor padrão, uma interpretação do pedido), chame a ferramenta ${TOOL} com uma frase curta descrevendo a suposição, antes de seguir adiante. Não pare para perguntar: registre e continue. Se o usuário corrigir uma suposição, ajuste o trabalho conforme a correção.`
11
12export const register: Register = on => {
13 on('session.start', async ($, e, next) => {
14 await $.tool.register({
15 name: 'record_assumption',
16 description: 'Registra uma suposição feita durante o trabalho para o usuário revisar no painel de suposições.',
17 inputSchema: {
18 type: 'object',
19 properties: { assumption: { type: 'string', description: 'A suposição, em uma frase curta.' } },
20 required: ['assumption'],
21 },
22 })
23 await $.command.register({ name: 'suposicoes', description: 'Abre o painel de suposições do Claude' })
24
25 return next(e)
26 })
27
28 on('command.run', { command: 'suposicoes' }, async $ => {
29 await $.ui.open({ id: PANE, title: 'Suposições' })
30
31 return { text: 'Painel de suposições aberto.' }
32 })
33
34 on('prompt.compose', async ($, e, next) => {
35 const r = await next(e)
36
37 return { sections: [...r.sections, { id: 'assumption-session', text: RULES, scope: 'session' as const }] }
38 })
39
40 on('tool.call', { tool: TOOL }, async ($, e) => {
41 const text = String((e as { assumption?: string }).assumption ?? '').trim()
42 if (text) {
43 const a: Assumption = { id: e.tool_use_id, text, status: 'pending' }
44 await update($, list, l => [...l, a])
45 $.ui.toast('Nova suposição registrada (/suposicoes)')
46 }
47
48 return { text: 'Suposição registrada. Continue; o usuário pode corrigi-la depois.' }
49 })
50
51 on('ui.render', { component: 'Pane', requestId: PANE }, async ($, e) => {
52 const { Box, Text, Button } = $.ui.resolve(e)
53 const items = await read($, list)
54 const mark = (id: string, status: Assumption['status']) =>
55 update($, list, l => l.map(a => (a.id === id ? { ...a, status } : a)))
56
57 return (
58 <Box flexDirection="column">
59 {items.length === 0 && <Text dimColor>Nenhuma suposição ainda.</Text>}
60 {items.map(a => (
61 <Box key={a.id} flexDirection="column" marginBottom={1}>
62 <Text color={a.status === 'ok' ? 'green' : a.status === 'wrong' ? 'red' : 'yellow'}>
63 {a.status === 'ok' ? '✓' : a.status === 'wrong' ? '✗' : '?'} {a.text}
64 </Text>
65 <Box>
66 <Button key={`ok-${a.id}`} label="Certo" onPress={() => mark(a.id, 'ok')} />
67 <Text> </Text>
68 <Button
69 key={`no-${a.id}`}
70 label="Corrigir"
71 onPress={async () => {
72 await mark(a.id, 'wrong')
73 await $.prompt.fill({
74 text: `Sobre a suposição "${a.text}": está errada. O correto é: `,
75 mode: 'replace',
76 })
77 }}
78 />
79 </Box>
80 </Box>
81 ))}
82 </Box>
83 )
84 })
85}
86