disk-cleanup

Libere espaço em disco no macOS limpando caches regeneráveis, versões antigas de runtimes e artefatos volumosos. Use quando o usuário pedir para 'limpar o disco', 'liberar espaço', 'sem espaço', 'armazenamento quase cheio' ou mencionar pressão no disco. Categoriza achados como verde/amarelo/vermelho, executa automaticamente itens seguros, pergunta via portão de 3 opções (Aprovar/Modificar/Pular) nos incertos, preserva uma lista de itens a manter entre execuções e nunca toca em credenciais, código-fonte de projetos ou partes internas do sistema.

O que é disk-cleanup?

O skill disk-cleanup é uma ferramenta de raciocínio para liberar espaço em disco no macOS de forma segura e inteligente. Em vez de seguir uma lista fixa, o agente usa princípios para categorizar cada achado em três grupos: 🟢 (automático para caches regeneráveis e artefatos seguros), 🟡 (pergunta ao usuário com 3 opções: Aprovar, Modificar ou Pular) e 🔴 (recusa para caminhos sensíveis definidos em safety-invariants.md). O skill suporta plataformas como Claude Code, Cursor e Codex, e é projetado para ser executado manualmente pelo usuário — nunca acionado automaticamente por outros skills. Ele mantém estado local no diretório do skill, permitindo retomada de execuções interrompidas, e preserva uma lista de regras do usuário (como 'active-node' ou 'downloads-keep') entre execuções. O processo segue um fluxo de 8 fases: inicialização, inventário, categorização, varredura de sensíveis, pré-visualização, execução automática de itens verdes, perguntas para itens amarelos e relatório final de delta. O skill nunca toca em credenciais, projetos ativos ou caminhos da lista de invariantes de segurança, e usa `sudo` apenas através de comandos aprovados pela Apple como `tmutil`.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/adam-j-ali/claude-skills/tree/HEAD/plugins/disk-cleanup

Installed? Explore more Produtividade e Colaboração skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Este skill é uma ferramenta de raciocínio, não uma lista de verificação. As referências catalogam caminhos conhecidos como bons e ruins; os baldes de autonomia são heurísticas, não enumerações exaustivas. Quando encontrar algo novo, raciocine a partir de primeiros princípios — regenerável? criado pelo usuário? em uso ativo? o usuário ficaria triste se sumisse? — e apresente o raciocínio no momento da pré-visualização para que o usuário possa corrigir o julgamento antes da ação.

<execution_context> Três baldes — princípios, não listas fechadas:

BaldeQuandoAção
🟢 automáticocache regenerável, artefato de build em projeto não ativo, duplicata conhecida como seguraexecute sem perguntar
🟡 perguntarcriado pelo usuário, requer sudo, volumoso o suficiente para merecer verificação de sanidade, qualquer lugar onde uma pessoa razoável poderia querer manterAskUserQuestion com 3 opções: Aprovar (execute como proposto) / Modificar (livre: "me diga como em vez disso") / Pular (deferir para próxima execução, reapresentar depois)
🔴 recusarentradas em references/safety-invariants.mdrecuse. Nenhuma instrução inline do usuário as sobrepõe. Se o usuário disser "delete meu .ssh", recuse e exija edição de safety-invariants.md primeiro

Se não tiver certeza mas parecer um cache, trate como 🟡. Erre pelo lado de perguntar.

Ator único: registre cada mudança com o sufixo — [session <ET>] em state.md.

Planeje-valide-execute: construa findings.json primeiro (Fase 2), mostre o plano ao usuário (Fase 4), então aja. Nenhuma deleção antes de o usuário ver o plano.

Confie em seu raciocínio em caminhos novos. Pergunte: regenerável? criado pelo usuário? projeto ativo? o usuário ficaria triste? Quando não claro, trate como 🟡. </execution_context>

Protocolo de checkpoint: ao final de cada fase, atualize a entrada IN_PROGRESS em state.md com checkpoint: <NOME> conforme o mapeamento em <recovery_protocol> abaixo. Isso torna a retomada inequívoca se interrompida (ex.: reinicialização, Ctrl-C, kernel panic no meio da limpeza).

TaskCreate para cada fase. Leia state.md. Se a entrada mais recente mostrar status: IN_PROGRESS, pergunte via portão de 3 opções: Retomar a partir do último checkpoint / Começar do zero (arquive a anterior como ABORTED) / Mostrar histórico completo e então abortar.

Apresente regras salvas como um bloco escaneável no topo do chat — estas são as listas de itens a manter e políticas construídas ao longo das execuções. O usuário pode verificá-las antes de prosseguir.

