SLOPSHOPPER

prompt-enhance

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.

newbandcommandtoastmodel
v0.1.0no licenseupdated 2026-10-12cfelipemoreira/claude-code-mods/mods/prompt-enhance
A shopper browsing a rack in a slop shop
Preview could not run: ReferenceError: process is not defined at anonymous (file:///inner.js:49:28) at run (inner.js:982:9) at /home/runner/work/slopshopper/slopshopper/scripts/harness/run-one.ts:116:36
README

claude-code-mods

Mods que eu mesmo criei para o Claude Code (interface e comportamento: painéis, comandos, hooks). Fonte completa de cada um.

ModVersãoO que fazPasta
assumption-session0.1.0Lista as suposições que o Claude faz enquanto constrói, num painel onde você aprova ou corrige. Abra com /suposicoes.mods/assumption-session
cofre-chaves0.1.0Guarda chaves no .env pelo /chave e impede que elas passem pelo chat, pelas ferramentas ou pela saída delasmods/cofre-chaves
comandos-mod0.1.0/comandosmod abre um painel lateral com todos os seus mods e o comando de cada um.mods/comandos-mod
plain-answers0.1.0Faz o Claude responder em linguagem simples, sem jargão. Liga/desliga com /simples.mods/plain-answers
prompt-enhance0.1.0Melhora 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-dashboard0.1.0Painel lateral com todas as sessões ativas: trabalhando, concluída ou esperando resposta. Abra com /sessoes.mods/session-dashboard

Como usar

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.

Observações

  • Os arquivos de tipagem gerados (.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.

Mods de terceiros que também uso

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)
Source 1 files
hooks/register.tsx 74 lines
1import { 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