mcpField
G
generate-project-plan

generate-project-plan

github.com/figma生产力2.1k51 次安装今天更新
代码仓库

关于 generate-project-plan

generate-project-plan 将 PRD(可结合代码库信息)转为 FigJam 项目计划板,指导 Agent 选择板块、确认内容与布局,并按既定视觉规范构建画板。

主要功能

  1. 01基于 PRD 与代码库规划
  2. 02由用户选择计划板块
  3. 03确认内容与区块布局
  4. 04FigJam 画板构建规范
  5. 05架构图定位与排布

适用场景

  1. 01将 PRD 转为项目计划板
  2. 02结合代码库信息完善计划
  3. 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.md
references/blocks/
diagram-section.md
intro-callout.md
metadata-strip.md
multi-column-text.md
nested-section.md
section.md
sticky-column.md
table.md
text-primitives.md
references/foundation/
codebase-grounding.md
layout.md
palette.md
plugin-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 调用前都要重新加载。

基础参考资料(位于此插件中):

章节目录:

区块子技能(每种内容类型对应一个——每次调用 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(看板标题)40Inter Medium#1E1E1E
H2(分区标题——每个分区的第一个子项)40Inter Medium#1E1E1E
H3——全宽小标题(例如 Motivation 中的“Resources”)40Inter Medium#1E1E1E
H3——嵌套分区标题(例如“Design Decision 1: …”)32Inter Medium#1E1E1E
H3——2/3/4 列布局中的列标题(Risks 列、Goals 列)24Inter Medium#1E1E1E
正文16Inter Medium#1E1E1E
表格单元格(表头和正文)16Inter 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。
外层容器 + 列对齐(严格默认设置)

画板包含一个外层容器(无标签、白色)和图表列:

  1. 列容器——位于 (_, 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
  2. 图表列位于 (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
正文段落 → H324
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 中:

  1. 收集所有新建的页面级节点(排除已知的计划 section ID)。
  2. 计算边界框。
  3. 创建一个尺寸为 bboxW + 64 × bboxH + 64 + 64 的新 SECTION(HEADER_BLOCK = 40 H2 + 24 间距),填充色为 ARCH_PALE.white。
  4. 重新指定每个图表节点的父级,并转换局部坐标以保持视觉布局。
  5. 关键——重新指定父级后,删除并重新创建每个连接线。 将自身赋值给自身的技巧(c.connectorStart = c.connectorStart)并不可靠:短连接线可以正确重新路由,但长折弯连接线会保留过时的折线路径点,并延伸到 section 外数百像素。每次删除后使用捕获的规格调用 figma.createConnector(),都能生成干净的路由。请参阅 blocks/diagram-section.md,了解捕获规格并重新创建的模式。
  6. 连接线标签——必须显式设置 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 MediumInter 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 在哪里?(路径或粘贴文本。)”
  • “有没有我应该据此开展研究的代码库入口?(路径 / 服务 / 文档 / ‘没有’。)”

已加载工具 / 参考资料

操作

  1. 阅读 PRD。提取:标题、问题、目标、非目标、负责人、受众、成功指标、发布提示、风险。
  2. 如果提供了入口:遵循 codebase-grounding.md — 最多检查 20 个文件,深入一层查看导入项,并向上查找 CLAUDE.md/ARCHITECTURE.md/OWNERS。
  3. 生成 tech-context 对象:files_read、services、external_deps、key_modules、architecture_notes、ownership、expansion_truncated。

自检

  • 已获取:项目标题、问题陈述、至少 1 个具体目标、负责人(或“待定”)、涉及的服务(或说明原因的空列表)。
  • 信息足以在第 2 步拟定候选章节卡片。如果不够,则返回并询问。

第 2 步 — 提出候选章节 [确认]

所需输入

  • 第 1 步生成的 tech-context 对象。

已加载工具 / 参考资料

操作

  1. 对目录中的每个章节,判断第 1 步是否提供了该章节的实质内容。跳过内容为空或只是凑数的目录项。
  2. 为每个符合条件的候选章节生成一张卡片:
    • 标题(目录中的名称)
    • 1 行描述(说明本节将包含什么,且内容应针对 PRD)
    • 推荐原因(说明哪些 PRD 事实或 tech-context 项目支持此推荐)
    • 默认内容结构(取自目录)
  3. 在聊天中输出所有卡片。
  4. 按照每批不超过 4 个候选章节,调用 AskUserQuestion 提出 multiSelect 问题(每次最多 4 个问题,每个问题 4 个选项 → 每次最多 16 个候选章节)。每个选项的标签为章节标题;描述为 1 行摘要。

检查点(AskUserQuestion)

  • 使用上述 multiSelect 问题。用户勾选所需章节。将选中的章节集合保存为 approved_sections。
  • 如果未选中任何章节 → 发送简洁的退出消息并停止。不创建文件。

第 3 步 — 按章节深入研究 [研究]

所需输入

  • 第 2 步生成的 approved_sections;第 1 步生成的 tech-context。

已加载工具 / 参考资料

  • Read、Grep、Glob(可选)。

操作

  1. 对于 approved_sections 中的每个章节,查找其目录条目。目录会说明该章节所需的信息(例如,Dependencies 需要跨团队服务、外部依赖项和阻碍因素)。
  2. 将章节所需信息与 tech-context 中已有的信息进行比较。
  3. 为每个章节生成一份信息缺口清单:列出用户必须提供的具体信息,并将其表述为可回答的问题(避免出现“自己想办法”之类的缺口)。

自检

  • approved_sections 中的每个条目都标记为 ready(无缺口),或附有具体且非空的缺口清单。
  • 缺口必须可回答,不能是“多讲讲 X”这类含糊的问题。

第 4 步 — 按章节填充内容并提议区块 [确认]

所需输入

  • 第 3 步生成的差距清单。

已加载工具 / 参考资料

  • AskUserQuestion。
  • section-catalog.md。
  • 章节默认形状的区块参考资料(例如,Dependencies 使用 blocks/table.md)。

操作,逐个章节进行(一次一个;若内容简单,也可小批量处理):

  1. 填写差距清单——散文内容使用自由文本提示词;限定选项使用 AskUserQuestion。
  2. 提议:
    • 内容:将展示的具体项目符号 / 行 / 便签。
    • 区块形状:渲染区块(正文段落 / 表格 / 多列 / 便签列 / …)。默认形状取自 section-catalog.md;在合适时提供其他形状选项(例如:“使用表格还是多列布局?”)。
  3. 显示简短预览——章节标题 + 正文首行 + 区块类型摘要。
  4. 调用 AskUserQuestion:“使用此内容和形状?[是 / 编辑 / 跳过此章节]。”
  5. 编辑 → 接受自由文本修改,重新展示并再次询问。跳过 → 将章节标记为 skipped;不要将其写入画布。

检查点

  • 每个章节均为 approved、edited+approved 或 skipped。此时尚未写入画布。

第 5 步 — 创建 FigJam 文件 [写入]

所需输入

  • approved_sections(不包括已跳过的章节);项目标题;planKey(Figma 团队方案)。

已加载工具 / 参考资料

  • create_new_file MCP 工具。
  • whoami MCP 工具(如果尚不知道 planKey,则用于获取它)。
  • use_figma(一次)。
  • figma-use(从第 5 步开始已在上下文中)。
  • figma-use-figjam(为探测重新加载)。
  • AskUserQuestion。

操作

  1. 确定 planKey:调用 whoami。如果只有一个方案 → 使用该方案。如果有多个方案 → 使用 AskUserQuestion 询问要使用哪个团队。
  2. 使用 { planKey, fileName: "<project title>", editorType: "figjam" } 调用 create_new_file。记录 file_key + file_url。
  3. 运行首次探测(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 的布局常量。

已加载工具 / 参考资料

操作

  1. 根据 blocks/metadata-strip.md 创建元数据条(H1 + 4 段正文文本,位于画布 (0, 0)–(0, ~100))。
  2. 为每个已批准的章节,根据 blocks/section.md 创建顶层 SECTION——背景颜色取自 ARCH_PALE,section.name = ""(不显示标题栏标签——严格遵守),placeholder = true;左列章节使用 resizeWithoutConstraints(LEFT_COL_W, DEFAULT_H),右列图表章节使用 resizeWithoutConstraints(RIGHT_COL_W_MIN, DEFAULT_H)。
  3. 将每个左列章节放置在 (0, SECTION_TOP_Y + cumulative_y)。右列章节放置在 (832, SECTION_TOP_Y + cumulative_y_right)。
  4. 返回所有已创建节点 ID:{ createdNodeIds: { metadataStrip: {...}, sections: { <slug>: "<id>", ... } }, status: "skeleton-complete" }。(slug 是内部标识,用于查找配色方案并驱动第 7 步的填充操作。它绝不会写入 section.name。)
  5. 使用 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。

每个分区执行以下操作:

  1. await figma.getNodeByIdAsync(sectionId) — 确认类型为 SECTION。
  2. 构建内容:先放置 H2 标题,再按照已批准的区块结构添加子项。先将内容追加到分区中,再设置 x/y。
  3. 按照 blocks/sticky-column.md 的说明,对便笺进行两轮测量。
  4. section.resizeWithoutConstraints(LEFT_COL_W, computed_height)。
  5. section.placeholder = false。
  6. 内嵌调用 await section.screenshot()。
  7. 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_diagram MCP 工具、use_figma。

每个图表执行以下操作:

  1. use_figma:按照 blocks/diagram-section.md 创建右栏分区(白色填充、H2 标题、placeholder = true)。
  2. generate_diagram:根据技术上下文组合 Mermaid;架构图使用 useArchitectureLayoutCode: "FIGMA_DIAGRAM_2026"。
  3. use_figma:找到生成的图表节点,将其重新设置父级到该分区中(section.appendChild(diag)),放置在 H2 下方,并调整分区大小以适应内容。placeholder = false。
  4. 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(调用一次,获取整页截图)。

执行操作

  1. await figma.currentPage.screenshot({ scale: 0.25 }) — 截取整个画板。
  2. 检查:双栏结构、无重叠、没有保留 placeholder = true 的分区、元数据条可见。
  3. 使用定点 use_figma 脚本修复任何问题。不要从头重新生成。
  4. 发布到聊天:
✅ 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”

评论

支持 Markdown