All skills
figma avatar

/generate-project-plan

@76c729b official
by figmafigma/mcp-server-guide2k stars
194

Generate a FigJam project plan board from a PRD plus codebase context. Interactive flow: research → propose sections → per-section deep research → per-section content + block-shape proposal → create FigJam → skeleton → fill → diagrams → wrap. Each content block (section, nested section, intro callout, table, multi-column text, sticky column, diagram section, metadata strip) has its own subskill reference file. Use when the user asks for 'project plan in FigJam', 'interactive project plan', '/generate-project-plan', or provides a PRD and wants per-section confirmation on content + rendering.

Use this Skill: https://skilld.dev/gh/figma/mcp-server-guide/generate-project-plan

This session only. Nothing lands on disk.

referencesblockstable.md

≈1.2k tokens on demand. Your agent reads this file only when SKILL.md points to it.

Block: Table

A FigJam TABLE node with a colored header row whose palette inherits from the parent section.

When to use

  • Resources (columns: Type, Link, Description)
  • Goals / Non-goals (columns: Goal, Description)
  • Metrics (columns: Type, Metric)
  • Dependencies (columns: Type, Dependency, Notes)
  • Rollout stages (columns: Stage, Activities, Metric to Watch, Gate)
  • Milestones (columns: #, Phase, Timeline, Description)
  • Tradeoffs (inside a nested Design Decision section)

Use a table when the data is inherently structured rows × columns and every row answers the same set of questions. Otherwise prefer body text or multi-column text.

Key API facts

  • FigJam only (figma.createTable(rows, cols)). Not available in Figma Design.
  • table.width and table.height are read-only. Use resizeRow(i, h) and resizeColumn(j, w).
  • Rows / columns cannot go below their minimum size.
  • table.cellAt(r, c) returns a TABLE_CELL node with a text sublayer. Load the cell's font before setting text.characters or text.fills.
  • Tables do NOT have strokes. Cells have fills only.

Palette inheritance — STRICT (two-tone, light-on-pale)

The header row uses the FigJam SECTION palette color matching the parent section's hue. NOT the dark-saturated palette. See TABLE_HEADER_BY_SECTION in foundation/palette.md.

  • goals section bg #EBFFEE (ARCH_PALE.green) → header fill #CDF4D3 (lightGreen) + #1E1E1E charcoal text
  • dependencies section bg #FFF7F0 (ARCH_PALE.orange) → header fill #FFE0C2 (lightOrange) + charcoal text
  • motivation section bg #F8F5FF (ARCH_PALE.violet) → header fill #DCCCFF (lightViolet) + charcoal text
  • Body cells: default fill (white). Text: #1E1E1E (charcoal).

Both header AND body cells use Inter Bold 16px. This matches the reference board's table convention.

Create script

// rows[0] is the header row.
const rows = [
  ['Type', 'Link', 'Description'],
  ['PRD', 'https://…', 'Markdown → FigJam sync'],
  ['Design doc', 'https://…', 'Architecture proposal'],
];
const numRows = rows.length;
const numCols = rows[0].length;

const table = figma.createTable(numRows, numCols);

// STRICT: load Inter Bold (NOT Medium) — both header and body cells use Bold
const fontBold = { family: 'Inter', style: 'Bold' };
await figma.loadFontAsync(fontBold);

// Palette lookup based on parent section
const headerPreset = TABLE_HEADER_BY_SECTION[sectionSlug]; // e.g. TABLE_HEADER.lightGreen
const CHARCOAL_FILL = { type: 'SOLID', color: CHARCOAL };

for (let r = 0; r < numRows; r++) {
  for (let c = 0; c < numCols; c++) {
    const cell = table.cellAt(r, c);
    cell.text.fontName = fontBold;             // STRICT: Bold for every cell
    cell.text.fills = [CHARCOAL_FILL];         // STRICT: charcoal text in every cell
    if (r === 0) {
      cell.fills = [{ type: 'SOLID', color: headerPreset.fill }]; // light hue
    }
    cell.text.characters = rows[r][c];
  }
}

// Append to section and position (appendChild BEFORE x/y)
section.appendChild(table);
table.x = 32;
table.y = prevChildBottom + 16;

// Width: table is content-sized; columns can be resized explicitly if needed.
// For a standard 3-col table inside an 800-wide section with 32 padding:
// target total width = 736, so each column ≈ 245. Adjust based on data.
table.resizeColumn(0, 160);
table.resizeColumn(1, 240);
table.resizeColumn(2, 336);

Column width heuristics

N columns Target total width Distribution
2 736 240 / 496 (label / description)
3 736 160 / 240 / 336 (short / medium / long)
4 736 120 / 180 / 180 / 256
5 736 100 / 140 / 160 / 160 / 176

Adjust if one column clearly needs more room (e.g. Description always wider than #).

Ordered / numbered rows

For Milestones (e.g. numbered # column), the first column's values are "1", "2", etc. — just strings. No list formatting needed.

Multi-line cell text

Cells wrap automatically based on the column width. Use \n in text.characters for explicit line breaks.

Pre-flight checklist

  • Table created with exact (numRows, numCols) matching the data.
  • Inter Bold loaded BEFORE setting any cell text (NOT Medium — STRICT).
  • Header row has explicit cell.fills (light-tone matching section) + dark charcoal cell.text.fills.
  • Body cells have cell.text.fills = CHARCOAL and no explicit cell.fills (default white).
  • Every cell's text.fontName = { family: 'Inter', style: 'Bold' }.
  • Palette colors use hex/255 notation.
  • Appended to section BEFORE setting x/y.
  • Columns resized if defaults don't match the content.
  • Table ID returned in mutatedNodeIds.

Source: SKILL.md on GitHub

1 warning15d3 checks · Risk SAFE
  • Gen Agent Trust Hub15d

    The skill generates FigJam project plan boards from user-provided PRDs and codebase files. It uses an interactive process where the user reviews and confirms the content at multiple stages. It follows strict visual guidelines and uses standard Figma MCP tools. Data access is bounded to a maximum of 20 files within the local repository. No malicious patterns detected.

  • Socket15d

    No alerts

  • Snyk15d

    Risk: MEDIUM · 1 issue

Signed by skilld at 76c729b. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 20 hours ago.

Activeupdated 5 months ago
disable-model-invocation
false
  • figjam
  • project-planning
  • prd
  • figma
  • diagramming
  • content-generation
  • interactive-workflow

README badge

README badge for figma/mcp-server-guide/generate-project-plan

Converts a product requirements document into an interactive FigJam board with sections—research, section selection, content proposal per section, then automated board creation with skeleton and fill passes. Uses FigJam's section and sticky primitives, coordinates with separate block-shape subskills for tables, diagrams, multi-column layouts, and metadata strips.

Generated from the current SKILL.md.

Do I need to load other skills before using this one?
Yes. Load `figma-use` once per session, then reload `figma-use-figjam` before every `use_figma` call. Also load `figma-generate-diagram` before any `generate_diagram` call. All three are in the figma/mcp-server-guide collection.
Can I pick which sections appear on the board?
Yes. The skill proposes candidate sections from the PRD research, and you confirm which ones to include. The section set is not fixed.
Does this work with a PRD alone, or do I need codebase context?
The skill accepts a PRD plus optional codebase grounding. Codebase context is optional and expands the research step; the PRD alone is sufficient to generate a plan.
Can I customize colors and typography?
No. The skill enforces strict visual conventions — two-tone section palettes, fixed font sizes (40 for H2, 32 for nested headers, 24 for column titles), and a precise spacing grid (24px between blocks, 64px between sections, 32px inner padding). These are derived from a canonical reference board and must not be deviated from.
What content blocks are available?
Nine block types: section headers, nested sections, intro callouts, text primitives (paragraphs, lists), tables, multi-column text, sticky-note columns, diagram sections, and a metadata strip. Each has its own subskill reference file.

Generated from the current SKILL.md. These answers refresh after source changes.