Communitygithub.com

Organizador de Drafts do Figma

Organiza automaticamente TODOS os arquivos de rascunho (drafts) em um time do Figma, inspecionando o conteúdo real de cada arquivo, renomeando-o em inglês e movendo-o para o projeto de categoria numerada correspondente, usando a API interna do Figma (sem automação de mouse). Cria um novo projeto de categoria numerada quando necessário.

O que é Organizador de Drafts do Figma?

Este skill automatiza a organização completa da pasta de rascunhos (Drafts) de um time no Figma. Ele lê o conteúdo real de cada arquivo (ignorando nomes antigos, que costumam ser genéricos ou incorretos), determina um nome descritivo em inglês e uma categoria com base no conteúdo, e move o arquivo para o projeto de categoria numerada correspondente. Tudo é feito via API interna do Figma (sem cliques ou diálogos), garantindo velocidade e confiabilidade. O modo padrão é totalmente autônomo: processa todos os arquivos um a um sem pedir permissão entre eles. O skill também lida com a criação de novos projetos de categoria quando nenhum existente corresponde. Suporta a leitura de conteúdo via token de acesso pessoal do Figma (read-only) e usa JavaScript no navegador Chrome para todas as chamadas de API. Inclui tratamento de boilerplate (como thumbnails de templates comprados) e uma lista de categorias de referência para manter a consistência.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ahmeduxui/figma-drafts-organizer/tree/main/figma-drafts-organizer

Perguntar na sua IA favorita

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

Documentação

Organizador de Drafts do Figma (Autônomo, API Interna)

Este skill captura uma maneira comprovada e confiável de esvaziar a pasta Drafts de um time do Figma, classificando cada arquivo e arquivando-o no projeto de categoria numerada correto. Ele faz tudo através da API interna do Figma via javascript_tool do Claude no Chrome — sem clicar em cartões de arquivo, sem diálogo de mover, sem manipular campos de renomeação. Essa abordagem baseada em mouse era lenta e frágil; a API interna faz mover + renomear em uma única requisição e nunca trava.

A ideia central que torna os resultados bons: o conteúdo do arquivo é a fonte da verdade, nunca seu nome antigo. Nomes antigos de draft são rotineiramente errados, genéricos ou copiados. Então, para cada arquivo, lemos o texto real dentro de seus frames, decidimos um nome e uma categoria a partir disso, e então renomeamos + movemos.

Modo de operação

O padrão é totalmente autônomo: percorrer a pasta Drafts um arquivo por vez, em ordem, renomeando e movendo cada arquivo imediatamente, sem pausar para aprovação entre arquivos. Reportar um breve resultado por arquivo. Só parar para perguntar ao usuário se algo for genuinamente ambíguo de uma forma que você não consiga resolver a partir do conteúdo (raro) ou se uma chamada de API falhar repetidamente.

Se o usuário pedir explicitamente por uma passagem de visualização/aprovação, mostrar uma tabela de comparação (nome atual → nome sugerido + categoria) e esperar — mas essa é a exceção, não o padrão.

Os cinco passos (por arquivo — reutilize estes, não invente novos)

Para cada arquivo de draft, faça exatamente estas cinco coisas, nesta ordem:

  1. Capturar a chave do arquivo — a partir da lista de drafts (índice 0 da lista reobtida).
  2. Inspecionar o conteúdo real — ler o texto real nos frames via API REST. NÃO confie no nome antigo.
  3. Determinar um novo nome + uma categoria — ambos derivados do conteúdo. Padrão do nome: <Assunto> - <Funcionalidades-chave> Dashboard (em inglês, independente do idioma do design).
  4. Resolver o projeto de destino — encontrar o projeto de categoria numerada correspondente; se nenhum existir, criar um (próximo número na sequência).
  5. Renomear + mover — um único PUT da API interna que faz ambos. Esperar HTTP 200.

Em seguida, reobter a lista de drafts e repetir a partir do passo 1 até que a pasta Drafts esteja vazia. Reobter a cada iteração porque a lista se reordena à medida que os arquivos saem, então sempre pegue o índice 0.


