Figma草稿整理器(自主运行,内部API)
本技能提供了一种经过验证的可靠方法,用于清空Figma团队的草稿文件夹:对每个文件进行分类,并将其归档到正确的编号分类项目中。整个过程通过Figma的内部API完成,使用Chrome中的Claude的javascript_tool执行——无需点击文件卡片、无需移动对话框、无需编辑重命名字段。之前依赖鼠标操作的方式既慢又脆弱;而内部API通过一次请求即可完成移动+重命名,且不会卡住。
使效果良好的核心理念:文件内容是真实依据,旧文件名永远不是。 旧草稿名称通常是错误的、通用的或是复制粘贴的。因此,对于每个文件,我们读取其框架内的实际文本,基于内容决定名称和分类,然后执行重命名+移动。
运行模式
默认模式为完全自主运行:逐个处理草稿文件夹中的文件,按顺序立即重命名并移动每个文件,无需在文件之间暂停请求批准。每个文件报告一个简短的结果。只有当出现你无法从内容中解决的真实歧义(很少见)或API调用连续失败时,才会停下来询问用户。
如果用户明确要求预览/批准流程,则显示一个对比表(当前名称 → 建议名称 + 分类)并等待——但这是例外情况,非默认行为。
五个步骤(每个文件——请复用这些步骤,不要自行创建新的)
对于每个草稿文件,严格按照以下顺序执行这五个步骤:
- 获取文件密钥——从草稿列表中获取(重新获取后的列表索引0)。
- 检查实际内容——通过REST API读取框架内的真实文本。不要信任旧文件名。
- 确定新名称 + 分类——两者都基于内容推导。
名称格式:
<主题> - <关键特性> Dashboard(英文,无论设计使用何种语言)。 - 解析目标项目——找到匹配的编号分类项目;如果不存在,则创建一个(按序下一个编号)。
- 重命名 + 移动——一次内部API
PUT请求完成两者。期望HTTP 200。
然后重新获取草稿列表并从步骤1重复,直到草稿文件夹为空。每次迭代都重新获取,因为文件移走时列表会重新排序,所以始终取索引0。
设置(每次会话一次)
-
确保Chrome标签页已打开到团队的草稿页面,例如
https://www.figma.com/files/team/{TEAM_ID}/drafts,并且你拥有其tabId。用户必须已在该Chrome配置文件中登录Figma。 -
收集用户的值。如果尚未知晓,询问一次:
FIGMA_TOKEN——具有只读文件访问权限的Figma个人访问令牌(Figma → 设置 → 安全 → 个人访问令牌 → 作用域“文件内容:只读”)。仅用于读取文件内容。TEAM_ID——草稿页面URL中/team/后面的数字。
将它们放入
scripts/helpers.js的CONFIG块中(或者在粘贴前设置window.__FIGMA_TOKEN和window.__TEAM_ID)。切勿将令牌写入将共享或提交的文件中。 -
粘贴一次辅助模块(参见
scripts/helpers.js)。它在window上定义了findDraftsFolder、inspect、moveFile、loadFolders、loadDrafts。所有JS代码通过Claude in Chromejavascript_tool在Figma标签页上运行。 -
找到草稿文件夹ID(草稿页面必须已加载完成):
window.findDraftsFolder() // → "drafts=<id>"如果返回
NOT_FOUND,重新加载草稿页面,等待,重新粘贴辅助模块并重试。 -
加载分类项目,以便重命名/移动操作能找到它们:
window.loadFolders() // 填充 window.__folders = { "<名称>": id, ... }
辅助模块在正常的应用内(SPA)导航后仍然存在,但项目创建页面会进行硬重新加载并清除它们。 创建新项目后,在继续之前重新粘贴辅助模块并重新运行
loadFolders()。在笔记中保留令牌、团队ID和草稿文件夹ID,以便在重新加载后恢复它们。
在没有任何分类项目的团队上首次运行
如果团队还没有任何编号项目,第一个文件将各自创建一个分类(01 - ...、02 - ...)。这是预期的。references/categories.md 包含一个适用于UI/仪表板工作的分类起始列表;请将其用作命名指南,而不是一个必须已存在的列表。
实时的分类列表是 loadFolders() 之后的 window.__folders。references/categories.md 是一个起始列表和命名指南;请阅读它以保持新分类的一致性,并找到下一个空闲编号。
步骤1–2 — 获取下一个文件并检查其内容
获取草稿列表,取索引0,然后触发内容检查:
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 表示草稿文件夹为空——任务完成。
window.inspect 遍历每个页面的前几个框架并收集短文本字符串。触发后,等待约8秒,然后读取清洗后的单词列表(此过滤器会删除模板样板文本——请参见下面的忽略列表):
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))
使用上面的JS setTimeout promise进行延迟,而不是使用单独的等待工具——这样可以将所有操作保留在浏览器标签页内。
如果结果稀疏或被样板文本主导,则升级到更深的整文档遍历(深度12)——请参见 scripts/deep_walk.js。如果内容仍然太少而无法分类,则最后才回退到文件的旧文件名。
分类时应忽略的样板文本
许多草稿是共享装饰性缩略图的购买模板。请根据主要的命名仪表板框架进行分类,而不是以下内容:
- NFT预览缩略图(MirNFT / preview envato / Explore / Auctions / CryptoPunks / WonderPals / Azuki / Doodles / Decentraland / Sandbox 等)
- 音乐预览缩略图、FastEat食物预览
- 通用的医疗模板侧边栏(Message / Test / Payment / Appointment / Settings / Help / Medicine / Order / "Welcome Alexa June"),当它出现在非医疗文件中时
步骤3 — 根据内容决定名称和分类
构建名称为 <主题> - <关键特性> Dashboard,使用英文。实际运行中的示例:
- 加密钱包 + 交易所 + 分析 →
Crypto Trading Platform - Wallet & Exchange Dashboard→ 分类07 - Crypto - 在线课程、学生、讲师、分析 →
Online Courses - Students & Performance Dashboard→05 - LMS - 带消息/群组的聊天应用 →
Chat App - Messages & Groups Dashboard→36 - Chat & Messaging - 卡路里/训练追踪器 →
Health Tracker - Calories & Training Dashboard→14 - Medical & Health
通过将内容信号与 references/categories.md 中的编号项目列表匹配来选择分类。
步骤4 — 解析(或创建)目标项目
在 window.__folders 中查找分类名称。大多数文件夹键带有尾随的 Dashboard(例如 02 - Finance & Insurance Dashboard);少数没有(04 - UI Components、37 - Agency & Portfolio Website、47 - Pitch Deck & Presentation、48 - UX Case Study)。使用精确的键。
如果没有匹配的分类项目,则创建一个(这是预期且授权的——不要停下来询问)。内部API无法创建项目,因此使用Figma UI:
- 导航到
https://www.figma.com/files/team/{TEAM_ID}/all-projects。 - 点击 + Project(右上角)。坐标因屏幕而异——截取屏幕截图或使用
find定位每个控件。 - 等待,点击名称字段,输入新的编号名称(来自
references/categories.md的下一个空闲编号,风格与其余项目相同,例如49 - Crowdfunding & Fundraising Dashboard)。 - 点击 Continue。
- 在步骤2“添加人员”中,点击 Create project 不要添加任何人——绝不更改共享/权限。
- 页面硬重新加载到新项目 → 重新粘贴辅助模块并重新运行
loadFolders()。
然后继续进行移动。
步骤5 — 一次调用完成重命名+移动
window.moveFile(window.__cur.key, "<分类文件夹密钥>", "<新名称>").then(r=>"mv="+r)
mv=S200 表示成功(同时进行了重命名和移动)。其他任何结果:重新读取cookie/CSRF,确认文件夹密钥存在于 window.__folders 中,然后重试。
循环回到步骤1。
硬性规则(这些规则保护用户——请遵守)
- 内容才是参考,旧名称永远不是。 在命名之前始终检查内容。
- 默认自主运行——文件之间无需权限提示。只需报告结果。
- 英文名称,格式
<主题> - <关键特性> Dashboard。 - 分类缺失时创建,使用序列中的下一个编号;绝不重复使用编号。
- 绝不删除任何内容——不删除文件,不通过删除清空草稿。文件仅移动。
- 绝不更改共享或权限——创建项目时,点击“Create project”但不添加人员。
- 一次处理一个文件,始终重新获取并取索引0(列表会重新排序)。
- 项目创建硬重新加载后重新粘贴辅助模块。
- 所有Figma API调用使用Chrome JS——绝不使用bash/WebFetch(会被代理阻止)。
哪些方法无效(不要浪费时间)
PUT /v1/files/{key}(公共REST)→ 404。使用内部PUT /api/files/{key}(在moveFile中)。- 公共REST没有草稿列表端点 → 使用内部
/api/folders/{id}/paginated_files(在loadDrafts中)。 - 通过API创建项目 → 不支持。使用上述UI流程。
- 单独的等待工具 → 在此处不可靠;使用JS
setTimeoutpromise。 - 将22字符的文件密钥作为原始字符串读取可能会被拦截为base64——辅助模块已安全返回密钥。
参考文件
references/categories.md— 起始编号分类列表 + 哪些键缺少Dashboard后缀,以及如何找到下一个空闲编号。scripts/helpers.js— 每次会话粘贴一次的辅助模块(findDraftsFolder / inspect / moveFile / loadFolders / loadDrafts),包含CONFIG块和CSRF处理。scripts/deep_walk.js— 深度12的整文档文本遍历,用于内容稀疏或样板文本较多的文件。
关于内部API的说明
重命名+移动和草稿列表使用Figma的内部Web API(与Figma Web应用程序调用的端点相同),而非文档化的公共REST API。它没有文档记录,并且可能随时更改。如果之前能用的调用开始失败,则端点可能已更改。请自行酌情使用此技能,并遵守Figma的条款。