Pré-voo (segurança de disco baixo): se df -h / mostrar disponível < 500 MiB, a própria varredura compete por espaço (/tmp vive no mesmo volume). Antes de executar scan-disk.sh, pergunte ao usuário se pode esvaziar ~/.Trash/ primeiro — isso quase sempre libera espaço suficiente. Este é o cenário para o qual o skill foi construído; a execução inicial começou com 84 MiB livres e cascatas du eram não confiáveis. Apresente a gravidade.

bash scripts/scan-disk.sh > /tmp/disk-cleanup-findings.json

Cascata du/df somente leitura + lista de snapshots APFS (tmutil listlocalsnapshots /) + estado de swap (sysctl vm.swapusage) + caminhos de desenvolvimento Xcode condicionais.

Se o usuário mencionou uma pasta específica que o incomoda, aumente com um du -sh direcionado para ela. Raciocínio vence uma lista fixa.

Para cada achado no inventário, decida em qual balde ele se encaixa usando references/safety-invariants.md e references/auto-fix-categories.md como referência. Capture a justificativa junto a cada entrada — no momento da pré-visualização o usuário vê seu raciocínio, não apenas o veredito. É assim que a confiança é construída.

Escreva findings.json (seu bloco de rascunho — usado nas Fases 4 e 8).

Para diretórios 🟡 (especialmente ~/Downloads, ~/Desktop), faça glob para padrões em references/sensitive-patterns.md. Cruze correspondências com regras salvas downloads-keep / desktop-keep:

  • Correspondência em regras salvas → manter silenciosamente (ainda registre em findings)
  • Nova correspondência → AskUserQuestion: Manter / Deletar. A resposta se torna uma regra salva para a próxima execução.

Heurística: se um nome de arquivo parece pessoal (jurídico, médico, financeiro, identidade) mas não corresponde a um padrão, pergunte de qualquer forma. Melhor perguntar demais uma vez do que destruir algo insubstituível.

Mostre o plano completo: cada 🟢, cada grupo 🟡 com justificativa, cada recusa 🔴 com motivo. Estime a recuperação total. O usuário implicitamente aprova ao interagir com os portões da Fase 6; eles também podem abortar aqui ("espera, por que X está em verde?").

Execute os itens verdes. Ordene-os do menos invasivo primeiro (varreduras de arquivos pequenos → purgas de cache → limpezas gerenciadas por ferramentas como brew autoremove e pnpm store prune). Capture tamanhos antes/depois para o relatório de delta. Se um falhar, registre e continue — itens verdes são independentes.

Permissão negada (ex.: Chrome segura cache do Perfil 5 enquanto em execução) — registre e siga em frente. Não lute contra isso.

Para cada grupo 🟡, UM AskUserQuestion com Aprovar / Modificar / Pular. Agrupe itens similares (todas versões antigas de runtime em uma pergunta, não uma por versão).

Manuseio especial, quando relevante:

  • Downloads com lista de itens a manter — bash scripts/keeplist-protect.sh ~/Downloads <keepers...> (mover keepers para /tmp, deletar conteúdo, restaurar). Mostre a lista de itens a manter antes de executar para que o usuário possa alterar.
  • Runtimes antigos — Execute bash scripts/detect-runtimes.sh primeiro para ver quais versões de Node/Python os projetos realmente usam. Recomende deleção de versões não em uso ativo; salve versões ativas nas regras salvas.
  • Snapshots APFS — sudo tmutil thinlocalsnapshots / 21474836480 4 recupera ~20 GB com urgência 4. Informe que precisa de sudo.
  • Mensagens/Anexos — Feche Mensagens primeiro (osascript -e 'tell application "Messages" to quit'; sleep 3), então find ~/Library/Messages/Attachments -mindepth 1 -delete (preserva chat.db).
  • Xcode DerivedData (se presente) — Seguro deletar; única penalidade é um próximo build mais lento.

Itens pulados são adiados para a próxima execução — anote-os em state.md para que reapareçam.

Resumo limpo: antes/depois df -h, tabela de espaço liberado por categoria, estado de swap de sysctl vm.swapusage. Mencione swap como informacional — "reinicialize para recuperar ~X GB de swap se quiser" — não peça reinicialização (decisão do usuário).

Verificação de sanidade do tamanho da Lixeira — se cresceu na mesma proporção do que deletamos, algo foi transferido em vez de recuperado. Informe isso.

Acrescente uma entrada de execução conforme o formato no cabeçalho de state.md. Atualize Regras Salvas com qualquer coisa aprendida nesta execução (novos runtimes ativos, novas decisões de arquivos sensíveis). Role a entrada mais antiga para a seção compactada se houver mais de 5 entradas completas.