Configuração (uma vez por sessão)

  1. Garanta que haja uma aba do Chrome aberta na página de Drafts do time, ex.: https://www.figma.com/files/team/{TEAM_ID}/drafts, e que você tenha seu tabId. O usuário deve estar logado no Figma nesse perfil do Chrome.

  2. Colete os valores do usuário. Pergunte uma vez se ainda não forem conhecidos:

    • FIGMA_TOKEN — um token de acesso pessoal do Figma com acesso somente leitura a arquivos (Figma → Configurações → Segurança → Tokens de acesso pessoal → escopo "File content: Read only"). Usado apenas para ler o conteúdo dos arquivos.
    • TEAM_ID — o número após /team/ na URL da página de Drafts.

    Coloque-os no bloco CONFIG de scripts/helpers.js (ou defina window.__FIGMA_TOKEN e window.__TEAM_ID antes de colar). Nunca escreva o token em um arquivo que será compartilhado ou versionado.

  3. Cole o bloco de helpers uma vez (veja scripts/helpers.js). Ele define findDraftsFolder, inspect, moveFile, loadFolders, loadDrafts em window. Execute todo JS através do javascript_tool do Claude no Chrome na aba do Figma.

  4. Encontre o id da pasta Drafts (a página de Drafts deve ter terminado de carregar):

    window.findDraftsFolder()   // → "drafts=<id>"
    

    Se retornar NOT_FOUND, recarregue a página de Drafts, aguarde, cole novamente os helpers e tente novamente.

  5. Carregue os projetos de categoria para que renomeações/movimentos possam encontrá-los:

    window.loadFolders()   // preenche window.__folders = { "<nome>": id, ... }
    

Os helpers sobrevivem à navegação normal no aplicativo (SPA), mas uma página de criação de projeto faz um recarregamento completo e os APAGA. Após criar um novo projeto, cole novamente o bloco de helpers e reexecute loadFolders() antes de continuar. Mantenha o token, o id do time e o id da pasta de drafts em suas anotações para que possa restaurá-los após o recarregamento.

Primeira execução em um time sem projetos de categoria

Se o time ainda não tiver projetos numerados, os primeiros arquivos criarão cada um uma categoria (01 - ..., 02 - ...). Isso é esperado. references/categories.md contém uma lista inicial de categorias que funciona bem para trabalho de UI/dashboard; use-a como guia de nomenclatura, não como uma lista que já deve existir.

A lista de categorias ativa é window.__folders após loadFolders(). references/categories.md é uma lista inicial e guia de nomenclatura; leia-a para manter novas categorias consistentes e encontrar o próximo número livre.


Passo 1–2 — Pegar o próximo arquivo e inspecionar seu conteúdo

Obter a lista de drafts, pegar o índice 0, e disparar a inspeção de conteúdo:

window.loadDrafts().then(n=>{
  window.__last="CLEARED"; window.__ir="";
  const d=window.__drafts[0]; window.__cur=d; window.__cn=d?d.name:null;
  if(d){ window.inspect(d.key).then(r=>window.__ir=r).catch(e=>window.__ir="ERR:"+e); }
  return "n="+n+(d?(" first="+String(d.name).replace(/[^A-Za-z0-9 ]/g,"")+" key="+d.key):" EMPTY");
})

n=0 EMPTY significa que a pasta Drafts está vazia — você terminou.

window.inspect percorre os primeiros frames de cada página e coleta strings curtas de texto. Após dispará-lo, aguarde ~8 segundos, então leia a lista de palavras limpa (este filtro remove boilerplate de templates — veja a lista de ignorados abaixo):

new Promise(res=>setTimeout(()=>res(
  [...new Set((window.__last.match(/[A-Za-z]{4,}/g)||[]))]
    .filter(w=>!/http|www|figma|preview|envato|MirNFT|Explore|creators|rankings|Auctions|Solid|Melt|Flare|Mare|Fusion|Soul/i.test(w))
    .slice(0,40).join(" ")
), 8000))

Use a promise setTimeout do JS acima para o atraso, em vez de uma ferramenta de espera separada — isso mantém tudo dentro da aba do navegador.

Se o resultado for esparso ou dominado por boilerplate, escale para uma varredura mais profunda do documento completo (profundidade 12) — veja scripts/deep_walk.js. Se o conteúdo ainda for muito fino para classificar, recorra ao nome antigo do arquivo como último recurso.

Boilerplate a IGNORAR ao classificar

Muitos drafts são templates comprados que compartilham thumbnails decorativas. Classifique pelo frame de dashboard principal nomeado, não por estes:

  • Thumbnails de preview de NFT (MirNFT / preview envato / Explore / Auctions / CryptoPunks / WonderPals / Azuki / Doodles / Decentraland / Sandbox / etc.)
  • Thumbnails de preview de música, previews de comida FastEat
  • A barra lateral genérica de template médico (Message / Test / Payment / Appointment / Settings / Help / Medicine / Order / "Welcome Alexa June") quando aparece dentro de um arquivo não médico

Passo 3 — Decidir nome + categoria a partir do conteúdo

