关于 generate-project-plan
generate-project-plan 将 PRD(可结合代码库信息)转为 FigJam 项目计划板,指导 Agent 选择板块、确认内容与布局,并按既定视觉规范构建画板。
主要功能
- 01基于 PRD 与代码库规划
- 02由用户选择计划板块
- 03确认内容与区块布局
- 04FigJam 画板构建规范
- 05架构图定位与排布
适用场景
- 01将 PRD 转为项目计划板
- 02结合代码库信息完善计划
- 03整理目标、风险、资源或里程碑
MCP 相关
该技能规定构建 FigJam 计划板和图表时需要加载的 Figma 技能,并使用 use_figma 与 generate_diagram。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ figma/ mcp-server-guide --skill generate-project-plan安装后在 Claude Code 中输入/generate-project-plan确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/section-catalog.mdreferences/blocks/diagram-section.mdintro-callout.mdmetadata-strip.mdmulti-column-text.mdnested-section.mdsection.mdsticky-column.mdtable.mdtext-primitives.mdreferences/foundation/codebase-grounding.mdlayout.mdpalette.mdplugin-api-traps.md详细介绍
generate-project-plan
将 PRD(以及可选的代码库依据)转化为 FigJam 项目计划看板。章节集合并非固定——该技能会根据调研提出候选章节,由用户选择要包含哪些章节。对于每个选定的章节,该技能会提出内容和呈现形式(区块),并由用户确认。
必备前置条件
基础技能(按名称加载;可在 figma/mcp-server-guide 中找到):
figma-use— 每个会话只加载一次。 在所有use_figma调用中保持在上下文中。figma-use-figjam— 每次use_figma调用前都要重新加载。figma-generate-diagram— 每次generate_diagram调用前都要重新加载。
基础参考资料(位于此插件中):
foundation/palette.md— 章节、便签和文本的调色板常量(hex/255)。foundation/layout.md— 画布几何尺寸、尺寸规则、占位符生命周期。foundation/plugin-api-traps.md— FigJamuse_figma的已记录陷阱。foundation/codebase-grounding.md— 步骤 1 的扩展规则。
章节目录:
section-catalog.md— 约 10 个候选章节及其默认区块和调色板。
区块子技能(每种内容类型对应一个——每次调用 use_figma 填充前,重新加载所需的子技能):
| 区块 | 文件 | 加载时机 |
|---|---|---|
| 顶层章节 | blocks/section.md | 骨架阶段(步骤 6)以及每次填充调用(步骤 7) |
| 嵌套章节 | blocks/nested-section.md | 用于归类子内容的填充(例如“设计决策 1/2/3”) |
| 引言提示框 | blocks/intro-callout.md | 以醒目引言开篇的填充(例如动机) |
| 文本基元 | blocks/text-primitives.md | 使用正文段落、H3 子标题或项目符号列表的任何填充 |
| 表格 | blocks/table.md | 包含结构化数据的填充(资源、目标、依赖项、发布、里程碑) |
| 多列文本 | blocks/multi-column-text.md | 包含 2–4 个选项列的填充(设计决策的备选方案) |
| 便签列 | blocks/sticky-column.md | 包含便签列表的填充(成功指标、风险、待解决问题) |
| 图表章节 | blocks/diagram-section.md | 右侧栏图表章节(步骤 8) |
| 元数据条 | blocks/metadata-strip.md | 骨架阶段——在看板顶部放置一个元数据条 |
此外,在 use_figma 调用中传入 skillNames: "figma-use,figma-use-figjam,generate-project-plan"(仅用于日志记录)。
视觉界面规范——严格遵守,不得偏离
这些规范源自规范参考看板。完整常量请阅读权威文件;本节集中概述,方便 Agent 无需查找即可回答“什么颜色/尺寸/字体/内边距?”
颜色(每个分区使用双色)
左栏的每个分区都使用两种协调的同色系颜色:极浅的 ARCH_PALE 背景色,以及稍微饱和一些的 FigJam SECTION 配色,用于该分区内的表格表头。右栏的图表分区为纯白色。
分区背景色(ARCH_PALE.X) | 表格表头(TABLE_HEADER.lightX) | 色调 |
|---|---|---|
#F8F5FF | #DCCCFF | 紫罗兰色 |
#EBFFEE | #CDF4D3 | 绿色 |
#DBF0FF | #C2E5FF | 蓝色 |
#F5FBFF(备选) | #C2E5FF | 浅蓝色 |
#FFF7F0 | #FFE0C2 | 橙色 |
#F1FEFD | #C6FAF6 | 青绿色 |
#FFFBF0 | #FFEC BD | 黄色 |
#FFEEF8 | #FFC2EC | 粉色 |
#FFEEE8 | #FFCDC2 | 红色 |
来源:references/foundation/palette.md。切勿将深饱和配色(#874FFF、#3DADFF 等)用于表格表头——这些颜色用于 FigJam 的独立表格,而非项目计划看板。
架构图子图的颜色由 generate_diagram 自动应用,不得覆盖。标准颜色值:client #AFF4C6 圆角矩形、gateway #FFFFFF 方形(标注为“Load Balancer”/“ALB”/“LB”时为菱形)、service #E4CCFF 方形、datastore #BDE3FF 圆柱体、external #FFFFFF PREDEFINED_PROCESS、async #BDE3FF ENG_QUEUE。
排版(字号)
| 元素 | 字号 | 字体 | 颜色 |
|---|---|---|---|
| H1(看板标题) | 40 | Inter Medium | #1E1E1E |
| H2(分区标题——每个分区的第一个子项) | 40 | Inter Medium | #1E1E1E |
| H3——全宽小标题(例如 Motivation 中的“Resources”) | 40 | Inter Medium | #1E1E1E |
| H3——嵌套分区标题(例如“Design Decision 1: …”) | 32 | Inter Medium | #1E1E1E |
| H3——2/3/4 列布局中的列标题(Risks 列、Goals 列) | 24 | Inter Medium | #1E1E1E |
| 正文 | 16 | Inter Medium | #1E1E1E |
| 表格单元格(表头和正文) | 16 | Inter Bold | #1E1E1E |
三种不同的 H3 字号是有意设计的。40 = 小标题单独位于分区中时,与 H2 的字号相同。32 = 子分区中的嵌套分区标题(内部宽度为 672px)。24 = 窄布局中的列标题(列宽 ≤ 224px)。请根据容器宽度而非语义层级选择字号。
在任何会创建表格(使用 Bold)及其他文本(使用 Medium)的 use_figma 脚本开头,始终加载 Inter Medium 和 Inter Bold。
分区属性
| 属性 | 值 |
|---|---|
section.fills | [{ type: 'SOLID', color: ARCH_PALE.X }](左栏)或 ARCH_PALE.white(右栏/图表) |
section.name | ""——空字符串。不要显示 FigJam 标题栏标签。H2 是唯一标题。 |
| 内边距(四边) | 32(当前默认值;参考值为 40-50,目前暂定为 32) |
| 第一个子项的位置 | (32, 32) |
| 宽度(左栏) | 800 |
| 宽度(右栏/图表) | 图表重新设置父级后为 max(1200, diag.width + 64) |
| 包装器内分区之间的垂直间距 | 64 |
| 自适应行为 | 手动处理:追加子项后调用 section.resizeWithoutConstraints(w, maxChildBottom + 32)。分区不会自动增高。 |
| 构建期间的占位符 | 骨架阶段设置 placeholder = true;完成分区填充后设置 placeholder = false。 |
外层容器 + 列对齐(严格默认设置)
画板包含一个外层容器(无标签、白色)和图表列:
- 列容器——位于
(_, 0)的无标签白色 SECTION。内部内容从上到下依次为:- H1 项目标题(40px Inter Medium,炭灰色),位于
(64, 64)(= section 内边距) - 元数据正文行:Owner / Status / Last updated / Source(16px Inter Medium,炭灰色),位于
(64, h1.y + h1.height + 16)—— H1 下方间距为 16px;各正文单元格之间间距为 32px - 正文行下方间距为 64px,随后依次堆叠左列的 6 个 section,间距为 64px
- H1 项目标题(40px Inter Medium,炭灰色),位于
- 图表列位于
(columnWrapperRight + 64, 0)。每张图表都是独立的、未包裹的白色 SECTION;顶部图表的 y 与列容器的 y 对齐(= 0)。图表之间间距为 64px。
元数据嵌入在列容器中(不是独立的 section)。列容器包含所有文本相关内容。
常量:
- 容器内边距(四边):64
- 容器内各 section 的垂直间距:64
- 容器右边缘与图表列左边缘之间的水平间距:64
- 图表列顶部与
wrapper.y对齐(与容器上边缘处于同一水平轴) - 堆叠的图表 section 之间垂直间距:64(与内部间距一致)
const PAD = 64;
const leftIds = [/* all left-column section ids in order */];
const sections = [];
for (const id of leftIds) sections.push(await figma.getNodeByIdAsync(id));
// Compute bbox of the column in page coords
let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
for (const s of sections) {
minX = Math.min(minX, s.x); minY = Math.min(minY, s.y);
maxX = Math.max(maxX, s.x + s.width); maxY = Math.max(maxY, s.y + s.height);
}
const wrapper = figma.createSection();
wrapper.name = ""; // STRICT
wrapper.fills = [{ type: 'SOLID', color: WHITE }]; // ARCH_PALE.white
wrapper.resizeWithoutConstraints((maxX - minX) + 2*PAD, (maxY - minY) + 2*PAD);
wrapper.x = minX - PAD;
wrapper.y = minY - PAD;
// Reparent + translate to keep visual positions
for (const s of sections) {
const newX = (s.x - minX) + PAD;
const newY = (s.y - minY) + PAD;
wrapper.appendChild(s);
s.x = newX;
s.y = newY;
}
容器没有标题(内部没有 H2),也没有名称——它只是纯容器。不要在这里重复项目标题;项目标题应放在元数据栏中。
在容器创建后放置图表列:
const wrapperRight = wrapper.x + wrapper.width;
const diagramX = wrapperRight + 64; // 64px horizontal gap matches inter-section gutter
let y = wrapper.y; // align top with wrapper's top edge
for (const id of diagramSectionIdsInOrder) {
const d = await figma.getNodeByIdAsync(id);
d.x = diagramX;
d.y = y;
y += d.height + 64; // 64px vertical gutter between stacked diagrams
}
垂直间距(严格)
| 位置 | 间距 |
|---|---|
| Section 顶边 → H2(第一个子元素) | 32(= 内边距) |
| H2 → 下一个子元素(正文 / 简介提示框 / H3 / 表格 / 第一列) | 24 |
| 正文段落 → H3 | 24 |
| H3(任意字号:40 / 32 / 24)→ 下一个子元素(正文 / 表格 / 列表 / 列内容) | 24 |
| 正文 → 正文 | 24 |
| 列表 → 下一个区块 | 24 |
| 最后一个子元素底边 → Section 底边 | 32(= 内边距) |
始终使用 prevChild.y + prevChild.height + 24 放置子元素——绝不要使用 prevChild.y + 60 这类固定偏移。H3 有三种字号(40 / 32 / 24),因此固定偏移必然不正确;设置字号后,始终读取 prevChild.height。
**事后更改标题字号时,必须重新堆叠其后续子元素。**设置 h3.fontSize = 40 会增大节点高度;如果下一个子元素的 y 是在调整字号前计算的,就会发生重叠。
表格
- 表头和正文单元格均使用 16px
Inter Bold(不是 Medium)。 - 表头文字使用浅色填充(与 section 的色调相符)上的炭灰色
#1E1E1E。 - 正文单元格保持默认白色填充;文字为炭灰色。
- 表头不要使用深色背景配白字——这不符合此画板的样式。
图表(右侧栏)
使用 generate_diagram 并设置 useArchitectureLayoutCode: "FIGMA_DIAGRAM_2026" 会生成多个页面级节点(1–2 个子图 SECTION + 裸 SHAPE_WITH_TEXT + CONNECTOR),而不是单个容器。要将它们包在一个 section 中:
- 收集所有新建的页面级节点(排除已知的计划 section ID)。
- 计算边界框。
- 创建一个尺寸为
bboxW + 64 × bboxH + 64 + 64的新 SECTION(HEADER_BLOCK = 40 H2 + 24 间距),填充色为ARCH_PALE.white。 - 重新指定每个图表节点的父级,并转换局部坐标以保持视觉布局。
- 关键——重新指定父级后,删除并重新创建每个连接线。 将自身赋值给自身的技巧(
c.connectorStart = c.connectorStart)并不可靠:短连接线可以正确重新路由,但长折弯连接线会保留过时的折线路径点,并延伸到 section 外数百像素。每次删除后使用捕获的规格调用figma.createConnector(),都能生成干净的路由。请参阅blocks/diagram-section.md,了解捕获规格并重新创建的模式。 - 连接线标签——必须显式设置
fontName、fontSize和fills。 新建连接线的text子层没有可用的默认值。四项都要设置:c.text.fontName = { family: 'Inter', style: 'Medium' }、c.text.fontSize = 14、c.text.characters = label、c.text.fills = [{ type: 'SOLID', color: CHARCOAL }]。默认的text.fills是[](空数组),因此标签会以透明色渲染,不可见——读取c.text.characters的结果并不可靠;请通过截图确认。
图表 section 约定:section.name = "",并在内部放置作为标题的 H2 文本节点(与画板其余部分一致)。
不要使用的内容(常见错误默认值)
| 不要使用 | 改用 | 原因 |
|---|---|---|
将 #CDF4D3(FigJam lightGreen)用作 section 背景 | #EBFFEE(ARCH_PALE.green) | 与图表搭配时饱和度过高 |
将 #C2E5FF(FigJam lightBlue)用作 section 背景 | #DBF0FF 或 #F5FBFF(ARCH_PALE.blue / blueLite) | 同上 |
将 #874FFF(FigJam dark violet)用作表格标题栏 | #DCCCFF(FigJam lightViolet) | 参考样式使用浅色配浅底,而非深色配浅底 |
| 在深色表格标题栏上使用白色文字 | 在浅色标题栏上使用 #1E1E1E 炭灰色文字 | 同上——浅色配浅底的约定 |
表格单元格使用 Inter Medium | Inter Bold | 参考样式的所有单元格都使用 Bold |
section.name = "Goals"(或任何非空字符串) | section.name = "" | 参考样式使用空名称;内部的 H2 是标题 |
| 只重新指定生成图表中一个子图的父级 | 重新指定所有页面级节点(SECTION、SHAPE 和 CONNECTOR)的父级 | 架构图并非单个节点 |
认为 c.connectorStart = c.connectorStart 可以重新路由每条连接线 | 重新指定父级后,根据捕获的规格删除并重新创建每条连接线 | 长折弯连接线会保留过时的折线路径点;只有 figma.createConnector() 才能生成新的路由 |
仅在新建连接线上设置 c.text.characters = label | 同时设置 c.text.fontName、c.text.fontSize、c.text.characters 和 c.text.fills | 默认值:fontSize=缺失,fills=[](空数组 → 透明)→ 即使读取结果正确,标签仍不可见 |
步骤模板
以下每个步骤都采用此格式。阅读步骤,然后执行。
## Step N — <Name> [Type: Research | Confirm | Write]
Inputs required: …
Ask if missing: …
Tools / refs loaded: …
Do: (3–6 action bullets)
Checkpoint: (Research → self-check; Confirm → AskUserQuestion; Write → screenshot + AskUserQuestion)
有三种步骤类型:
- Research — 只读;检查点 = 自检清单。
- Confirm — 不写入画板,由用户决策;检查点 =
AskUserQuestion。 - Write — 创建或修改 FigJam;检查点 = 截图 +
AskUserQuestion。
第 1 步 — 收集上下文 [研究]
所需输入
- PRD 文件路径或粘贴的文本。
- 可选:代码库入口(文件路径、服务名称、文档路径)。
缺少时询问
- “PRD 在哪里?(路径或粘贴文本。)”
- “有没有我应该据此开展研究的代码库入口?(路径 / 服务 / 文档 / ‘没有’。)”
已加载工具 / 参考资料
Read、Glob、Grep。foundation/codebase-grounding.md。
操作
- 阅读 PRD。提取:标题、问题、目标、非目标、负责人、受众、成功指标、发布提示、风险。
- 如果提供了入口:遵循
codebase-grounding.md— 最多检查 20 个文件,深入一层查看导入项,并向上查找CLAUDE.md/ARCHITECTURE.md/OWNERS。 - 生成 tech-context 对象:
files_read、services、external_deps、key_modules、architecture_notes、ownership、expansion_truncated。
自检
- 已获取:项目标题、问题陈述、至少 1 个具体目标、负责人(或“待定”)、涉及的服务(或说明原因的空列表)。
- 信息足以在第 2 步拟定候选章节卡片。如果不够,则返回并询问。
第 2 步 — 提出候选章节 [确认]
所需输入
- 第 1 步生成的 tech-context 对象。
已加载工具 / 参考资料
section-catalog.md。AskUserQuestion。
操作
- 对目录中的每个章节,判断第 1 步是否提供了该章节的实质内容。跳过内容为空或只是凑数的目录项。
- 为每个符合条件的候选章节生成一张卡片:
- 标题(目录中的名称)
- 1 行描述(说明本节将包含什么,且内容应针对 PRD)
- 推荐原因(说明哪些 PRD 事实或 tech-context 项目支持此推荐)
- 默认内容结构(取自目录)
- 在聊天中输出所有卡片。
- 按照每批不超过 4 个候选章节,调用
AskUserQuestion提出 multiSelect 问题(每次最多 4 个问题,每个问题 4 个选项 → 每次最多 16 个候选章节)。每个选项的标签为章节标题;描述为 1 行摘要。
检查点(AskUserQuestion)
- 使用上述 multiSelect 问题。用户勾选所需章节。将选中的章节集合保存为
approved_sections。 - 如果未选中任何章节 → 发送简洁的退出消息并停止。不创建文件。
第 3 步 — 按章节深入研究 [研究]
所需输入
- 第 2 步生成的
approved_sections;第 1 步生成的 tech-context。
已加载工具 / 参考资料
Read、Grep、Glob(可选)。
操作
- 对于
approved_sections中的每个章节,查找其目录条目。目录会说明该章节所需的信息(例如,Dependencies 需要跨团队服务、外部依赖项和阻碍因素)。 - 将章节所需信息与 tech-context 中已有的信息进行比较。
- 为每个章节生成一份信息缺口清单:列出用户必须提供的具体信息,并将其表述为可回答的问题(避免出现“自己想办法”之类的缺口)。
自检
approved_sections中的每个条目都标记为ready(无缺口),或附有具体且非空的缺口清单。- 缺口必须可回答,不能是“多讲讲 X”这类含糊的问题。
第 4 步 — 按章节填充内容并提议区块 [确认]
所需输入
- 第 3 步生成的差距清单。
已加载工具 / 参考资料
AskUserQuestion。section-catalog.md。- 章节默认形状的区块参考资料(例如,Dependencies 使用
blocks/table.md)。
操作,逐个章节进行(一次一个;若内容简单,也可小批量处理):
- 填写差距清单——散文内容使用自由文本提示词;限定选项使用
AskUserQuestion。 - 提议:
- 内容:将展示的具体项目符号 / 行 / 便签。
- 区块形状:渲染区块(正文段落 / 表格 / 多列 / 便签列 / …)。默认形状取自
section-catalog.md;在合适时提供其他形状选项(例如:“使用表格还是多列布局?”)。
- 显示简短预览——章节标题 + 正文首行 + 区块类型摘要。
- 调用
AskUserQuestion:“使用此内容和形状?[是 / 编辑 / 跳过此章节]。” - 编辑 → 接受自由文本修改,重新展示并再次询问。跳过 → 将章节标记为
skipped;不要将其写入画布。
检查点
- 每个章节均为
approved、edited+approved或skipped。此时尚未写入画布。
第 5 步 — 创建 FigJam 文件 [写入]
所需输入
approved_sections(不包括已跳过的章节);项目标题;planKey(Figma 团队方案)。
已加载工具 / 参考资料
create_new_fileMCP 工具。whoamiMCP 工具(如果尚不知道planKey,则用于获取它)。use_figma(一次)。figma-use(从第 5 步开始已在上下文中)。figma-use-figjam(为探测重新加载)。AskUserQuestion。
操作
- 确定
planKey:调用whoami。如果只有一个方案 → 使用该方案。如果有多个方案 → 使用AskUserQuestion询问要使用哪个团队。 - 使用
{ planKey, fileName: "<project title>", editorType: "figjam" }调用create_new_file。记录file_key+file_url。 - 运行首次探测(
use_figma):
const page = figma.currentPage;
return {
rootName: figma.root.name,
editorType: figma.editorType,
pageCount: figma.root.children.length,
firstPageName: figma.root.children[0].name,
currentPageChildrenCount: page.children.length,
};
预期 editorType === "figjam" 且页面为空。如果不是,则停止并报告。
检查点(探测输出 + AskUserQuestion)
- 打印探测返回结果 +
file_url。 - 使用 AskUserQuestion 询问:“文件已创建于
<file_url>— 继续创建骨架?[是 / 取消]。”取消 = 停止,保留空文件。
第 6 步 — 创建骨架 [写入]
所需输入
- 按分类顺序排列的
approved_sections;来自foundation/palette.md的配色方案;来自foundation/layout.md的布局常量。
已加载工具 / 参考资料
use_figma(调用一次)。- 重新加载
figma-use-figjam/SKILL.md。 - 重新加载
blocks/section.md和blocks/metadata-strip.md。 foundation/palette.md、foundation/layout.md。
操作
- 根据
blocks/metadata-strip.md创建元数据条(H1 + 4 段正文文本,位于画布(0, 0)–(0, ~100))。 - 为每个已批准的章节,根据
blocks/section.md创建顶层 SECTION——背景颜色取自 ARCH_PALE,section.name = ""(不显示标题栏标签——严格遵守),placeholder = true;左列章节使用resizeWithoutConstraints(LEFT_COL_W, DEFAULT_H),右列图表章节使用resizeWithoutConstraints(RIGHT_COL_W_MIN, DEFAULT_H)。 - 将每个左列章节放置在
(0, SECTION_TOP_Y + cumulative_y)。右列章节放置在(832, SECTION_TOP_Y + cumulative_y_right)。 - 返回所有已创建节点 ID:
{ createdNodeIds: { metadataStrip: {...}, sections: { <slug>: "<id>", ... } }, status: "skeleton-complete" }。(slug是内部标识,用于查找配色方案并驱动第 7 步的填充操作。它绝不会写入section.name。) - 使用
await figma.currentPage.screenshot({ scale: 0.3 })获取内嵌截图。
检查点(截图 + AskUserQuestion)
- 使用 AskUserQuestion 询问:“骨架看起来正确吗?[是 / 修复 / 取消]。”修复 = 运行针对性修复脚本;取消 = 停止。
步骤 7 — 填充内容(每个分区调用一次) [写入]
所需输入
- 每个分区已批准的内容和区块结构;步骤 6 中的分区 ID。
已加载的工具 / 参考资料
use_figma(每个分区调用一次)。- 重新加载
figma-use-figjam/SKILL.md。 - 重新加载此分区使用的区块参考资料:
- 始终加载
blocks/section.md。 - 如果包含正文/H3/列表,则加载
blocks/text-primitives.md。 - 如果包含表格,则加载
blocks/table.md。 - 如果包含多列,则加载
blocks/multi-column-text.md。 - 如果包含嵌套子分区,则加载
blocks/nested-section.md。 - 如果包含高亮导语,则加载
blocks/intro-callout.md。 - 如果包含便笺,则加载
blocks/sticky-column.md。
- 始终加载
每个分区执行以下操作:
await figma.getNodeByIdAsync(sectionId)— 确认类型为 SECTION。- 构建内容:先放置 H2 标题,再按照已批准的区块结构添加子项。先将内容追加到分区中,再设置 x/y。
- 按照
blocks/sticky-column.md的说明,对便笺进行两轮测量。 section.resizeWithoutConstraints(LEFT_COL_W, computed_height)。section.placeholder = false。- 内嵌调用
await section.screenshot()。 return { mutatedNodeIds: [...], sectionHeight, screenshotIncluded: true }。
检查点(截图 + AskUserQuestion)
- 每个分区都询问 AskUserQuestion:"Section
<name>done? [Yes / Edit this section / Skip rest]." 选择 Edit = 定点修复;选择 Skip rest = 退出填充循环(用户将手动完成)。
完成所有左栏填充后:运行重排步骤(调用一次 use_figma),根据实际调整后的高度修正累计 Y 坐标:
let y = SECTION_TOP_Y;
for (const id of leftColumnSectionIdsInOrder) {
const sec = await figma.getNodeByIdAsync(id);
sec.y = y;
sec.x = 0;
y += sec.height + 32;
}
return { mutatedNodeIds: leftColumnSectionIdsInOrder };
然后运行外层包装步骤(调用一次 use_figma)— 将所有左栏分区包裹在一个无标签的白色外层 SECTION 中(参见上文视觉规范区块中的“外栏包装器”)。此步骤为严格要求;不得跳过。
步骤 8 — 图表 [写入]
所需输入
- 步骤 2/4 中的图表意图(当前状态、目标状态、0–N 个关键流程);用于组合 Mermaid 的技术上下文。
已加载的工具 / 参考资料
- 每次调用
generate_diagram前,重新加载generate-diagram/SKILL.md。 - 每次调用
use_figma重新设置父级前,重新加载figma-use-figjam/SKILL.md+blocks/diagram-section.md。 generate_diagramMCP 工具、use_figma。
每个图表执行以下操作:
use_figma:按照blocks/diagram-section.md创建右栏分区(白色填充、H2 标题、placeholder = true)。generate_diagram:根据技术上下文组合 Mermaid;架构图使用useArchitectureLayoutCode: "FIGMA_DIAGRAM_2026"。use_figma:找到生成的图表节点,将其重新设置父级到该分区中(section.appendChild(diag)),放置在 H2 下方,并调整分区大小以适应内容。placeholder = false。await section.screenshot()。
失败处理:如果 generate_diagram 失败,在分区中保留文本占位内容 "Diagram generation failed: <message>. Regenerate manually."。继续处理下一个图表。
检查点(截图 + AskUserQuestion)
- 每个图表都询问 AskUserQuestion:"Diagram
<name>looks right? [Yes / Regenerate / Skip]."
步骤 9 — 最终审核 + 报告 [写入,然后读取]
所需输入
- 步骤 5 中的
file_url。
已加载的工具 / 参考资料
use_figma(调用一次,获取整页截图)。
执行操作
await figma.currentPage.screenshot({ scale: 0.25 })— 截取整个画板。- 检查:双栏结构、无重叠、没有保留
placeholder = true的分区、元数据条可见。 - 使用定点
use_figma脚本修复任何问题。不要从头重新生成。 - 发布到聊天:
✅ Project plan written to FigJam.
File: <file_url>
Sections: <N text + N diagram>
Files referenced during grounding: <count>
检查点(截图 + AskUserQuestion)
- 询问 AskUserQuestion:"Done, or tweak? [Done / Tweak]." 选择 Tweak = 根据用户请求运行定点修复脚本,不重新生成。
操作规则
- 每次
use_figma调用最多执行 10 项逻辑操作。 - 每个写入脚本都必须返回
createdNodeIds/mutatedNodeIds。 - 所有调色板颜色均使用
hex/255表示法(参见foundation/palette.md)。 - 严格要求:分区背景使用
ARCH_PALE调色板,而非 FigJam 标准分区调色板。ARCH_PALE颜色(#EBFFEE、#F8F5FF、#F5FBFF、#FFF7F0等)与generate_diagram生成的架构图子图包装框在视觉上相得益彰。FigJam SECTION 调色板(#CDF4D3、#C2E5FF、#DCCCFF、#FFE0C2)过于饱和,与图表相邻时会产生明显的色彩冲突。参见foundation/palette.md。 - 严格要求:所有项目计划分区(左列、右列和嵌套子项)的
section.name = ""。 面向用户的标题应作为 H2 文本节点放在分区内部,而不是通过 FigJam 的分区标题栏标签显示。参考画布使用空分区名称;设置非空的name会产生重复标签,使画布显得杂乱。 - 在每个 Confirm/Write 检查点读取、编辑或取消;绝不能在尚未回答 AskUserQuestion 时继续写入。
- 如果
use_figma脚本出错:操作具有原子性,不会进行任何更改。读取错误信息、修复后重试。
触发短语
"/generate-project-plan"、“交互式项目计划”、“项目计划”、“制作 FigJam 项目计划”、“将 PRD 转换为 FigJam”