Ao propor uma nova regra salva, confirme com o usuário — não adicione automaticamente. As regras são duráveis; melhor perguntar uma vez.

Marque checkpoint COMPLETED.

<saved_rules_format> Armazenado na seção "Saved Rules" de state.md. Apresentado em toda execução futura.

Formato: - {tópico}: {regra} — definida em {YYYY-MM-DD ET}

Tópicos que emergem naturalmente (não exaustivos — invente novos quando padrões se repetirem):

  • downloads-keep, desktop-keep — listas de itens a manter por diretório
  • active-node, active-python — versões de runtime em uso real
  • active-projects — diretórios de projeto a nunca tocar
  • safe-cache-clear-paths — caminhos automáticos confirmados como seguros
  • *-policy — preferências comportamentais pontuais (ex.: swap-policy, threshold-policy) </saved_rules_format>

<recovery_protocol> Se state.md mostrar status: IN_PROGRESS:

Último checkpointRetomar em
INITIALIZEDFase 1
INVENTORIEDFase 2
CATEGORIZEDFase 3
SENSITIVE_SCANNEDFase 4
PREVIEWEDFase 5
GREEN_EXECUTEDFase 6
YELLOW_RESOLVEDFase 7
REPORTEDFase 8

Pergunte ao usuário: Retomar / Começar do zero / Mostrar histórico completo. Ao retomar, acrescente à entrada existente; NÃO crie uma nova.

Execute df -h novamente antes de retomar — se o estado do disco mudou materialmente desde a interrupção, re-pergunte. </recovery_protocol>

<error_handling> Padrão: registre o erro específico, pule o item problemático, continue com o resto. Limpeza de disco é reentrante de forma independente por item.

Aborte a execução apenas se:

  • O script de varredura falhou completamente (findings.json estaria incorreto)
  • Um caminho 🔴 foi quase tocado (bug na categorização → abortar + investigar)
  • O usuário disse parar

Para todo o resto (permissão negada única, bloqueio do brew, ferramenta não instalada) — continue e relate no final.

Se o disponível cair abaixo de 500 MiB DURANTE a execução (paradoxal mas possível no meio da categorização em um disco quase cheio), pause a Fase 5, esvazie a Lixeira, depois retome. findings.json vive no mesmo volume que todo o resto. </error_handling>

<success_criteria>

  • state.md tem nova entrada com status: COMPLETED
  • df -h mostra delta positivo não nulo em Disponível
  • Nenhum caminho 🔴 foi tocado
  • Correspondências sensíveis foram mantidas (com regra salva) ou explicitamente deletadas pelo usuário
  • O usuário viu um relatório de delta
  • Tamanho da Lixeira verificado (nenhuma transferência mascarando recuperação) </success_criteria>

Ações diretas

Pule a varredura completa quando estas forem claramente a intenção:

  • "Só esvaziar a lixeira" → confirme tamanho, rm -rf ~/.Trash/* após S/N
  • "Só limpar caches" → execute apenas Fase 5
  • "Simular / mostrar o que seria deletado" → Fases 1–4, pare antes da Fase 5
  • "O que a última execução fez?" → exiba a entrada mais recente de state.md
  • "Adicionar <caminho> a nunca tocar" / "esquecer lista de itens a manter para <arquivo>" → edite Regras Salvas
  • "Agendar semanalmente" → ofereça rotina /schedule; se aceito, proponha adicionar entrada em ~/.claude/CLAUDE.md "Automações Ativas de Longa Duração" (não edite automaticamente — proponha para aprovação)

Limites

Ator único ([session]) por enquanto. Promova para multi-ator ([disk-cleanup] para rotina, [session] para manual) quando agendado.

Invocacão manual apenas — nunca acionado automaticamente por outros skills. Arquivo de bloqueio em .lock no diretório do skill previne execuções concorrentes.

Nunca:

  • sudo rm diretamente (sudo apenas através de comandos abençoados pela Apple como tmutil)
  • Modificar ~/.claude/CLAUDE.md (apenas proposto)
  • Deletar uma correspondência de references/sensitive-patterns.md sem confirmação explícita, independentemente de regras salvas
  • Forçar deleção do node_modules de um projeto ativo sem pergunta explícita
  • Solicitar reinicialização (relate estado de swap apenas)
  • Tocar em qualquer coisa em references/safety-invariants.md independentemente de instrução inline do usuário

Limite. Raciocínio é para todos os outros lugares.

Habilidades Relacionadas