Construa o nome como <Assunto> - <Funcionalidades-chave> Dashboard, em inglês. Exemplos de execuções reais:

  • Crypto wallet + exchange + analytics → Crypto Trading Platform - Wallet & Exchange Dashboard → categoria 07 - Crypto
  • Online courses, students, lecturer, analytics → Online Courses - Students & Performance Dashboard → 05 - LMS
  • Chat app with messages/groups → Chat App - Messages & Groups Dashboard → 36 - Chat & Messaging
  • Calorie/training tracker → Health Tracker - Calories & Training Dashboard → 14 - Medical & Health

Escolha a categoria combinando sinais do conteúdo com a lista de projetos numerados em references/categories.md.


Passo 4 — Resolver (ou criar) o projeto de destino

Procure o nome da categoria em window.__folders. A maioria das chaves de pasta carrega um Dashboard ao final (ex.: 02 - Finance & Insurance Dashboard); algumas não (04 - UI Components, 37 - Agency & Portfolio Website, 47 - Pitch Deck & Presentation, 48 - UX Case Study). Use a chave exata.

Se nenhum projeto de categoria correspondente existir, crie um (isso é esperado e autorizado — não pare para perguntar). A API interna não pode criar projetos, então use a interface do Figma:

  1. Navegue para https://www.figma.com/files/team/{TEAM_ID}/all-projects.
  2. Clique em + Project (canto superior direito). As coordenadas variam por tela — tire um print ou use find para localizar cada controle.
  3. Aguarde, clique no campo Nome, digite o novo nome numerado (próximo número livre de references/categories.md, mesmo estilo dos demais, ex.: 49 - Crowdfunding & Fundraising Dashboard).
  4. Clique em Continue.
  5. No Passo 2 "Adicionar pessoas", clique em Create project SEM adicionar ninguém — nunca altere compartilhamento/permissões.
  6. A página recarrega completamente no novo projeto → cole novamente os helpers e reexecute loadFolders().

Em seguida, prossiga para o movimento.


Passo 5 — Renomear + mover em uma chamada

window.moveFile(window.__cur.key, "<CHAVE DA PASTA DA CATEGORIA>", "<NOVO NOME>").then(r=>"mv="+r)

mv=S200 significa sucesso (renomeado e movido juntos). Qualquer outra coisa: releia o cookie/CSRF, confirme que a chave da pasta existe em window.__folders, e tente novamente.

Volte ao Passo 1.


Regras rígidas (protegem o usuário — siga-as)

  • O conteúdo é a referência, nunca o nome antigo. Sempre inspecione antes de nomear.
  • Autônomo por padrão — sem solicitações de permissão entre arquivos. Apenas reporte resultados.
  • Nomes em inglês, padrão <Assunto> - <Funcionalidades-chave> Dashboard.
  • Crie uma categoria quando faltar, usando o próximo número na sequência; nunca reutilize um número.
  • Nunca delete nada — sem mover para lixeira, sem esvaziar drafts por exclusão. Arquivos apenas são movidos.
  • Nunca altere compartilhamento ou permissões — ao criar um projeto, clique em "Create project" sem adicionar pessoas.
  • Um arquivo por vez, sempre reobter e pegar o índice 0 (a lista se reordena).
  • Cole novamente os helpers após qualquer recarregamento duro de criação de projeto.
  • Use JS do Chrome para todas as chamadas de API do Figma — nunca bash/WebFetch (bloqueado por proxy).

O que NÃO funciona (não perca tempo)

  • PUT /v1/files/{key} (REST pública) → 404. Use a interna PUT /api/files/{key} (em moveFile).
  • A REST pública não tem endpoint para listar drafts → use a interna /api/folders/{id}/paginated_files (em loadDrafts).
  • Criar projetos via API → não suportado. Use o fluxo de interface acima.
  • Ferramentas de espera separadas → não confiáveis aqui; use uma promise setTimeout do JS.
  • Ler uma chave de arquivo de 22 caracteres como string bruta pode ser bloqueada como base64 — os helpers já retornam chaves de forma segura.

Arquivos de referência

  • references/categories.md — uma lista de categorias numeradas inicial + quais chaves não possuem o sufixo Dashboard, e como encontrar o próximo número livre.
  • scripts/helpers.js — o bloco de helpers para colar uma vez por sessão (findDraftsFolder / inspect / moveFile / loadFolders / loadDrafts), com o bloco CONFIG e manipulação de CSRF.
  • scripts/deep_walk.js — varredura de texto completa do documento em profundidade 12 para arquivos esparsos/com muito boilerplate.

Uma nota sobre a API interna

A renomeação + movimento e a listagem de drafts usam a API web interna do Figma (os mesmos endpoints que o aplicativo web do Figma chama), não a API REST pública documentada. Ela é não documentada e pode mudar sem aviso. Se uma chamada que costumava funcionar começar a falhar, o endpoint provavelmente mudou. Use este skill por sua própria conta e risco e de acordo com os termos do Figma.

Habilidades Relacionadas