fsi-strip-profile by anthropics/financial-services-plugins
npx skills add https://github.com/anthropics/financial-services-plugins --skill fsi-strip-profile数据来源:
所需指标:
标准化处理:
在制作前:
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
关键:你必须一次只创建一页幻灯片,并在获得用户批准后再进行下一页。
对于每一页幻灯片:
仅使用 PptxGenJS 创建这一页幻灯片
强制要求:转换为图片以供审阅 - 你必须将幻灯片转换为图片,以便进行视觉验证:
soffice --headless --convert-to pdf presentation.pptx
pdftoppm -jpeg -r 150 -f 1 -l 1 presentation.pdf slide
强制视觉审查:在继续之前,你必须仔细检查渲染的幻灯片图片:
如果检测到任何重叠或截断:立即使用以下策略按顺序修复:
向用户展示幻灯片图片及下载链接
停止并等待用户的明确批准,然后再创建下一页幻灯片。在用户确认之前不要继续。
你必须在每一页检查以下特定问题:
首要目标是实现最大的信息密度。 忙碌的高管应该在30秒内了解整个公司的故事。将每个象限填满至容量。
每个象限的目标:
信息打包技巧:
如果某个象限看起来稀疏,请添加更多内容:
行间距 - 每个部分使用单个文本框:
def add_section(slide, x, y, w, header_text, bullets, header_size=10, bullet_size=8):
"""标题 + 要点在单个文本框内,具有自然间距"""
tb = slide.shapes.add_textbox(x, y, w, Inches(len(bullets) * 0.18 + 0.3))
tf = tb.text_frame
tf.word_wrap = True
# 标题段落
p = tf.paragraphs[0]
p.text = header_text
p.font.bold = True
p.font.size = Pt(header_size)
p.font.color.rgb = RGBColor(0, 51, 102)
p.space_after = Pt(6) # 标题后的小间隙
# 要点段落
for bullet in bullets:
p = tf.add_paragraph()
p.text = bullet
p.font.size = Pt(bullet_size)
p.space_after = Pt(3)
return tb
关键间距原则:
space_after = Pt(6),要点之间使用 Pt(3)3-4页信息密集的幻灯片 - 使用象限、列、表格、图表
所有正文文本使用要点 - 切勿使用段落。每个部分使用一个包含所有要点的文本框 - 不要为每个要点创建单独的文本框。使用 PptxGenJS 要点格式化:
// 正确:包含要点列表的单个文本框 - 每个数组项变成一个要点
// 位于左上象限(公司概览)- 标题后带强调条
slide.addText(
[
{ text: '总部:德克萨斯州奥斯汀;成立于2003年', options: { bullet: { indent: 10 }, breakLine: true } },
{ text: '员工:全球超过140,000名,遍布6大洲', options: { bullet: { indent: 10 }, breakLine: true } },
{ text: 'CEO:Elon Musk;CFO:Vaibhav Taneja', options: { bullet: { indent: 10 }, breakLine: true } },
{ text: '市值:8500亿美元(全球市值排名第6)', options: { bullet: { indent: 10 }, breakLine: true } },
{ text: '分部:汽车(85%)、能源(10%)、服务(5%)', options: { bullet: { indent: 10 } } }
],
{ x: 0.45, y: 0.95, w: 4.5, h: 2.6, fontSize: 11, fontFace: 'Arial', valign: 'top', paraSpaceAfter: 6 }
);
// 错误:为每个要点创建多个独立的文本框 - 会导致对齐问题
// slide.addText('总部:奥斯汀', { x: 0.5, y: 1.0, bullet: true });
要点格式化技巧:
* `bullet: { indent: 10 }` - 控制要点缩进(越小越紧凑)
* `paraSpaceAfter: 6` - 每个段落后的间距(磅)
* 将多个相关事实打包到每个要点中(例如,"总部:奥斯汀;成立时间:2003年")
* 为增加信息密度,包含具体数字和百分比
标题使用首字母大写(非全大写),左对齐
所有地方字体一致,包括表格
使用公司品牌颜色 - 在创建幻灯片之前,你必须通过网页搜索研究实际的品牌颜色。不要猜测或假设颜色。
如果提供了品牌指南,请遵循
请参阅 examples/Nike_Strip_Profile_Example.pptx 获取布局灵感。根据每家公司的品牌调整颜色。
必须通过忙碌高管的"30秒理解测试"。
使用 4:3 宽高比(标准的投行推介书格式):
const pptx = new pptxgen();
pptx.layout = 'LAYOUT_4x3'; // 10英寸宽 × 7.5英寸高 - 必须使用此设置
PptxGenJS 使用英寸。4:3 幻灯片 = 10英寸宽 × 7.5英寸高。
┌─────────────────────────────────────────────────────────────────┐
│ y=0.2 标题:公司名称(股票代码) │
├────────────────────────────┬────────────────────────────────────┤
│ y=0.6 公司概览 │ y=0.6 业务与定位 │
│ x=0.3, w=4.7 │ x=5.0, w=4.7 │
│ h=3.0 │ h=3.0 │
├────────────────────────────┼────────────────────────────────────┤
│ y=3.7 关键财务数据 │ y=3.7 股票/近期动态 │
│ x=0.3, w=4.7 │ x=5.0, w=4.7 │
│ h=3.5 │ h=3.5 │
└────────────────────────────┴────────────────────────────────────┘
y=7.5
公司名称(股票代码) - 示例:Tesla, Inc. (TSLA)
slide.addText('Tesla, Inc. (TSLA)', { x: 0.3, y: 0.2, w: 9.4, h: 0.35, fontSize: 18, bold: true });
| 象限 | 位置 | 内容 |
|---|---|---|
| 1 | x=0.3, y=0.6, w=4.7, h=3.0 | 公司概览:总部、成立时间、关键统计数据、业务摘要(4-5个要点) |
| 2 | x=5.0, y=0.6, w=4.7, h=3.0 | 业务与定位:收入驱动因素、产品/服务、竞争地位、增长驱动因素(4-5个要点) |
| 3 | x=0.3, y=3.7, w=4.7, h=3.5 | 关键财务数据:收入、EBITDA、利润率、每股收益、自由现金流 + 估值(市值、企业价值、倍数)— 表格或图表,二者选一 |
| 4 | x=5.0, y=3.7, w=4.7, h=3.5 | 对于上市公司:1年股价图表 + 主要股东。对于非上市公司:近期动态或所有权/并购历史 |
| 元素 | 大小 | 备注 |
|---|---|---|
| 幻灯片标题 | 24磅 | 加粗,公司品牌颜色 |
| 象限标题 | 14磅 | 加粗,带强调条 |
| 正文/要点文本 | 11磅 | 常规粗细 |
| 表格文本 | 10磅 | 密集表格可使用9磅 |
| 图表标签 | 9磅 | 保持标签简短 |
| 来源/页脚文本 | 8磅 | 幻灯片底部 |
关键:如果文本溢出,将字体大小减小1磅并重新渲染。
每个象限标题左侧必须有一个彩色强调条:
// 为象限标题添加强调条
slide.addShape(pptx.shapes.RECTANGLE, {
x: 0.3, y: 0.6, w: 0.08, h: 0.25,
fill: { color: 'E31937' } // 使用公司品牌颜色
});
slide.addText('Company Overview', {
x: 0.45, y: 0.6, w: 4.5, h: 0.3, fontSize: 14, bold: true, fontFace: 'Arial'
});
需要包含的视觉元素:
对于多页简介:包含2-3个实际的 PptxGenJS 图表。切勿使用占位符 div 或静态图像。
对于单页简介:财务数据使用表格(空间效率更高)。仅当图表替代表格时才添加图表,而不是在表格之外额外添加。
| 数据类型 | 图表类型 |
|---|---|
| 收入趋势 | 折线图或柱状图(多年) |
| 地域细分 | 水平条形图 |
| 产品组合 | 带百分比的饼图 |
| 财务对比 | 柱状图 |
| 股价(1年日线) | 折线图 |
水平条形图(适配4:3幻灯片的右下象限):
slide.addChart(pptx.charts.BAR, [{
name: 'FY2024 Revenue by Region',
labels: ['North America', 'EMEA', 'China', 'APLA'],
values: [21.4, 13.6, 7.6, 6.7]
}], {
x: 5.0, y: 4.1, w: 4.5, h: 3.0, // 适配右下象限(4:3)
barDir: 'bar', chartColors: ['FF6B35'], showValue: true,
dataLabelFontSize: 10, catAxisLabelFontSize: 10, valAxisLabelFontSize: 10,
dataLabelFormatCode: '$#,##0.0B',
title: 'Revenue by Geography', titleFontSize: 12, titleBold: true
});
饼图(适配4:3幻灯片的右下象限):
slide.addChart(pptx.charts.PIE, [{
name: 'Product Mix',
labels: ['Footwear', 'Apparel', 'Equipment'],
values: [68, 29, 3]
}], {
x: 5.0, y: 4.1, w: 4.5, h: 3.0, // 适配右下象限(4:3)
showPercent: true, showLegend: true, legendPos: 'r',
dataLabelFontSize: 10, legendFontSize: 10,
chartColors: ['FF6B35', '2C2C2C', '4A4A4A'],
title: 'Revenue Mix FY24', titleFontSize: 12, titleBold: true
});
折线图(后续幻灯片全宽使用):
slide.addChart(pptx.charts.LINE, [{
name: 'Revenue ($B)',
labels: ['FY21', 'FY22', 'FY23', 'FY24', 'FY25E'],
values: [44.5, 46.7, 48.5, 51.4, 54.2]
}], {
x: 0.3, y: 1.2, w: 9.4, h: 5.5, // 4:3幻灯片全宽
chartColors: ['FF6B35'], showValue: true, lineSmooth: true,
dataLabelFontSize: 11, catAxisLabelFontSize: 11, valAxisLabelFontSize: 11,
title: 'Revenue Trend & Forecast', titleFontSize: 14, titleBold: true
});
始终使用原生的 PptxGenJS 表格或图表 - 切勿使用纯文本段落或 HTML 表格。
使用 slide.addTable() 处理财务数据(适配4:3幻灯片的左下象限):
// 首先添加带强调条的标题
slide.addShape(pptx.shapes.RECTANGLE, {
x: 0.3, y: 3.7, w: 0.08, h: 0.25, fill: { color: 'E31937' }
});
slide.addText('Key Financials & Valuation', {
x: 0.45, y: 3.7, w: 4.5, h: 0.3, fontSize: 14, bold: true, fontFace: 'Arial'
});
// 财务数据表格
slide.addTable([
[{ text: 'Metric', options: { bold: true, fill: '003366', color: 'FFFFFF' } },
{ text: 'FY24', options: { bold: true, fill: '003366', color: 'FFFFFF' } },
{ text: 'FY25E', options: { bold: true, fill: '003366', color: 'FFFFFF' } }],
['Revenue', '$51.4B', '$54.2B'],
['YoY Growth', '+6.0%', '+5.5%'],
['EBITDA', '$8.9B', '$9.5B'],
['EBITDA Margin', '17.3%', '17.5%'],
['EPS', '$3.42', '$3.75'],
['Market Cap', '$185B', '—'],
['EV/EBITDA', '12.5x', '11.7x']
], {
x: 0.45, y: 4.1, w: 4.3, h: 3.0, // 左下象限标题下方
fontFace: 'Arial', fontSize: 10,
border: { pt: 0.5, color: 'CCCCCC' },
valign: 'middle',
colW: [1.8, 1.25, 1.25] // 列宽
});
❌ 错误: 纯文本如 注:FY2024收入增长+1.0%,净利润51亿美元... ❌ 错误: 无法正确转换为 PowerPoint 的 HTML 表格
对于预测,在结构化表格中使用熊市/基准/牛市情景。
注意: 关于 PowerPoint 文件创建,请参考 PPTX 技能。
每周安装数
143
仓库
GitHub 星标
6.8K
首次出现
2026年2月25日
安全审计
安装于
opencode133
gemini-cli132
codex132
cursor132
kimi-cli131
amp131
Data Sources:
Required Metrics:
Normalization:
Before Building:
CRITICAL: You MUST create ONE slide at a time and get user approval before proceeding to the next slide.
For EACH slide:
Create ONLY this one slide with PptxGenJS
MANDATORY: Convert to image for review - You MUST convert slides to images so you can visually verify them:
soffice --headless --convert-to pdf presentation.pptx
pdftoppm -jpeg -r 150 -f 1 -l 1 presentation.pdf slide
MANDATORY VISUAL REVIEW : You MUST carefully examine the rendered slide image before proceeding:
If ANY overlap or cutoff is detected : Fix immediately using these strategies in order:
Show slide image to user with download link
YOU MUST CHECK FOR THESE SPECIFIC ISSUES ON EVERY PAGE:
The #1 goal is MAXIMUM information density. A busy executive should understand the entire company story in 30 seconds. Fill every quadrant to capacity.
Per quadrant targets:
Information packing techniques:
If a quadrant looks sparse, add more:
Line spacing - use single textbox per section:
def add_section(slide, x, y, w, header_text, bullets, header_size=10, bullet_size=8):
"""Header + bullets in single textbox with natural spacing"""
tb = slide.shapes.add_textbox(x, y, w, Inches(len(bullets) * 0.18 + 0.3))
tf = tb.text_frame
tf.word_wrap = True
# Header paragraph
p = tf.paragraphs[0]
p.text = header_text
p.font.bold = True
p.font.size = Pt(header_size)
p.font.color.rgb = RGBColor(0, 51, 102)
p.space_after = Pt(6) # Small gap after header
# Bullet paragraphs
for bullet in bullets:
p = tf.add_paragraph()
p.text = bullet
p.font.size = Pt(bullet_size)
p.space_after = Pt(3)
return tb
Key spacing principles:
space_after = Pt(6) after header, Pt(3) between bullets3-4 dense slides - use quadrants, columns, tables, charts
Bullets for ALL body text - NEVER paragraphs. Use ONE textbox per section with all bullets inside - do NOT create separate textboxes for each bullet point. Use PptxGenJS bullet formatting:
// CORRECT: Single textbox with bullet list - each array item becomes a bullet
// Position in top-left quadrant (Company Overview) - after header with accent bar
slide.addText(
[
{ text: 'Headquarters: Austin, Texas; Founded 2003', options: { bullet: { indent: 10 }, breakLine: true } },
{ text: 'Employees: 140,000+ globally across 6 continents', options: { bullet: { indent: 10 }, breakLine: true } },
{ text: 'CEO: Elon Musk; CFO: Vaibhav Taneja', options: { bullet: { indent: 10 }, breakLine: true } },
{ text: 'Market Cap: $850B (#6 globally by market cap)', options: { bullet: { indent: 10 }, breakLine: true } },
{ text: 'Segments: Automotive (85%), Energy (10%), Services (5%)', options: { bullet: { indent: 10 } } }
],
{ x: 0.45, y: 0.95, w: 4.5, h: 2.6, fontSize: 11, fontFace: 'Arial', valign: 'top', paraSpaceAfter: 6 }
);
// WRONG: Multiple separate textboxes for each bullet - causes alignment issues
// slide.addText('Headquarters: Austin', { x: 0.5, y: 1.0, bullet: true });
Bullet formatting tips:
* `bullet: { indent: 10 }` \- controls bullet indentation (smaller = tighter)
* `paraSpaceAfter: 6` \- space after each paragraph in points
* Pack multiple related facts into each bullet (e.g., "HQ: Austin; Founded: 2003")
* Include specific numbers and percentages for information density
Title case for titles (not ALL CAPS), left-aligned
Consistent fonts everywhere including tables
Company's brand colors - YOU MUST research actual brand colors via web search before creating slides. Do not guess or assume colors.
Follow brand guidelines if provided
See examples/Nike_Strip_Profile_Example.pptx for layout inspiration. Adapt colors to each company's brand.
Must pass "30-second comprehension test" for a busy executive.
Use 4:3 aspect ratio (standard IB pitch book format):
const pptx = new pptxgen();
pptx.layout = 'LAYOUT_4x3'; // 10" wide × 7.5" tall - MUST USE THIS
PptxGenJS uses inches. 4:3 slide = 10" wide × 7.5" tall.
┌─────────────────────────────────────────────────────────────────┐
│ y=0.2 Title: Company Name (Ticker) │
├────────────────────────────┬────────────────────────────────────┤
│ y=0.6 Company Overview │ y=0.6 Business & Positioning │
│ x=0.3, w=4.7 │ x=5.0, w=4.7 │
│ h=3.0 │ h=3.0 │
├────────────────────────────┼────────────────────────────────────┤
│ y=3.7 Key Financials │ y=3.7 Stock/Recent Developments │
│ x=0.3, w=4.7 │ x=5.0, w=4.7 │
│ h=3.5 │ h=3.5 │
└────────────────────────────┴────────────────────────────────────┘
y=7.5
Company Name (Ticker) - Example: Tesla, Inc. (TSLA)
slide.addText('Tesla, Inc. (TSLA)', { x: 0.3, y: 0.2, w: 9.4, h: 0.35, fontSize: 18, bold: true });
| Quadrant | Position | Content |
|---|---|---|
| 1 | x=0.3, y=0.6, w=4.7, h=3.0 | Company Overview : HQ, founded, key stats, business summary (4-5 bullets) |
| 2 | x=5.0, y=0.6, w=4.7, h=3.0 | Business & Positioning: revenue drivers, products/services, competitive position, growth drivers (4-5 bullets) |
| 3 | x=0.3, y=3.7, w=4.7, h=3.5 | Key Financials : Revenue, EBITDA, margins, EPS, FCF + Valuation (Mkt Cap, EV, multiples) — table OR chart, not both |
| 4 | x=5.0, y=3.7, w=4.7, h=3.5 | For public companies : 1Y stock price chart + top shareholders. For private : Recent developments or Ownership/M&A history |
| Element | Size | Notes |
|---|---|---|
| Slide title | 24pt | Bold, company brand color |
| Quadrant headers | 14pt | Bold, with accent bar |
| Body/bullet text | 11pt | Regular weight |
| Table text | 10pt | Use 9pt for dense tables |
| Chart labels | 9pt | Keep labels short |
| Source/footer | 8pt | Bottom of slide |
CRITICAL: If text overflows, REDUCE font size by 1pt and re-render.
Each quadrant header MUST have a colored accent bar to the left:
// Add accent bar for quadrant header
slide.addShape(pptx.shapes.RECTANGLE, {
x: 0.3, y: 0.6, w: 0.08, h: 0.25,
fill: { color: 'E31937' } // Use company brand color
});
slide.addText('Company Overview', {
x: 0.45, y: 0.6, w: 4.5, h: 0.3, fontSize: 14, bold: true, fontFace: 'Arial'
});
Visual elements to include:
For multi-slide profiles : Include 2-3 actual PptxGenJS charts. Never use placeholder divs or static images.
For single-slide profiles : Use tables for financials (more space-efficient). Only add a chart if it replaces the table, not in addition to it.
| Data Type | Chart Type |
|---|---|
| Revenue trends | Line or column (multi-year) |
| Geographic breakdown | Horizontal bar |
| Product mix | Pie with percentages |
| Financial comparison | Column |
| Stock price (1Y daily) | Line |
Horizontal Bar (fits in bottom-right quadrant for 4:3 slide):
slide.addChart(pptx.charts.BAR, [{
name: 'FY2024 Revenue by Region',
labels: ['North America', 'EMEA', 'China', 'APLA'],
values: [21.4, 13.6, 7.6, 6.7]
}], {
x: 5.0, y: 4.1, w: 4.5, h: 3.0, // Fits in bottom-right quadrant (4:3)
barDir: 'bar', chartColors: ['FF6B35'], showValue: true,
dataLabelFontSize: 10, catAxisLabelFontSize: 10, valAxisLabelFontSize: 10,
dataLabelFormatCode: '$#,##0.0B',
title: 'Revenue by Geography', titleFontSize: 12, titleBold: true
});
Pie Chart (fits in bottom-right quadrant for 4:3 slide):
slide.addChart(pptx.charts.PIE, [{
name: 'Product Mix',
labels: ['Footwear', 'Apparel', 'Equipment'],
values: [68, 29, 3]
}], {
x: 5.0, y: 4.1, w: 4.5, h: 3.0, // Fits in bottom-right quadrant (4:3)
showPercent: true, showLegend: true, legendPos: 'r',
dataLabelFontSize: 10, legendFontSize: 10,
chartColors: ['FF6B35', '2C2C2C', '4A4A4A'],
title: 'Revenue Mix FY24', titleFontSize: 12, titleBold: true
});
Line Chart (full width for subsequent slides):
slide.addChart(pptx.charts.LINE, [{
name: 'Revenue ($B)',
labels: ['FY21', 'FY22', 'FY23', 'FY24', 'FY25E'],
values: [44.5, 46.7, 48.5, 51.4, 54.2]
}], {
x: 0.3, y: 1.2, w: 9.4, h: 5.5, // Full width for 4:3 slide
chartColors: ['FF6B35'], showValue: true, lineSmooth: true,
dataLabelFontSize: 11, catAxisLabelFontSize: 11, valAxisLabelFontSize: 11,
title: 'Revenue Trend & Forecast', titleFontSize: 14, titleBold: true
});
Always use native PptxGenJS tables or charts - NEVER plain text prose or HTML tables.
Use slide.addTable() for financial data (fits in bottom-left quadrant for 4:3 slide):
// Add header with accent bar first
slide.addShape(pptx.shapes.RECTANGLE, {
x: 0.3, y: 3.7, w: 0.08, h: 0.25, fill: { color: 'E31937' }
});
slide.addText('Key Financials & Valuation', {
x: 0.45, y: 3.7, w: 4.5, h: 0.3, fontSize: 14, bold: true, fontFace: 'Arial'
});
// Financial data table
slide.addTable([
[{ text: 'Metric', options: { bold: true, fill: '003366', color: 'FFFFFF' } },
{ text: 'FY24', options: { bold: true, fill: '003366', color: 'FFFFFF' } },
{ text: 'FY25E', options: { bold: true, fill: '003366', color: 'FFFFFF' } }],
['Revenue', '$51.4B', '$54.2B'],
['YoY Growth', '+6.0%', '+5.5%'],
['EBITDA', '$8.9B', '$9.5B'],
['EBITDA Margin', '17.3%', '17.5%'],
['EPS', '$3.42', '$3.75'],
['Market Cap', '$185B', '—'],
['EV/EBITDA', '12.5x', '11.7x']
], {
x: 0.45, y: 4.1, w: 4.3, h: 3.0, // Below header in bottom-left quadrant
fontFace: 'Arial', fontSize: 10,
border: { pt: 0.5, color: 'CCCCCC' },
valign: 'middle',
colW: [1.8, 1.25, 1.25] // Column widths
});
❌ Incorrect: Plain text like Note: FY2024 revenue growth +1.0%, Net Income $5.1B... ❌ Incorrect: HTML tables that don't convert properly to PowerPoint
For projections, use Bear/Base/Bull case scenarios in structured tables.
Note: Reference the PPTX skill for PowerPoint file creation.
Weekly Installs
143
Repository
GitHub Stars
6.8K
First Seen
Feb 25, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
opencode133
gemini-cli132
codex132
cursor132
kimi-cli131
amp131
Python PDF处理教程:合并拆分、提取文本表格、创建PDF文件
61,100 周安装
STOP and wait for explicit user approval before creating the next slide. Do NOT proceed until user confirms.