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:
- Capturar a chave do arquivo — a partir da lista de drafts (índice 0 da lista reobtida).
- Inspecionar o conteúdo real — ler o texto real nos frames via API REST. NÃO confie no nome antigo.
- 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). - Resolver o projeto de destino — encontrar o projeto de categoria numerada correspondente; se nenhum existir, criar um (próximo número na sequência).
- Renomear + mover — um único
PUTda 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)
-
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 seutabId. O usuário deve estar logado no Figma nesse perfil do Chrome. -
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
CONFIGdescripts/helpers.js(ou definawindow.__FIGMA_TOKENewindow.__TEAM_IDantes de colar). Nunca escreva o token em um arquivo que será compartilhado ou versionado. -
Cole o bloco de helpers uma vez (veja
scripts/helpers.js). Ele definefindDraftsFolder,inspect,moveFile,loadFolders,loadDraftsemwindow. Execute todo JS através dojavascript_tooldo Claude no Chrome na aba do Figma. -
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. -
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→ categoria07 - 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:
- Navegue para
https://www.figma.com/files/team/{TEAM_ID}/all-projects. - Clique em + Project (canto superior direito). As coordenadas variam por tela — tire um
print ou use
findpara localizar cada controle. - 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). - Clique em Continue.
- No Passo 2 "Adicionar pessoas", clique em Create project SEM adicionar ninguém — nunca altere compartilhamento/permissões.
- 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 internaPUT /api/files/{key}(emmoveFile).- A REST pública não tem endpoint para listar drafts → use a interna
/api/folders/{id}/paginated_files(emloadDrafts). - 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
setTimeoutdo 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 sufixoDashboard, 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.